识别正在使用我刚刚替换的旧版本库的正在运行的程序

识别正在使用我刚刚替换的旧版本库的正在运行的程序

安装更新后解决CVE-2014-0160(OpenSSL心血bug),我必须小心地重新启动任何可能使用 libssl 的东西——许多服务,例如 Apache 和我的 VPN 软件,仍然加载了旧的易受攻击的 libssl,并且我的包管理器没有尝试纠正这个问题。

这让我思考:更新共享库后,如何可靠地找出哪些正在运行的程序当前链接了旧版本的库?我确信必须有一种方法可以在链接器级别或文件描述符级别询问正在运行的进程,以确定它们加载的给定共享库的实例是否与当前磁盘上的实例相同。

答案1

我找到了两种方法来做到这一点:

  1. 特定于 Debian,列出进程持有的最多删除/替换的文件(除了某些已知是瞬态的文件,例如 中的内容/tmp):该debian-goodies包包含checkrestart,它通过抓取 的输出来lsof查找磁盘上已消失或被替换的打开文件来完成与我所描述的类似的操作。它标识有问题的进程以及(如果可能)它们所属的包以及可用于重新启动它们的任何初始化脚本。该-v选项将识别相关文件。
  2. 通用、手动,允许指定您担心的文件:您可以查看 的输出来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
    

答案2

Linux 上的一种快速而肮脏的方法(谢谢 莱肯斯坦):

grep '/usr/lib/libssl1.*(deleted)' /proc/*/maps

为了精确解析,您可以lsof使用-F选项来调用以获得可解析的输出。包括f用于过滤已删除文件的字段 ( fDEL) 和n用于获取文件路径的字段。请注意,下面的代码片段因包含换行符的文件名而阻塞。

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'

相关内容