web-dev-qa-db-ja.com

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

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

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

9
tgies

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

  1. Debian固有、プロセスによって保持されているほとんどの削除/置換ファイルを一覧表示します(一時的であることがわかっている特定のファイル、たとえば/tmpのファイルを除く):debian-goodiesパッケージにはcheckrestartは、lsofの出力をスクレイピングして、ディスク上でなくなった、または置き換えられた開いているファイルを見つけることで、私が説明したようなことを実現します。問題のプロセスと、(可能であれば)それらが属するパッケージ、およびそれらを再起動するために使用できるinitスクリプトを識別します。 -vオプションは、関係するファイルを識別します。
  2. 汎用、手動、気になるファイルを指定できます: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
    
9
tgies

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}
'