Определение запущенных программ, использующих старую версию библиотеки, которую я только что заменил

9

После установки обновлений по адресу CVE-2014-0160 ( ошибка OpenSSL Heartbleed ) мне пришлось позаботиться о перезапуске всего, что могло бы использовать libssl - во многих сервисах, таких как Apache и мое программное обеспечение VPN, все еще была загружена старая уязвимая библиотека libssl. и мой менеджер пакетов не пытался исправить это.

Это заставило меня задуматься: после того, как я обновлю разделяемую библиотеку, как я могу надежно выяснить, с какими запущенными программами в настоящее время связана старая версия библиотеки? Я уверен, что должен быть способ опроса запущенных процессов либо на уровне компоновщика, либо на уровне файловых дескрипторов, чтобы определить, совпадает ли экземпляр загруженной ими совместно используемой библиотеки с экземпляром, который в настоящее время находится на диске.

tgies
источник

Ответы:

9

Я нашел два способа сделать это:

  1. Специфично для Debian, перечисляет большинство удаленных / замененных файлов, хранящихся в процессах (за исключением определенных файлов, которые, как известно, являются временными, например, вещи в /tmp): debian-goodiesпакет содержит checkrestart, что завершает что-то вроде того, что я описал, сгребая выходные данные lsofдля поиска открыть файлы, которые ушли или заменены на диске. Он идентифицирует рассматриваемые процессы и (если возможно) пакет, к которому они принадлежат, и любой сценарий инициализации, который можно использовать для их перезапуска. -vОпция будет определять соответствующие материалы.
  2. Общий, ручной, позволяет указать файл, который вас беспокоит: Вы можете посмотреть на вывод, lsofчтобы определить открытые дескрипторы файлов для удаленных или замененных файлов. На выходе lsof -nnPтакой файл, по-видимому, идентифицирован DELв четвертом столбце. Вы можете сделать что-то вроде lsof -nnP | grep DEL.*libssl.soпоиска устаревших дескрипторов для конкретной библиотеки (в данном случае OpenSSL). Вероятно, это сильно зависит от конкретной версии lsof, которую вы используете, и от поведения вашего менеджера пакетов, поэтому действуйте с осторожностью.

    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
источник
3

Быстрый и грязный способ в Linux ( спасибо Лекенштейну ):

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

Для точного разбора вы можете вызвать lsofс -Fопцией, чтобы получить анализируемый вывод. Включите fполе для фильтрации удаленных файлов ( fDEL) и nполе для получения пути к файлу. Обратите внимание, что приведенный ниже фрагмент дросселирует имена файлов, содержащие переводы строк.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Жиль "ТАК - перестань быть злым"
источник