root总是可以(几乎所有的值总是)读取进程内存,因此无论它是如何存储的,都可以提取它(即使密码被发送到安全的存储设备,如智能卡,总会有一个小窗口,iButton或TPM硬件).
在您的示例中,PASSWD将存储在本地变量中.进程的环境变量存储在/ proc / PID / environ中,可由该用户或root读取:
[choad ~]$read -s -p "password: " PASSWD; echo
password:
[choad ~]$echo $PASSWD
soopersekrit
[choad ~]$ls -al /proc/self/environ
-r-------- 1 michael michael 0 May 6 14:46 /proc/self/environ
[choad ~]$grep PASSWD /proc/self/environ
[choad ~]$export PASSWD
[choad ~]$tr '\000' '\n' < /proc/self/environ | grep PASSWD
PASSWD=soopersekrit
[choad ~]$echo $$
19613
[choad ~]$gdb -p 19613
(gdb) info proc mappings
0x91f2000 0x9540000 0x34e000 0 [heap]
(gdb) dump memory /tmp/bash.mem 0x91f2000 0x9540000
[choat ~]$strings /tmp/bash.mem |grep ^PASSWD
PASSWD=soopersekrit
PASSWD=soopersekrit
N.B.:某些发行版启用了Yama的ptrace_scope限制,这些限制会阻止附加到同一用户拥有的任意进程.
N.B.:最谨慎的是通过命令行传递密码.没有什么可以作为全世界都无法知道的论点.命令行不受保护.