CVE-2026-89670 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: giữ rcu trong suốt quá trình thử lại cmpxchg localio
Các đối tượng nfsd_file được giải phóng thông qua call_rcu (filecache.c:296), và nfsd_file_slab được tạo ra mà không có SLAB_TYPESAFE_BY_RCU (KMEM_CACHE(nfsd_file, 0) tại filecache.c:789), do đó trang slab hỗ trợ một đối tượng nfsd_file đã giải phóng trở thành có thể thu hồi tự do ngay sau khi khoảng thời gian chờ RCU (RCU grace period) kết thúc.
Khối thử lại again trong hàm nfsd_open_local_fh() tải con trỏ bằng cmpxchg và sau đó gọi nfsd_file_get(new) (đây là refcount_inc_not_zero) mà không giữ rcu_read_lock. Người gọi duy nhất, nfs_open_local_fh(), nhả rcu_read_lock trước khi gọi trợ lý này, do đó không có vùng tới hạn phía người đọc bên ngoài nào bao phủ phép tải dữ liệu.
CPU 0 (nfsd_open_local_fh) CPU 1 (nfsd_file_put_local) ----- ----- new = cmpxchg(pnf, NULL, ...) nf = xchg(pnf, NULL) nfsd_file_put(nf) last ref -> call_rcu() /* grace period elapses; slab page recycled */ nfsd_file_get(new) refcount_inc_not_zero(&new->nf_ref) /* operates on recycled memory */
Một từ (word) khác không 0 tại độ lệch nf_ref của đối tượng đã được tái chế khiến việc tăng bộ đếm tham chiếu dường như thành công, và người gọi sau đó truy xuất new->nf_net và new->nf_file ra khỏi vùng nhớ đã giải phóng.
Khắc phục bằng cách lấy rcu_read_lock() ngay trước cmpxchg và nhả nó tại cả ba điểm thoát của khối if (new): thử lại goto-again, đường dẫn dọn dẹp khi mất race condition, và đường dẫn cài đặt thành công. nfsd_file_put() và nfsd_net_put() vẫn nằm ngoài vùng RCU để chúng có thể chặn một cách tự do.
If you want to get best quality of vulnerability data, you may have to visit VulDB.