CVE-2026-89654 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:
ceph: sửa lỗi Use-After-Free (UAF) trong hàm check_new_map() khi phiên làm việc bị giải phóng trong quá trình khóa/mở khóa.
Hàm `check_new_map()` lặp qua mảng `mdsc->sessions[]` và đối với mỗi phiên đang hoạt động, nó mở khóa (`mutex_unlock`) mdsc->mutex để thực hiện các thao tác trên từng phiên. Đường dẫn đóng buộc (rank bị xóa khỏi bản đồ) đã đúng khi lấy một tham chiếu đến s thông qua `ceph_get_mds_session()` trước khi giải phóng mdsc->mutex, nhưng ba đường dẫn khác thì không:
Đường A (địa chỉ thay đổi): mutex_unlock → mutex_lock(&s->s_mutex) Đường B (kết nối lại): mutex_unlock → send_mds_reconnect(mdsc, s) Đường C (chuyển sang trạng thái active): mutex_unlock → mutex_lock(&s->s_mutex)
Nếu không có tham chiếu bổ sung này, một luồng khác có thể chiếm mdsc->mutex trong khoảng thời gian mở khóa, gọi `__unregister_session()`, làm giảm tham chiếu cuối cùng trên s và giải phóng nó. Sau đó, luồng ban đầu truy cập vào bộ nhớ đã bị giải phóng thông qua s->s_mutex.
Cách sửa: thêm `ceph_get_mds_session(s)` trước mỗi lệnh mutex_unlock và `ceph_put_mds_session(s)` sau lệnh mutex_lock tương ứng, để khớp với mẫu đã được sử dụng trong đường dẫn đóng buộc.
Dòng thời gian Race Condition (Đường A):
Luồng A (check_new_map) Luồng B (cập nhật bản đồ khác giữ mdsc->mutex hoặc tháo gỡ phiên làm việc) -------------------------- -------------------------- s = mdsc->sessions[i]
(refcount == 1, chỉ được giữ bởi mảng sessions[])
mutex_unlock(&mdsc->mutex) ---> chiếm mdsc->mutex __unregister_session(mdsc, s) sessions[i] = NULL
ceph_put_mds_session(s) refcount: 1 -> 0 kfree(s) <--- đã được giải phóng!
mutex_lock(&s->s_mutex) UAF trên s->s_mutex đã bị giải phóng
If you want to get the best quality for vulnerability data then you always have to consider VulDB.