アドレスに更新をインストールした後 CVE-2014-016 (OpenSSL Heartbleed バグ)、libsslを使用している可能性のあるものを再起動するように注意する必要がありました-などの多くのサービスApacheと私のVPNソフトウェアとして、まだ古い脆弱なlibsslがロードされていて、私のパッケージマネージャーはこれを修正しようとしませんでした。
これは私に考えさせられました:共有ライブラリを更新した後、どの実行中のプログラムに現在古いバージョンのライブラリがリンクされているかを確実に見つけるにはどうすればよいですか?実行中のプロセスをリンカーレベルまたはファイル記述子レベルで問い合わせて、ロードした特定の共有ライブラリのインスタンスが現在ディスク上にあるものと同じかどうかを判断する方法が必要だと確信しています。
私はこれを行う2つの方法を見つけました:
/tmp
のファイルを除く):debian-goodies
パッケージにはcheckrestart
は、lsof
の出力をスクレイピングして、ディスク上でなくなった、または置き換えられた開いているファイルを見つけることで、私が説明したようなことを実現します。問題のプロセスと、(可能であれば)それらが属するパッケージ、およびそれらを再起動するために使用できるinitスクリプトを識別します。 -v
オプションは、関係するファイルを識別します。汎用、手動、気になるファイルを指定できます:lsof
の出力を見て、削除または置換されたファイルに対する開いているファイルハンドルを特定できます。 lsof -nnP
の出力では、そのようなファイルは4番目の列の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
Linuxでの迅速で汚い方法( ありがとうLekensteyn ):
grep '/usr/lib/libssl1.*(deleted)' /proc/*/maps
正確に解析するには、-F
オプションを指定してlsof
を呼び出し、解析可能な出力を取得できます。削除されたファイルをフィルタリングするためのf
フィールド(fDEL
)と、ファイルへのパスを取得するためのn
フィールドを含めます。以下のスニペットは、改行を含むファイル名をチョークしていることに注意してください。
lsof -F pfn | awk '
/^p/ {pid=substr($0,2)}
/^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'