Xác định các chương trình đang chạy đang sử dụng phiên bản cũ của thư viện tôi vừa thay thế


9

Sau khi cài đặt các bản cập nhật để giải quyết CVE-2014-0160 ( lỗi OpenSSL Heartbleed ), tôi phải cẩn thận khởi động lại mọi thứ có thể đang sử dụng libssl - nhiều dịch vụ, như Apache và phần mềm VPN của tôi, vẫn tải libssl dễ bị tổn thương cũ và người quản lý gói của tôi đã không cố gắng khắc phục điều này.

Điều này khiến tôi suy nghĩ: Sau khi tôi cập nhật thư viện dùng chung, làm thế nào tôi có thể tìm ra những chương trình đang chạy hiện có phiên bản cũ của thư viện được liên kết? Tôi chắc chắn phải có một cách để thẩm vấn các tiến trình đang chạy ở cấp độ liên kết hoặc ở cấp độ mô tả tệp để xác định xem phiên bản của một thư viện chia sẻ đã cho mà chúng đã tải có giống như hiện tại trên đĩa không.

Câu trả lời:


9

Tôi tìm thấy hai cách để làm điều này:

  1. Cụ thể với Debian, liệt kê hầu hết các tệp bị xóa / thay thế được giữ bởi các quy trình (ngoại trừ một số tệp nhất định được biết là tạm thời, ví dụ như trong /tmp): debian-goodiesGói chứa checkrestart, thực hiện một cái gì đó giống như những gì tôi đã mô tả bằng cách quét đầu ra lsofđể tìm mở các tập tin đã biến mất hoặc thay thế trên đĩa. Nó xác định các quy trình trong câu hỏi và (nếu có thể) gói mà chúng thuộc về và bất kỳ tập lệnh init nào có thể được sử dụng để khởi động lại chúng. Các -vtùy chọn sẽ xác định các tập tin có liên quan.
  2. Chung, thủ công, cho phép chỉ định tệp bạn lo lắng: Bạn có thể xem đầu ra của lsofđể xác định tay cầm tệp đang mở cho các tệp bị xóa hoặc thay thế. Trong đầu ra của lsof -nnP, một tập tin như vậy dường như được xác định bởi DELtrong cột thứ tư. Bạn có thể làm một cái gì đó như lsof -nnP | grep DEL.*libssl.sotìm kiếm các thẻ điều khiển cũ cho một thư viện cụ thể (OpenSSL, trong trường hợp này). Điều này có thể phụ thuộc nhiều vào phiên bản cụ thể của lsof bạn sử dụng và hành vi của người quản lý gói của bạn, vì vậy hãy thận trọng.

    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
    

3

Một cách nhanh chóng và bẩn thỉu trên Linux ( nhờ Lekensteyn ):

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

Để phân tích cú pháp chính xác, bạn có thể gọi lsofvới -Ftùy chọn để có được đầu ra có thể phân tích cú pháp . Bao gồm ftrường để lọc trên các tệp đã xóa ( fDEL) và ntrường để nhận đường dẫn đến tệp. Lưu ý rằng đoạn mã bên dưới cuộn cảm với tên tệp chứa dòng mới.

lsof -F pfn | awk '
    /^p/ {pid=substr($0,2)}
    /^fDEL$/ {getline; if (/n\/usr\/lib\/libssl1\.0\.1.*(deleted)$/) print pid}
'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.