命令行参数的Shell脚本密码安全性

如果我使用密码作为命令行参数,则使用ps在系统上公开。

但是,如果我在一个bash shell脚本中,并且执行如下操作:

 ... { somecommand -p mypassword } ... 

这是否仍然会显示在进程列表中? 或者这是安全的?

  • 子stream程如何:(…)? 不安全的权利?
  • 共处理?

命令行将始终可见(如果只通过/ proc)。

所以唯一真正的解决办法是:不要。 你可以用stdin或专用的fd来提供它:

 ./my_secured_process some parameters 3<<< "b@dP2ssword" 

用一个脚本(简单的第一个)

 #!/bin/bash cat 0<&3 

(这个示例只是将一个错误的密码转储到标准输出)

现在你需要关心的是:

  • MITM(欺骗脚本,甩掉密码,例如通过颠覆PATH)
  • 在命令行中保留密码的bash历史记录(例如,查看HISTIGNORE的bash)
  • 包含密码重定向的脚本的安全性
  • 使用的tty的安全; 键盘记录器; …正如你所看到的,我们现在已经下降到“一般安全原则”

被调用的程序可以通过像这样覆盖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函数中调用的程序的全部功能。 函数调用不是独立的进程。 但通常这是不可行的。