置き換えたばかりのライブラリの古いバージョンを使用している実行中のプログラムを特定する


9

CVE-2014-0160(OpenSSL Heartbleedバグ)に対処するためのアップデートをインストールした後、libsslを使用している可能性のあるものを再起動するように注意する必要がありました-Apacheや私のVPNソフトウェアなどの多くのサービスには、古い脆弱なlibsslがまだロードされていますアップ、そして私のパッケージマネージャーはこれを修正しようとしませんでした。

これは私に考えさせられました:共有ライブラリを更新した後、どのバージョンの実行中のプログラムが現在ライブラリの古いバージョンにリンクされているかを確実に見つけるにはどうすればよいですか?実行中のプロセスにリンカーレベルまたはファイル記述子レベルで問い合わせて、ロードした特定の共有ライブラリのインスタンスが現在ディスク上にあるインスタンスと同じであるかどうかを確認する方法が必要だと思います。

回答:


9

私はこれを行う2つの方法を見つけました:

  1. Debian固有の、リストのほとんど削除/プロセスが保持している置き換えられたファイル(過渡、例えばものであることが知られている特定のファイルを除いて/tmp):debian-goodiesパッケージに含まれているがcheckrestart、私はの出力を削って説明してきたもののようなもの達成し、lsof見つけることをディスク上で削除または置換されたファイルを開きます。問題のプロセスと、(可能であれば)プロセスが属しているパッケージ、およびそれらを再起動するために使用できるinitスクリプトを識別します。-vオプションは、当該ファイルを識別します。
  2. 汎用、手動、心配するファイルを指定できますの出力を見て、lsof削除または置換されたファイルへの開いているファイルハンドルを特定できます。の出力ではlsof -nnP、このようなファイルDELは4番目の列でによって識別されているようです。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
    

3

Linuxでの迅速で汚れた方法(Lekensteynのおかげ ):

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}
'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.