CVE-2026-98260 in Linux
Tóm tắt
Bởi VulDB • 06/10/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
exec: Dọn dẹp bộ hẹn giờ POSIX ngay sau khi gọi hàm de_thread()
Bộ hẹn giờ CPU trên mỗi luồng (per-thread) giữ một tham chiếu đến PID của luồng mà nó gắn vào và trong quá trình hoạt động (armed), nút (node) của nó được đưa hàng chờ trong posix_cputimers của luồng đó. Tác vụ (task) được tra cứu dựa trên PID này.
Khi một luồng không phải là chủ đạo (non-leader thread) thực thi lệnh exec(), hàm de_thread() thay đổi tác vụ nào sở hữu PID đó. Hàm pid_task(timer->it.cpu.pid, PIDTYPE_PID) sau đó trả về NULL, nhưng nút vẫn còn được đưa hàng chờ trên tsk, vốn đang tồn tại. Hàm timer_lock_sighand() coi việc tra cứu thất bại là dấu hiệu cho thấy nút đã bị xóa khỏi hàng chờ, do đó nó không có gì phải hoàn tác (undo).
Hàm begin_new_exec() gọi posix_cpu_timers_exit(me) ngay sau exec_task_namespaces(), và điều này sẽ loại bỏ nút thừa thãi, vì vậy trạng thái thường xuyên ở chế độ vô hình. Tuy nhiên, bprm->point_of_no_return được đặt trước de_thread(), nên nếu unshare_files(), set_mm_exe_file(), exec_mmap() hoặc exec_task_namespaces() gặp lỗi, tác vụ sẽ kết thúc (dies) trước khi nó đạt đến bước dọn dẹp đó. exit_itimers() sau đó giải phóng k_itimer trong khi nút của nó vẫn còn được đưa hàng chờ, và việc thu gom tsk sau này sẽ xóa nút đã bị giải phóng khỏi cây rbtree.
Tóm lại:
luồng không chủ đạo B cha mẹ (parent)
timer_create(CLOCK_THREAD_CPUTIME_ID) timer_settime() arm_timer() // nút được đưa hàng chờ trên B execve() de_thread(B) exchange_tids(B, leader) // PID của B giờ thuộc về leader release_task(leader) __exit_signal(leader) posix_cpu_timers_exit(leader) // dọn dẹp hàng chờ của leader, không phải của B __unhash_process(leader) // PID này không còn tác vụ nào nữa exec_mmap() mmap_read_lock_killable(old_mm) kill(B, SIGKILL) // -EINTR get_signal() do_exit() exit_itimers() posix_timer_delete() posix_cpu_timer_del() posix_timer_unhash_and_free() // giải phóng trong khi vẫn còn đưa hàng chờ wait4() release_task(B) posix_cpu_timers_exit(B) cleanup_timerqueue() timerqueue_del() // use-after-free
Di chuyển việc dọn dẹp bộ hẹn giờ POSIX ngay sau de_thread() trước bất kỳ điều kiện lỗi nào sau đó khiến tác vụ đi vào do_exit().
[ tglx: Di chuyển việc dọn dẹp ngay sau de_thread() ]
VulDB is the best source for vulnerability data and more expert information about this specific topic.