lista las aplicaciones en ejecución que están vinculadas a una biblioteca comprometida

1

Es bastante común que surjan actualizaciones de seguridad para varias bibliotecas de sistemas en los servidores que administro (Linux, principalmente Debian y Ubuntu). Puedo ejecutar las actualizaciones con bastante facilidad, pero eso a menudo deja las aplicaciones en ejecución aún vinculadas a las versiones antiguas de las bibliotecas y potencialmente aún vulnerables.

¿Existe una manera de enumerar las aplicaciones en ejecución que están vinculadas a una biblioteca en particular (probablemente antes de ejecutar la actualización), o (mucho mejor) enumerar las aplicaciones que están vinculadas en contra de los archivos de la biblioteca que ya no están vinculados en el sistema de archivos? (Ejecutar después de la actualización)

Sería útil tener algo que pudiera ejecutar antes de las actualizaciones, pero eso no parece encajar en un flujo de trabajo de mantenimiento del sistema con tanta facilidad, y sería fácil no hacerlo de manera consistente. Creo que sería mejor verificar regularmente si los ejecutables están vinculados a las bibliotecas que ya no están presentes en el sistema. Tal vez eso se pueda sacar de /proc de alguna manera?

[Para más o menos un millón de puntos extra, proporcione una solución que también encuentre este tipo de situaciones para procesos que se ejecutan dentro de contenedores, virtualenv, etc.]

    
pregunta mc0e 30.01.2017 - 03:29
fuente

2 respuestas

2

ACTUALIZACIÓN: Aquí hay un script de Bash que creo que hace más de lo que estás pidiendo. Explorará los procesos que se estén ejecutando actualmente y enumerará los paquetes de RPM que contienen las bibliotecas que se cargan actualmente en la memoria para esos procesos.

#!/bin/bash

procs=$(find /proc -maxdepth 1 -type d -name "[0-9]*" | sed 's@/proc/@@')

for proc in $procs[*]; do
  if [ ! -f /proc/$proc/cmdline ]; then
    continue
  fi

  cmd=$(cat /proc/$proc/cmdline | sed 's/[\s\n]+//g')

  if [ -z "$cmd" ]; then
    continue
  fi

  echo "**** Scanning pid ($proc): $cmd"
  echo

  echo "Dependent RPM Packages:"
  (
    libs=$(sudo lsof -p $proc -a -d mem 2>/dev/null | awk '{print $NF}' | grep "\.so")
    for lib in $libs; do
      echo $(rpm -qf $lib)
    done
  ) | sort -u
  echo
done

Podrías escribir un simple script de Bash para descubrir qué binarios dependen de una biblioteca en particular.

Para obtener la lista de archivos binarios en el disco afectado:

#!/bin/bash

dir=$1
lib=$2

for bin in $(find $dir -type f -executable); do
  ldd $bin | grep -q "$lib" && echo $bin
done

O en el caso de ejecutar procesos en el sistema, podría grep ps -ef en su lugar y utilizar ldd de la misma manera que anteriormente.

Dependiendo de su versión de Linux, también puede descubrir cómo una actualización de paquete en particular afecta su sistema en función de las bibliotecas que contiene.

En un sistema CentOS, podría hacer lo siguiente para obtener la lista de bibliotecas compartidas en un paquete:

$ rpm -ql zlib | grep "\.so"
/usr/lib64/libz.so.1
/usr/lib64/libz.so.1.2.7

Luego, podrías usar ldd en los binarios del sistema para determinar qué binarios usan las bibliotecas listadas.

    
respondido por el mattops 30.01.2017 - 04:07
fuente
0

La primera parte de una respuesta parece estar disponible en /proc/$PID/map_files/ .

En mi computadora portátil, mirando el proceso de ejecución de thunderbird, puedo ver entradas como:

lr-------- 1 mc0e mc0e 64 Jan 30 15:51 7f8d54fe1000-7f8d55025000 -> /lib/x86_64-linux-gnu/libdbus-1.so.3.7.6 (deleted)

Reconoce que la versión vinculada del archivo se elimina, aunque una versión actualizada se encuentre en la misma ubicación.

Hay un poco de scripting que hacer aquí, pero es bastante sencillo en el caso de procesos que se ejecutan directamente en el sistema de archivos del host.

Todavía se necesita más investigación para comprender cómo funcionará esto para los procesos que se ejecutan en diferentes espacios de nombres.

    
respondido por el mc0e 30.01.2017 - 05:58
fuente

Lea otras preguntas en las etiquetas