CVE-2026-89663 in Linux
Tóm tắt
Bởi VulDB • 12/09/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
nfsd: thu hồi stateids copy-notify trước khi giảm tham chiếu của chúng.
Các stateid copy-notify tồn tại trong IDR s2s_cp_stateids và trên sc_cp_list của stid cha, được giữ cố định bởi một thành viên duy nhất (membership reference). Hàm _free_cpntf_state_locked() chỉ hủy liên kết (unlink) một mục khi bộ đếm tham chiếu (refcount) của nó đạt về 0; do đó, bất kỳ đường dẫn thu hồi nào chạy trong khi người nắm giữ concurrent find_cpntf_state()/manage_cpntf_state() có cs_count tăng cao sẽ làm giảm tham chiếu mà không hủy liên kết, khiến mục vẫn khả dụng với membership reference đã bị tiêu thụ. Một lần thu hồi thứ hai hoặc tick laundromat sau đó sẽ giải phóng nó trong khi người đọc vẫn giữ con trỏ -- đây là một lỗi use-after-free có thể được phát hiện bởi KASAN tại nfs4_put_cpntf_state() của người đọc.
Điều này ảnh hưởng đến cả ba đường dẫn thu hồi:
- Quá trình drain parent-stid (nfs4_free_cpntf_statelist()) gọi lặp lại _free_cpntf_state_locked() trên mục đầu tiên trong danh sách; một holder đã tăng cs_count khiến hàm trả về sớm, do đó vòng lặp tiếp theo sẽ giảm thêm và tiêu thụ tham chiếu của holder.
- OFFLOAD_CANCEL (manage_cpntf_state()) và thời gian hết hạn laundromat cũng sử dụng _free_cpntf_state_locked() và có thể làm giảm từ 2 xuống 1 mà không hủy liên kết.
Thêm revoke_cpntf_state_locked(), hàm này sẽ unhash mục khỏi IDR và sc_cp_list trước (trì hoãn việc giải phóng cuối cùng cho bất kỳ holder nào), và sử dụng nó trong cả ba đường dẫn thu hồi. Quá trình drain giờ đây duyệt với list_for_each_entry_safe() và thu hồi từng mục một cách không điều kiện, do đó kết thúc sau một lần lặp duy nhất trên mỗi mục bất kể cs_count là bao nhiêu. Việc unhash được kiểm soát bởi !list_empty(&cps->cp_list); gate idr_remove() quan trọng vì idr_alloc_cyclic() có thể đã tái sử dụng so_id vào lúc đó. Giữ nguyên _free_cpntf_state_locked() chỉ cho đường dẫn put của reference-holder, nơi một cuộc thu hồi concurrent có thể đã hủy liên kết mục (list_del_init() sau đó là no-op).
If you want to get the best quality for vulnerability data then you always have to consider VulDB.