CVE-2026-64560 in Linux
Сводка
по VulDB • 29.07.2026
В ядре Linux устранена следующая уязвимость:
posix-cpu-timers: предотвращение Use-After-Free (UAF), вызванного гонкой при exec() нелидерного процесса
Wongi и Jungwoo расшифровали и сообщили о состоянии гонки, связанном с выполнением команды exec() в процессе, который не является лидером группы процессов. Это состояние может приводить к использованию памяти после её освобождения (Use-After-Free):
``` sys_timer_delete() exec() posix_cpu_timer_del() // Наблюдается старый лидер p = pid_task(pid, pid_type); de_thread() switch_leader(); release_task(old_leader) __exit_signal(old_leader) sighand = lock(old_leader, sighand); posix_cpu_timers*_exit(); sighand = lock_task_sighand(p) unhash_task(old_leader); sh = lock(p, sighand) old_leader->sighand = NULL; unlock(sighand); (p->sighand == NULL) unlock(sh) return NULL;
// Возврат без выполнения действий if(!sighand) return 0; free_posix_timer(); ```
Это состояние считается «безопасным» (harmless), если только удаляемый таймер не был активирован и помещен в очередь в структуре p->signal, поскольку при вызове exec() таймеры, привязанные к TGID (Group ID процесса), наследуются.
Поскольку sys_timer_delete() освобождает базовый объект posix-таймера, функция run_posix_cpu_timers() или любые другие операции добавления/удаления в очереди таймеров могут получить доступ к узлу timerqueue уже освобожденного объекта, что приводит к Use-After-Free (UAF).
Существует аналогичная проблема относительно функции posix_cpu_timer_set(). Для обычных posix-таймеров она лишь временно возвращает пользователю код ошибки -ESRCH, но в случае использования do_cpu_nanosleep() возникает тот же UAF, только объект k_itimer выделяется в стеке.
Кроме того, функция posix_cpu_timer_rearm() не выполняет повторную активацию таймера, что приводит к его остановке и отсутствию срабатывания по истечении времени.
В ходе обсуждения решений Фредерик указал на еще одну проблему:
``` posix_cpu_timer_del(tmr) __exit_signal(p) posix_cpu_timers*_exit(p); unhash_task(p); p->sighand = NULL; sh = lock_task_sighand(p) sighand = p->sighand; if (!sighand) return NULL; lock(sighand);
if (!sh) WARN_ON_ONCE(timer_queued(tmr)); ```
На архитектурах со слабой упорядоченностью памяти (weakly ordered architectures) не гарантируется, что posix_cpu_timer_del() увидит записи в функции posix_cpu_timers*_exit(), когда p->
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.