Mengidentifikasi program yang sedang berjalan yang menggunakan versi lama perpustakaan yang baru saja saya ganti

9

Setelah menginstal pembaruan ke alamat CVE-2014-0160 ( bug OpenSSL Heartbleed ), saya harus berhati-hati untuk memulai kembali apa pun yang mungkin menggunakan libssl - banyak layanan, seperti Apache dan perangkat lunak VPN saya, masih memiliki libssl rentan yang lama dimuat dan manajer paket saya tidak berupaya untuk memperbaiki ini.

Ini membuat saya berpikir: Setelah saya memperbarui perpustakaan bersama, bagaimana saya dapat dengan andal mengetahui program yang sedang berjalan yang memiliki versi lama dari perpustakaan yang ditautkan? Saya yakin pasti ada cara untuk menginterogasi proses yang berjalan baik pada level linker atau pada level deskriptor file untuk menentukan apakah instance dari shared library yang diberikan yang mereka muat sama dengan yang ada pada disk.

tgies
sumber

Jawaban:

9

Saya menemukan dua cara untuk melakukan ini:

  1. Khusus Debian, daftar sebagian besar file yang dihapus / diganti yang dipegang oleh proses (dengan pengecualian file tertentu yang dikenal sementara, misalnya barang di /tmp): debian-goodiesPaket berisi checkrestart, yang mencapai sesuatu seperti apa yang telah saya jelaskan dengan mengikis output lsofuntuk menemukan buka file yang hilang atau diganti pada disk. Ini mengidentifikasi proses yang dimaksud dan (jika mungkin) paket milik mereka dan skrip init apa pun yang dapat digunakan untuk me-restart mereka. The -vpilihan akan mengidentifikasi file yang bersangkutan.
  2. Umum, manual, memungkinkan menentukan file yang Anda khawatirkan: Anda dapat melihat output lsofuntuk mengidentifikasi pegangan file terbuka untuk file yang dihapus atau diganti. Dalam output dari lsof -nnP, file seperti itu tampaknya diidentifikasi oleh DELdi kolom keempat. Anda dapat melakukan sesuatu seperti lsof -nnP | grep DEL.*libssl.somencari gagang basi ke perpustakaan tertentu (OpenSSL, dalam hal ini). Ini mungkin sangat tergantung pada versi spesifik yang Anda gunakan dan perilaku manajer paket Anda, jadi lanjutkan dengan hati-hati.

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

Cara cepat dan kotor di Linux ( terima kasih kepada Lekensteyn ):

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

Untuk penguraian yang tepat, Anda dapat memanggil lsofdengan -Fopsi untuk mendapatkan hasil yang dapat diuraikan. Sertakan fbidang untuk memfilter pada file yang dihapus ( fDEL) dan nbidang untuk mendapatkan jalur ke file. Perhatikan bahwa cuplikan di bawah ini mencekik nama file yang berisi baris baru.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Gilles 'SANGAT berhenti menjadi jahat'
sumber