Identificando programas em execução que estão usando a versão antiga de uma biblioteca que acabei de substituir

8

Depois de instalar as atualizações para resolver CVE-2014-0160 (o OpenSSL Heartbleed bug), eu tive que tomar cuidado para reiniciar qualquer coisa que pudesse estar usando libssl - muitos serviços, como o Apache e meu software VPN, ainda tinham os antigos vulneráveis. libssl carregado, e meu gerenciador de pacotes não fez nenhuma tentativa de corrigir isso.

Isso me fez pensar: depois de atualizar uma biblioteca compartilhada, como posso saber com segurança quais programas em execução têm atualmente uma versão antiga da biblioteca vinculada? Tenho certeza que deve haver uma maneira de interrogar os processos em execução no nível do vinculador ou no nível dos descritores de arquivo para determinar se a instância de uma determinada biblioteca compartilhada que eles carregaram é a mesma que a atual no disco.

    
por tgies 08.04.2014 / 22:32

2 respostas

8

Eu encontrei duas maneiras de fazer isso:

  1. Específicos do Debian, lista a maioria dos arquivos excluídos / substituídos mantidos por processos (com exceção de alguns arquivos conhecidos como transitórios, por exemplo, em /tmp ): O debian-goodies package contém checkrestart , que realiza algo parecido com o que descrevi, raspando a saída de lsof para encontrar arquivos abertos que foram perdidos ou substituídos no disco. Ele identifica os processos em questão e (se possível) o pacote ao qual eles pertencem e qualquer script de inicialização que possa ser usado para reiniciá-los. A opção -v identificará os arquivos em questão.
  2. Genérico, manual, permite especificar o arquivo com o qual você está preocupado: Você pode examinar a saída de lsof para identificar identificadores de arquivos abertos para arquivos excluídos ou substituídos. Na saída de lsof -nnP , esse arquivo parece ser identificado por DEL na quarta coluna. Você pode fazer algo como lsof -nnP | grep DEL.*libssl.so para procurar alças obsoletas em uma biblioteca específica (OpenSSL, neste caso). Isso provavelmente depende muito da versão específica de seu uso e do comportamento do gerenciador de pacotes, portanto, tenha cuidado.

    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
    
por 08.04.2014 / 22:32
2

Uma maneira rápida e suja no Linux ( obrigado a Lekensteyn ):

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

Para uma análise precisa, você pode chamar lsof com a opção -F para obter uma saída analisável. Inclua o campo f para filtrar os arquivos excluídos ( fDEL ) e o campo n para obter o caminho para o arquivo. Observe que o snippet abaixo engasga com nomes de arquivos contendo novas linhas.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
    
por 09.04.2014 / 02:30