导出包含密码的变量然后重置它是否安全?

Hey*_*Hey 2 security bash shell-script environment-variables

我的脚本需要多次调用需要密码的程序,该密码只能作为环境变量传递。因为我只想向用户询问密码一次,所以我这样做了:

read -s PASSPHRASE
export PASSPHRASE
program some_option
program some_other_option
program yet_another_option
PASSPHRASE=""
Run Code Online (Sandbox Code Playgroud)

据我了解,PASSPHRASE变量的内容只能由当前 shell 访问,并且program在三个调用期间,然后变量被重置,其他任何人都无法访问密码。

我是对的,还是我做错了?

我担心系统上的其他用户(不包括root)以及在我的用户帐户上运行的其他程序。

Nei*_*gan 5

定义“安全”

  1. Root 总是可以读取所有内容,因此对于 root 来说没有什么是安全的
  2. 用户 U 的环境变量对其他用户是安全的
  3. 用户 U 和程序 P 的环境变量不受用户 U 运行的程序 Q 的影响

因此,root 可以在短时间内读取该 env var,并且同一用户运行的其他程序可以在短时间内读取该 env var

解决方案:

  1. 自己的根,或信任根
  2. 不要用同一用户运行其他程序
  3. 以自己的用户身份运行这些程序

如果您不想导出 env var,您可以像这样调用您的命令:

$PASSPHRASE command-name -option
Run Code Online (Sandbox Code Playgroud)

可能会让事情更安全一些,但是由同一用户运行的其他程序仍然可能会通过一些技巧(ktrace/strace,调试)看到它们

  • 或者在 Linux 上,因为它们在同一用户下运行,通过检查 `/proc/<pid>/environ`(对于 `program` 的 PID,而不是 shell)。 (3认同)