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

tgi*_*ies 9 libraries upgrade dynamic-linking

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

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

tgi*_*ies 9

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

  1. 特定于 Debian 的,列出进程持有的大多数已删除/替换的文件(除了某些已知是瞬态的文件,例如 中的内容/tmp):该debian-goodies包包含checkrestart,它通过抓取lsofto find的输出来完成类似于我所描述的事情打开磁盘上消失或替换的文件。它标识有问题的进程和(如果可能)它们所属的包以及可用于重新启动它们的任何初始化脚本。该-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
    
    Run Code Online (Sandbox Code Playgroud)