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

最近读了下mongodb的源码。mongodb

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

先说下使用场景:ide

mongodb支持服务端js脚本,因此咱们写了一些服务端js脚本好比检查复制集状态之类。函数

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

可是mongodb复制集初始化以后,咱们又加了帐号认证。在不登陆的状况下,确定是无法执行的。命令行

因此最终命令变成了这个样子:指针

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

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

先直接上代码:ip

 

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的这种处理方式颇有创意,可是仍是有失效时候。后面的文章我会再介绍,今天先写到这里。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息