strace/dtrace/ltrace ... 对很多事情都有用,从查找隐藏的访问冲突到网络套接字跟踪,但可能无法看到全部。
我一直没能弄清楚如何使用 strace (当我试图回答另一个问题时它又出现了问题今天),其中 sudo 在系统内存中分配并保存纯文本密码。如果这对您来说是新闻,那么链接的问题是相关的。
我得到的最接近的结果是,有这样的痕迹(这可能是一个不好的例子,使用堆叠的 sudo;我尝试了一些方法):
$ sudo strace -ff -o mem sudo -s
Enter password...
如下行:
mem.14471:stat("/etc/profile.d/gnome-ssh-askpass.sh", {st_mode=S_IFREG|0644, st_size=70, ...}) = 0
mem.14471:access("/etc/profile.d/gnome-ssh-askpass.sh", R_OK) = 0
mem.14471:open("/etc/profile.d/gnome-ssh-askpass.sh", O_RDONLY) = 3
mem.14471:read(3, "SSH_ASKPASS=/usr/libexec/openssh"..., 70) = 70
我相信我尝试过单独跟踪它们,甚至用它自己的 strace 替换了 /usr/libexec/openssh-askpass 中的环境变量,但都无济于事。
我知道如何读取和解码 strace;我可以跟踪分配的句柄、返回代码和内存分配。我找不到一个在 sudo 处于活动状态时在内存中分配并保留 sudo 密码(最多 7 次)的 fork。密码驻留的证明是通过LiME 取证应用于CentOS。
或者,是否有更好的方法,比如迭代进程内存分配?
答案1
strace 不会显示任何如此具体的内容。你能得到的最接近的信息是glibc 用来获取全新内存区域的brk()
或调用。其余的mmap(MAP_ANONYMOUS)
不使用系统调用,只是直接内存访问。
你可以尝试ltrace
用于用户空间库调用。
或者直接在源代码中找到密码提示,看看结果如何。添加几个printf()
' 来显示内存地址。