交換したばかりのライブラリの以前のバージョンを使用している実行中のプログラムを識別します。

交換したばかりのライブラリの以前のバージョンを使用している実行中のプログラムを識別します。

アップデートのインストール後に解決しましたCVE-2014-0160(オープンSSL厳しい努力バグ)、libsslを使用できるすべてのものを再起動するときは注意が必要でした。 ApacheやVPNソフトウェアなどの多くのサービスにはまだ古い脆弱なlibsslがロードされており、パッケージマネージャは問題を解決しようとしませんでした。

これが考えられました。共有ライブラリを更新した後、現在実行中のプログラムが以前のバージョンのライブラリにリンクされていることを確実に確認できますか?ロードしている特定の共有ライブラリのインスタンスが現在ディスク上の同じインスタンスであることを確認するために、リンカレベルまたはファイル記述子レベルで実行されているプロセスを調査する方法が必要であることを確認してください。

答え1

これを行う2つの方法が見つかりました。

  1. Debian のみ、プロセスで最も削除/置換されたファイルを一覧表示します。(にあるように一時的なものとして知られているいくつかのファイルを除く/tmp):このdebian-goodiesパッケージは、ディスクから消えたり交換された開いたファイルを見つけるcheckrestartために出力を取得し、オプションは関連ファイルを識別します。lsof-v
  2. 通常、手動では、気になるファイルを指定できます。出力を表示し、lsof削除または置き換えられたファイルへの開かれたファイルハンドルを識別できます。出力では、これらのファイルはlsof -nnP4番目の列でとして識別されるように見えます。特定のライブラリ(この場合はOpenSSL)の古いハンドルを見つけるなどの操作をDEL実行できます。lsof -nnP | grep DEL.*libssl.soこれは、使用している特定のバージョンの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
    

答え2

Linuxでの迅速で汚い方法(ありがとう ラーケンシュタイン):

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

関連情報