安装更新后解决CVE-2014-0160(OpenSSL心血bug),我必须小心地重新启动任何可能使用 libssl 的东西——许多服务,例如 Apache 和我的 VPN 软件,仍然加载了旧的易受攻击的 libssl,并且我的包管理器没有尝试纠正这个问题。
这让我思考:更新共享库后,如何可靠地找出哪些正在运行的程序当前链接了旧版本的库?我确信必须有一种方法可以在链接器级别或文件描述符级别询问正在运行的进程,以确定它们加载的给定共享库的实例是否与当前磁盘上的实例相同。
答案1
我找到了两种方法来做到这一点:
- 特定于 Debian,列出进程持有的最多删除/替换的文件(除了某些已知是瞬态的文件,例如 中的内容
/tmp
):该debian-goodies
包包含checkrestart
,它通过抓取 的输出来lsof
查找磁盘上已消失或被替换的打开文件来完成与我所描述的类似的操作。它标识有问题的进程以及(如果可能)它们所属的包以及可用于重新启动它们的任何初始化脚本。该-v
选项将识别相关文件。 通用、手动,允许指定您担心的文件:您可以查看 的输出来
lsof
识别已删除或替换的文件的打开文件句柄。在 的输出中,此类文件似乎由第四列中lsof -nnP
的 标识。DEL
您可以执行类似lsof -nnP | grep DEL.*libssl.so
查找特定库(在本例中为 OpenSSL)的陈旧句柄之类的操作。这可能高度依赖于您使用的 lsof 的特定版本以及包管理器的行为,因此请谨慎操作。pluto 3592 root DEL REG 202,0 98831 /lib/i386-linux-gnu/libssl.so.1.0.0 pluto 3604 root DEL REG 202,0 98831 /lib/i386-linux-gnu/libssl.so.1.0.0