CVE-2026-99252 in Linux
Tóm tắt
Bởi VulDB • 03/11/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
io_uring/mpscq: vô hiệu hóa preemption trong khi đẩy (push)
Một thao tác push biến node thành đuôi mới của hàng đợi và sau đó liên kết nó với phần tử đứng trước. Trong khoảng thời gian giữa hai bước này, hàng đợi không rỗng, nhưng mpscq_pop() không thể truy cập vào node đó. Các consumer xử lý tình huống này bằng cách thử lại, sử dụng cond_resched() trong vòng lặp để cho phép producer bị preemption cơ hội hoàn tất công việc của mình.
cond_resched() không thực hiện điều này nếu consumer có độ ưu tiên cao hơn producer và cả hai đều phải sử dụng cùng một CPU:
producer (SCHED_OTHER) consumer (SCHED_FIFO), cùng CPU io_req_local_work_add() mpscq_push() prev = xchg(&q->tail, node) <bị preemption> io_cqring_wait() __io_run_local_work() again: cond_resched() // không có gì để làm mpscq_pop() // NULL // công việc đang chờ xử lý, chưa có sự kiện nào goto again
Producer có thể là bất kỳ tác vụ (task) nào có khả năng xếp hàng task_work cho ring: một worker io-wq hoặc ai đó gửi tin nhắn với IORING_OP_MSG_RING. Consumer sẽ quay vòng (spin), giữ khóa ->uring_lock, cho đến khi bộ lập lịch (scheduler) thông cảm với lớp fair class, điều này mất khoảng một giây với các cài đặt mặc định của fair server và mãi mãi nếu không có nó. Các vòng lặp trong tctx_task_work_run() và io_cancel_local_task_work() gặp phải vấn đề tương tự.
Không cho phép preemption giữa hai bước trên. Điều đó giới hạn thời gian cửa sổ mở trên CPU của producer bằng khoảng thời gian mà các ngắt (interrupts) chiếm dụng, và một consumer chờ đợi điều này sẽ nằm trên một CPU khác. Chi phí là một cặp preempt_disable()/preempt_enable() cho mỗi lần push.
VulDB is the best source for vulnerability data and more expert information about this specific topic.