从内存中读取变量

HTF*_*HTF 3 linux bash

我有一个简单的脚本来读取用户的输入(密码)并将其保存到一个变量

read -s -p "password: " PASSWD; printf "%b" "\n" 
Run Code Online (Sandbox Code Playgroud)

显然这不安全,因为它以明文形式存储在内存中,并且可以通过核心转储访问它?我如何从内存中读取这个变量。请注意,我不是在寻找更好的解决方案,我只是想知道我是否真的可以读取此密码/变量。

Mik*_*eyB 6

root 总是可以(对于 always 的几乎所有值)读取进程内存,因此无论它如何存储,都可以提取它(即使密码被发送到安全存储设备,如智能卡,也总是有一个小窗口, iButton 或 TPM 硬件)。

在您的示例中, PASSWD 将存储在局部变量中。进程的环境变量存储在/proc/PID/environ该用户或 root中并且可以被该用户或 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
Run Code Online (Sandbox Code Playgroud)

注意:某些发行版启用 Yama 的ptrace_scope限制,以防止附加到同一用户拥有的任意进程。

注意:要小心通过命令行传递密码。没有什么应该作为整个世界都不知道的参数传递。命令行不受保护。