我有一个简单的脚本,读取用户的input(密码),并将其保存到一个variables
read -s -p "password: " PASSWD; printf "%b" "\n"
显然这是不安全的,因为它存储在一个明确的文字内存,它可以通过核心转储访问它? 我如何从内存中读取这个variables。 请注意,我不是在寻找一个更好的解决scheme,我只是好奇,如果我真的可以读取这个密码/variables。
root可以随时(总是几乎所有的值)读取进程内存,这样就可以提取出来,不pipe它是如何存储的(即使密码被发送到安全存储设备如智能卡, iButton或TPM硬件)。
在你的例子中,PASSWD将被存储在一个局部variables中。 过程的环境variables存储在/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
注意:一些发行版使得Yama的ptrace_scope
限制可以防止连接到同一用户拥有的任意进程。
注意:通过命令行传递密码最为谨慎。 没有什么应该作为一个整个世界不可能知道的论点。 命令行不受保护。
在实现存储器保护的操作系统下访问另一个进程的内存区域并不容易。
如果你怀疑另一个进程/用户会尝试这个,你可以使用这个variables,然后立即清空它。 如果在你的情况下工作,你也可以尝试存储散列的密码副本。
一种方式,或者另一种方式,密码将不得不留在内存中,以供您使用(您可以将一些AES密码存储在CPU中,我忘记了该技术是如何调用的,否则,无论是在内存中,还是提示用户每次重新input并擦除)。
如果你想转储你的整个内存,你可以使用memdump ,但注意,因为写入到磁盘也使用内存,所以你可能会覆盖它,然后转储该部分:)(当然,如果您的脚本/程序仍然在运行,那部分内存是stil'used'的,所以不会被覆盖)
然后,您可以尝试为转码input密码,并且将会在那里(可能多于一次)。 找出存储密码的地方(以及它是什么),如果你不知道密码的话,那将是一件非常困难的事情。
您也可以尝试阅读这个页面 – 目前页面似乎已经closures,但Google仍然保存了该页面。