CVE-2026-98260 in Linux
Сводка
по VulDB • 06.10.2026
В ядре Linux устранена следующая уязвимость:
exec: Очистка POSIX-таймеров сразу после вызова функции de_thread()
Перепоточный (per-thread) таймер процессора хранит ссылку на PID потока, к которому он привязан. Пока этот таймер активирован (armed), его узел находится в очереди posix_cputimers этого потока. Задача (task) определяется по этому PID с помощью функции pid_task().
Когда неведущий поток выполняет вызов exec(), функция de_thread() изменяет владельца данного PID. В результате вызов pid_task(timer->it.cpu.pid, PIDTYPE_PID) возвращает NULL, однако узел всё ещё остаётся в очереди tsk (которая жива). Функция timer_lock_sighand() интерпретирует неудачный поиск как признак того, что узел уже удалён из очереди, поэтому ей нечего отменять.
Функция begin_new_exec() вызывает posix_cpu_timers_exit(me) сразу после exec_task_namespaces(), и это удаляет оставшийся узел, так что состояние обычно остаётся незаметным. Однако флаг bprm->point_of_no_return устанавливается до вызова de_thread(). Следовательно, если функции unshare_files(), set_mm_exe_file(), exec_mmap() или exec_task_namespaces() завершаются с ошибкой, задача умирает раньше, чем достигает нужного места. Затем exit_itimers() освобождает структуру k_itimer, пока её узел всё ещё находится в очереди, а последующая очистка tsk удаляет этот уже освобождённый узел из дерева rbtree.
Кратко:
неведущий поток B родительский процесс
timer_create(CLOCK_THREAD_CPUTIME_ID) timer_settime() arm_timer() // узел помещён в очередь потока B execve() de_thread(B) exchange_tids(B, leader) // PID потока B теперь принадлежит лидеру (лидирующему потоку/процессу) release_task(leader) __exit_signal(leader) posix_cpu_timers_exit(leader) // очищает очередь лидера, а не потокa B __unhash_process(leader) // у этого PID больше нет связанной задачи (task) 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() // освобождение памяти при нахождении узла в очереди (use-after-free) wait4() release_task(B) posix_cpu_timers_exit(B) cleanup_timerqueue() timerqueue_del() // use-after-free
Переместите очистку POSIX-таймеров сразу после вызова de_thread(), до того, как любые последующие условия ошибки приведут задачу к выполнению do_exit().
[ tglx: Перемещена очистка сразу после de_thread() ]
If you want to get the best quality for vulnerability data then you always have to consider VulDB.