奇淫巧技之程序启动后在进程列表中隐藏密码等关键信息

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

最近读了下mongodb的源码。

这个过程中,发现了一个很有意思的代码段,即程序启动后,如何在进程列表中隐藏敏感信息如密码的处理。

先说下使用场景:

mongodb支持服务端js脚本,所以我们写了一些服务端js脚本比如检查复制集状态之类。

这样,我们可以使用“mongo ip:port/dbname /path/test.js”这种方式来执行服务端js。

但是mongodb复制集初始化之后,我们又加了账号认证。在不登录的情况下,肯定是没法执行的。

所以最终命令变成了这个样子:

mongo ip:port/dbname -u user -p password /path/test.js

mongo在使用过程中,必然会在进程列表中打印上面的帐号密码。但是在使用过程中,我们看到,实际上mongo对应的进程列表中,密码字段是一堆的“x”。感觉很神奇,后面看了mongodb的源码之后才发现,原来这是mongo客户端入口处做了特殊的处理,属于一种“奇淫巧技”。

先直接上代码:

 

int _main(int argc, char* argv[], char** envp) {

    省略中间一些代码内容

    // hide password from ps output

    for (int i = 0; i < (argc - 1); ++i) {

        if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--password")) {

            char* arg = argv[i + 1];

            while (*arg) {

                *arg++ = 'x';

            }

        }

    }

 

二进制可执行程序,通常都可以接收外部参数,在入口处都会传一个argc表示命令行的参数个数,一个argv的参数列表数组(字符指针数组)传入具体的参数。

mongo在启动中,帐号密码字段就通过argv传给了程序。

因为参数列表数组的内容不是常量,可以修改。所以,mongo在检测到了到了如果参数列表中有密码字段(密码是通过-p password 或者—password password格式传入的,所以可以检查参数列表中有没有“-p”或者 “—password”),就把密码中每个字符修改为“x”。

这样,最终在进程列表中查询的时候,自然密码部分就是一堆的”x”了。

总结:本篇讲的在进程列表中隐藏密码关键信息的方式是修改main函数入参.

虽然mongo的这种处理方式很有创意,但是还是有失效时候。后面的文章我会再介绍,今天先写到这里。



本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/p/5428544.html,如需转载请自行联系原作者

目录
相关文章
|
12月前
|
关系型数据库 MySQL
MySQL查看连接数和进程信息
这篇文章介绍了如何在MySQL中查看连接数和进程信息,包括当前打开的连接数量、历史成功建立连接的次数、连接错误次数、连接超时设置,以及如何查看和终止正在执行的连接进程。
1493 10
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
1171 2
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
267 2
|
10月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
851 1
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
104 3
gdb中获取进程收到的最近一个信号的信息
gdb中获取进程收到的最近一个信号的信息
|
11月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
358 0
|
12月前
|
缓存 运维 NoSQL
使用 psutil 获取硬件、网络以及进程信息
使用 psutil 获取硬件、网络以及进程信息
194 0
查看进程的内存使用信息
查看进程的内存使用信息
|
6月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。