Identificar los programas en ejecución que usan la versión anterior de una biblioteca que acabo de reemplazar

9

Después de instalar actualizaciones para abordar CVE-2014-0160 (el error OpenSSL Heartbleed ), tuve que tener cuidado de reiniciar cualquier cosa que pudiera estar usando libssl; muchos servicios, como Apache y mi software VPN, todavía tenían cargada la vieja y vulnerable libssl. arriba, y mi administrador de paquetes no hizo ningún intento de rectificar esto.

Esto me hizo pensar: después de actualizar una biblioteca compartida, ¿cómo puedo averiguar de manera confiable qué programas en ejecución tienen actualmente una versión antigua de la biblioteca vinculada? Estoy seguro de que debe haber una forma de interrogar los procesos en ejecución, ya sea en el nivel del vinculador o en el nivel de los descriptores de archivo para determinar si la instancia de una biblioteca compartida dada que han cargado es la misma que la que está actualmente en el disco.

tgies
fuente

Respuestas:

9

Encontré dos formas de hacer esto:

  1. Específico de Debian, enumera la mayoría de los archivos eliminados / reemplazados mantenidos por los procesos (con la excepción de ciertos archivos que se sabe que son transitorios, por ejemplo, cosas en /tmp): El debian-goodiespaquete contiene checkrestart, lo que logra algo como lo que he descrito raspando la salida de lsofencontrar abrir archivos que se han ido o reemplazado en el disco. Identifica los procesos en cuestión y (si es posible) el paquete al que pertenecen y cualquier script de inicio que pueda usarse para reiniciarlos. La -vopción identificará los archivos en cuestión.
  2. El manual, genérico, permite especificar el archivo que le preocupa: puede ver el resultado lsofpara identificar los identificadores de archivos abiertos para los archivos eliminados o reemplazados. En la salida de lsof -nnP, dicho archivo parece identificarse DELen la cuarta columna. Puede hacer algo como lsof -nnP | grep DEL.*libssl.sobuscar identificadores obsoletos en una biblioteca en particular (OpenSSL, en este caso). Esto probablemente depende en gran medida de la versión específica de lsof que use y del comportamiento de su administrador de paquetes, así que proceda con precaución.

    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
fuente
3

Una manera rápida y sucia en Linux ( gracias a Lekensteyn ):

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

Para un análisis preciso, puede llamar lsofcon la -Fopción de obtener una salida analizable. Incluya el fcampo para filtrar los archivos eliminados ( fDEL) y el ncampo para obtener la ruta al archivo. Tenga en cuenta que el fragmento a continuación se ahoga en los nombres de archivo que contienen nuevas líneas.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Gilles 'SO- deja de ser malvado'
fuente