Upgrade
辨識正在使用我剛剛替換的舊版本庫的正在執行的程序
在安裝更新以解決CVE-2014-0160(OpenSSL Heartbleed錯誤)之後,我必須小心重新啟動任何可能使用 libssl 的服務——許多服務,例如 Apache 和我的 VPN 軟體,仍然載入了舊的易受攻擊的 libssl up,我的包管理器沒有嘗試糾正這個問題。
這讓我想到:更新共享庫後,如何可靠地找出目前正在執行的程序連結了舊版本的庫?我確信必須有一種方法可以在連結器級別或文件描述符級別詢問正在執行的程序,以確定它們已載入的給定共享庫的實例是否與目前在磁碟上的相同。
我找到了兩種方法來做到這一點:
- 特定於 Debian,列出了程序持有的大多數已刪除/替換的文件(某些已知是臨時文件除外,例如 中
/tmp
的東西):debian-goodies
包包含checkrestart
,它完成了我所描述的內容,方法是抓取lsof
to find的輸出打開磁碟上已消失或替換的文件。它辨識有問題的程序和(如果可能的話)它們所屬的包以及可用於重新啟動它們的任何初始化腳本。該-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