如果我使用密码作为命令行参数,则使用ps
在系统上公开。
但是,如果我在一个bash shell脚本中,并且执行如下操作:
... { somecommand -p mypassword } ...
这是否仍然会显示在进程列表中? 或者这是安全的?
命令行将始终可见(如果只通过/ proc)。
所以唯一真正的解决办法是:不要。 你可以用stdin或专用的fd来提供它:
./my_secured_process some parameters 3<<< "b@dP2ssword"
用一个脚本(简单的第一个)
#!/bin/bash cat 0<&3
(这个示例只是将一个错误的密码转储到标准输出)
现在你需要关心的是:
被调用的程序可以通过像这样覆盖argv
来改变它的命令行:
#include <stdlib.h> #include <string.h> int main(int argc, char** argv) { int arglen = argv[argc-1]+strlen(argv[argc-1])+1 - argv[0]; memset(argv[0], arglen, 0); strncpy(argv[0], "secret-program", arglen-1); sleep(100); }
测试:
$ ./a.out mySuperPassword & $ ps -f UID PID PPID C STIME TTY TIME CMD me 20398 18872 0 11:26 pts/3 00:00:00 bash me 20633 20398 0 11:34 pts/3 00:00:00 secret-program me 20645 20398 0 11:34 pts/3 00:00:00 ps -f $
UPD:我知道,它不是完全安全的,可能会导致竞争条件,但是很多从命令行接受密码的程序都会这样做。
如何使用文件描述符方法:
env -i bash --norc # clean up environment set +o history read -s -p "Enter your password: " passwd exec 3<<<"$passwd" mycommand <&3 # cat /dev/stdin in mycommand
看到:
在Unix上隐藏命令行参数的秘密
从进程列表中退出的唯一方法是如果您重新实现了要在纯Bash函数中调用的程序的全部功能。 函数调用不是独立的进程。 但通常这是不可行的。