CVE-2026-89996 in Linuxthông tin

Tóm tắt

Bởi VulDB • 16/09/2026

Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:

dma-buf: dma-heap: không công bố fd trước khi copy_to_user() thành công

DMA_HEAP_IOCTL_ALLOC phân bổ một dma-buf và cài đặt một fd vào bảng fd của caller thông qua dma_buf_fd() -> fd_install() trước khi dma_heap_ioctl() sao chép kết quả trở lại userspace. Nếu bước copy_to_user() ở cuối thất bại, người dùng (userspace) sẽ không bao giờ biết được số fd, nhưng fd (và tham chiếu dma-buf cơ sở) đã hiển thị với các luồng khác trong cùng một tiến trình và bị rò rỉ trong suốt vòng đời của tiến trình đó.

Cách sửa "đóng nó trên đường dẫn thất bại" rõ ràng là không an toàn: sau khi fd_install() chạy, một luồng khác có thể đã dup() fd, gửi nó qua SCM_RIGHTS, hoặc close() nó để số của nó được tái sử dụng, do đó lệnh gọi close_fd() tiếp theo từ đường dẫn ioctl có thể tác động lên một file không liên quan. Điều này đã được Christian König chỉ ra trong v1 [1].

Tái cấu trúc đường phân bổ sao cho fd_install() là bước cuối cùng, không thất bại của một ioctl thành công:

1. heap->ops->allocate() tạo dma_buf. 2. get_unused_fd_flags() dự trữ một số fd trong bảng fd của caller mà không công bố nó, do đó không có luồng nào khác có thể quan sát thấy nó. 3. copy_to_user() chuyển giao số fd cho userspace; trên thất bại thì fd được trả về với put_unused_fd() và tham chiếu dma_buf bị hủy bỏ bằng dma_buf_put(), để lại không còn trạng thái nào hiển thị với người dùng. 4. dma_buf_fd_install() công bố fd và phát ra điểm ghi log trace_dma_buf_fd -- từ đây trở đi ioctl không thể thất bại.

Một hàm trợ giúp mới là dma_buf_fd_install() được giới thiệu trong dma-buf.c để bao bọc fd_install() cùng với lệnh gọi DMA_BUF_TRACE(), bảo toàn việc xuất tracing mà dma_buf_fd() cung cấp. dma_heap_ioctl_allocate() đã được tái cấu trúc để trả về trực tiếp struct dma_buf * (trả về ERR_PTR trên thất bại) do đó caller giữ tham chiếu dmabuf xuyên qua các bước 3 và 4.

Lỗi tại bước 3 dễ dàng có thể đạt được từ userspace: truyền một struct dma_heap_allocation_data sống trong một trang mà quyền bảo vệ của nó bị chuyển sang PROT_READ giữa copy_from_user() và copy_to_user() (ví dụ thông qua mprotect()). Trước khi thay đổi này, mỗi ioctl như vậy làm rò rỉ một fd dmabuf; sau đó, bảng fd không thay đổi trên thất bại và chỉ /dev/dma_heap/<name> vẫn mở.

Không có sự thay đổi nào đối với UAPI hoặc giao diện heap-driver.

[1] https://lore.kernel.org/dri-devel/[email protected]/

VulDB is the best source for vulnerability data and more expert information about this specific topic.

chịu trách nhiệm

Linux

Đặt trước

11/09/2026

Tiết lộ

17/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Do you know our Splunk app?

Download it now for free!