Identification des programmes en cours d'exécution qui utilisent l'ancienne version d'une bibliothèque que je viens de remplacer

9

Après avoir installé des mises à jour pour résoudre CVE-2014-0160 (le bogue OpenSSL Heartbleed ), j'ai dû prendre soin de redémarrer tout ce qui pourrait utiliser libssl - de nombreux services, tels qu'Apache et mon logiciel VPN, avaient toujours l'ancien libssl vulnérable chargé et mon gestionnaire de paquets n'a fait aucune tentative pour y remédier.

Cela m'a fait réfléchir: après avoir mis à jour une bibliothèque partagée, comment puis-je savoir de manière fiable quels programmes en cours d'exécution ont actuellement une ancienne version de la bibliothèque liée? Je suis sûr qu'il doit y avoir un moyen d'interroger les processus en cours au niveau de l'éditeur de liens ou au niveau des descripteurs de fichiers pour déterminer si l'instance d'une bibliothèque partagée donnée qu'ils ont chargée est la même que celle actuellement sur le disque.

tgies
la source

Réponses:

9

J'ai trouvé deux façons de procéder:

  1. Spécifique à Debian, répertorie la plupart des fichiers supprimés / remplacés conservés par des processus (à l'exception de certains fichiers connus pour être transitoires, par exemple des trucs dedans /tmp): le debian-goodiespaquet contient checkrestart, qui accomplit quelque chose comme ce que j'ai décrit en grattant la sortie de lsofpour trouver ouvrir les fichiers disparus ou remplacés sur le disque. Il identifie les processus en question et (si possible) le package auquel ils appartiennent et tout script d'initialisation qui peut être utilisé pour les redémarrer. L' -voption identifiera les fichiers concernés.
  2. Générique, manuel, permet de spécifier le fichier qui vous inquiète: vous pouvez regarder la sortie de lsofpour identifier les descripteurs de fichiers ouverts pour les fichiers supprimés ou remplacés. Dans la sortie de lsof -nnP, un tel fichier semble être identifié par DELdans la quatrième colonne. Vous pouvez faire quelque chose comme lsof -nnP | grep DEL.*libssl.sorechercher des poignées périmées dans une bibliothèque particulière (OpenSSL, dans ce cas). Cela dépend probablement fortement de la version spécifique de lsof que vous utilisez et du comportement de votre gestionnaire de paquets, alors soyez prudent.

    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
la source
3

Un moyen rapide et sale sur Linux ( grâce à Lekensteyn ):

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

Pour une analyse précise, vous pouvez appeler lsofavec l' -Foption pour obtenir une sortie analysable. Incluez le fchamp à filtrer sur les fichiers supprimés ( fDEL) et le nchamp pour obtenir le chemin d'accès au fichier. Notez que l'extrait de code ci-dessous s'étouffe avec les noms de fichiers contenant des sauts de ligne.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Gilles 'SO- arrête d'être méchant'
la source