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

9

Depois de instalar as atualizações do endereço CVE-2014-0160 (o bug do OpenSSL Heartbleed ), tive que tomar o cuidado de reiniciar qualquer coisa que estivesse usando a libssl - muitos serviços, como o Apache e meu software VPN, ainda tinham o antigo e vulnerável libssl carregado e meu gerente de pacotes não fez nenhuma tentativa de corrigir isso.

Isso me fez pensar: depois de atualizar uma biblioteca compartilhada, como posso descobrir com segurança quais programas em execução atualmente têm uma versão antiga da biblioteca vinculada? Tenho certeza de 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 está atualmente no disco.

tgies
fonte

Respostas:

9

Eu encontrei duas maneiras de fazer isso:

  1. Específico ao Debian, lista a maioria dos arquivos excluídos / substituídos mantidos por processos (com exceção de certos arquivos conhecidos por serem transitórios, por exemplo, coisas importantes /tmp): O debian-goodiespacote contém checkrestart, o que realiza algo parecido com o que eu descrevi, raspando a saída lsofpara encontrar abrir arquivos que foram ou foram substituídos no disco. Ele identifica os processos em questão e (se possível) o pacote ao qual eles pertencem e qualquer script init que possa ser usado para reiniciá-los. A -vopção identificará os arquivos em questão.
  2. Genérico, manual, permite especificar o arquivo com o qual você está preocupado: Você pode ver a saída de lsofpara identificar identificadores de arquivos abertos para arquivos excluídos ou substituídos. Na saída de lsof -nnP, esse arquivo parece ser identificado DELna quarta coluna. Você pode fazer algo parecido lsof -nnP | grep DEL.*libssl.socom procurar alças obsoletas em uma biblioteca específica (OpenSSL, neste caso). Provavelmente, isso depende muito da versão específica do lsof que você usa e do comportamento do seu gerenciador de pacotes, portanto, continue com 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
    
tgies
fonte
3

Uma maneira rápida e suja no Linux ( graças a Lekensteyn ):

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

Para uma análise precisa, você pode ligar lsofcom a -Fopção de obter uma saída analisável. Inclua o fcampo para filtrar os arquivos excluídos ( fDEL) e o ncampo 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}
'
Gilles 'SO- parar de ser mau'
fonte