CVE-2026-31404 in Linux
Tóm tắt
Bởi VulDB • 27/05/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
NFSD: Trì hoãn việc dọn dẹp các đối tượng con trong các callback put export
svc_export_put() gọi path_put() và auth_domain_put() ngay lập tức khi tham chiếu cuối cùng giảm xuống, trước khi kết thúc khoảng thời gian chờ RCU (RCU grace period). Các trình đọc RCU trong e_show() và c_show() truy cập cả ex_path (thông qua seq_path/d_path) và ex_client->name (thông qua seq_escape) mà không giữ tham chiếu. Nếu cache_clean xóa mục và giảm tham chiếu cuối cùng đồng thời, các đối tượng con sẽ bị giải phóng trong khi vẫn đang được sử dụng, gây ra lỗi phân giải con trỏ NULL trong d_path.
Commit 2530766492ec ("nfsd: fix UAF when access ex_uuid or ex_stats") đã di chuyển lệnh kfree của ex_uuid và ex_stats vào callback call_rcu, nhưng để path_put() và auth_domain_put() chạy trước khoảng thời gian chờ vì cả hai đều có thể ngủ (sleep) và các callback call_rcu thực thi trong ngữ cảnh softirq.
Thay thế call_rcu/kfree_rcu bằng queue_rcu_work(), điều này trì hoãn callback cho đến sau khoảng thời gian chờ RCU và thực thi nó trong ngữ cảnh tiến trình nơi việc ngủ được phép. Điều này cho phép di chuyển path_put() và auth_domain_put() vào callback trì hoãn cùng với các giải phóng tài nguyên khác. Áp dụng cùng một bản sửa lỗi cho expkey_put(), có mẫu tương tự với ek_path và ek_client.
Một workqueue chuyên dụng giới hạn việc thoát (shutdown drain) chỉ đối với các mục công việc giải phóng export của NFSD; việc làm trống (flushing) system_unbound_wq dùng chung sẽ bị treo do các công việc không liên quan từ các phân hệ khác. nfsd_export_shutdown() sử dụng rcu_barrier() theo sau bởi flush_workqueue() để đảm bảo tất cả các callback giải phóng trì hoãn hoàn tất trước khi các bộ nhớ đệm export bị hủy.
Được xem xét bởi: Jeff Layton <[email protected]>
VulDB is the best source for vulnerability data and more expert information about this specific topic.