Identifizieren laufender Programme, die die alte Version einer Bibliothek verwenden, die ich gerade ersetzt habe

9

Nachdem ich Updates installiert hatte, um CVE-2014-0160 (den OpenSSL Heartbleed- Fehler) zu beheben , musste ich darauf achten, alles neu zu starten, was möglicherweise libssl verwendet - viele Dienste wie Apache und meine VPN-Software hatten immer noch das alte anfällige libssl geladen und mein Paketmanager machte keinen Versuch, dies zu korrigieren.

Dies brachte mich zum Nachdenken: Wie kann ich nach dem Aktualisieren einer gemeinsam genutzten Bibliothek zuverlässig herausfinden, in welchen laufenden Programmen derzeit eine alte Version der Bibliothek verlinkt ist? Ich bin sicher, dass es eine Möglichkeit geben muss, laufende Prozesse entweder auf Linker- oder auf Dateideskriptorebene abzufragen, um festzustellen, ob die Instanz einer bestimmten gemeinsam genutzten Bibliothek, die sie geladen haben, mit der aktuell auf der Festplatte befindlichen identisch ist.

tgies
quelle

Antworten:

9

Ich habe zwei Möglichkeiten gefunden, dies zu tun:

  1. Debian-spezifisch, listet die meisten gelöschten / ersetzten Dateien auf, die von Prozessen gehalten werden (mit Ausnahme bestimmter Dateien, von denen bekannt ist, dass sie vorübergehend sind, z. B. Dinge in /tmp): Das debian-goodiesPaket enthält checkrestartetwas, das so etwas wie das erreicht, was ich beschrieben habe, indem ich die Ausgabe von lsofzu suchen Öffnen Sie Dateien, die auf der Festplatte verschwunden sind oder ersetzt wurden. Es identifiziert die fraglichen Prozesse und (wenn möglich) das Paket, zu dem sie gehören, sowie alle Init-Skripte, mit denen sie neu gestartet werden können. Die -vOption identifiziert die betroffenen Dateien.
  2. Generisch, manuell, ermöglicht die Angabe der Datei, um die Sie sich Sorgen machen: Sie können die Ausgabe von lsofüberprüfen, um offene Dateihandles für gelöschte oder ersetzte Dateien zu identifizieren. In der Ausgabe von lsof -nnPscheint eine solche Datei DELin der vierten Spalte durch gekennzeichnet zu sein. Sie können beispielsweise lsof -nnP | grep DEL.*libssl.sonach veralteten Handles für eine bestimmte Bibliothek suchen (in diesem Fall OpenSSL). Dies hängt wahrscheinlich stark von der spezifischen Version von lsof ab, die Sie verwenden, und vom Verhalten Ihres Paketmanagers. Gehen Sie daher vorsichtig vor.

    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
    
tgies
quelle
3

Ein schneller und schmutziger Weg unter Linux ( dank Lekensteyn ):

grep '/usr/lib/libssl1.*(deleted)' /proc/*/maps

Für eine präzise Analyse können Sie lsofmit der -FOption aufrufen , um eine analysierbare Ausgabe zu erhalten. Fügen Sie das fFeld zum Filtern nach gelöschten Dateien ( fDEL) und das nFeld zum Abrufen des Pfads zur Datei ein. Beachten Sie, dass das folgende Snippet Dateinamen enthält, die Zeilenumbrüche enthalten.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Gilles 'SO - hör auf böse zu sein'
quelle