Identificazione dei programmi in esecuzione che utilizzano la vecchia versione di una libreria che ho appena sostituito


9

Dopo aver installato gli aggiornamenti per affrontare CVE-2014-0160 (il bug Heartbleed di OpenSSL ), ho dovuto fare attenzione a riavviare tutto ciò che potrebbe utilizzare libssl - molti servizi, come Apache e il mio software VPN, avevano ancora il vecchio libssl vulnerabile caricato e il mio gestore di pacchetti non ha fatto alcun tentativo di correggere questo.

Questo mi ha fatto pensare: dopo aver aggiornato una libreria condivisa, come posso sapere con certezza a quali programmi in esecuzione è attualmente collegata una vecchia versione della libreria? Sono sicuro che ci deve essere un modo per interrogare i processi in esecuzione a livello di linker o a livello di descrittori di file per determinare se l'istanza di una determinata libreria condivisa che hanno caricato è la stessa di quella attualmente sul disco.

Risposte:


9

Ho trovato due modi per farlo:

  1. Specifico per Debian, elenca la maggior parte dei file cancellati / sostituiti trattenuti da processi (ad eccezione di alcuni file noti per essere transitori, ad esempio roba in /tmp): il debian-goodiespacchetto contiene checkrestart, che realizza qualcosa di simile a quello che ho descritto scagliando l'output di lsofper trovare aprire i file che sono andati o sostituiti sul disco. Identifica i processi in questione e (se possibile) il pacchetto a cui appartengono e qualsiasi script init che può essere utilizzato per riavviarli. L' -vopzione identificherà i file interessati.
  2. Generico, manuale, consente di specificare il file di cui ti preoccupi: puoi esaminare l'output di lsofidentificare gli handle di file aperti su file eliminati o sostituiti. Nell'output di lsof -nnP, tale file sembra essere identificato da DELnella quarta colonna. Puoi fare qualcosa come lsof -nnP | grep DEL.*libssl.socercare maniglie stantie in una particolare libreria (OpenSSL, in questo caso). Questo probabilmente dipende fortemente dalla versione specifica di lsof che usi e dal comportamento del gestore dei pacchetti, quindi procedi con cautela.

    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

Un modo rapido e sporco su Linux ( grazie a Lekensteyn ):

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

Per un'analisi precisa, è possibile chiamare lsofcon l' -Fopzione per ottenere output analizzabili. Includi il fcampo per filtrare i file eliminati ( fDEL) e il ncampo per ottenere il percorso del file. Tieni presente che lo snippet seguente si soffoca sui nomi dei file contenenti newline.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.