CVE-2026-97903 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
exit: сохранение ссылки на thread_pid в течение работы proc_flush_pid
Коммит 0a36bad01731 ("release_task: kill the no longer needed get/put_pid(thread_pid)") удалил операцию сохранения и освобождения ссылки вокруг вызова proc_flush_pid(). В нем предполагалось, что вызов free_pids(post.pids) в конце функции release_task() будет поддерживать актуальность thread_pid до этого момента.
Это предположение ошибочно. Функция __change_pid() записывает отсоединенный PID (detached PID) в post.pids только тогда, когда для всех типов PID (PIDTYPE) функция pid_has_task() возвращает false. Если другой процесс все еще использует PID завершающегося процесса как свой идентификатор группы процессов или сессии, то __unhash_process() удаляет связь PIDTYPE_PID завершающегося процесса, но не включает этот PID в post.pids. Следовательно, после снятия блокировки tasklist_lock функция release_task() больше не удерживает ссылку на него.
Другой процесс может затем удалить оставшиеся связи PIDTYPE. Его вызов free_pids() планирует отложенное освобождение (delayed_put_pid()), и обратный вызов RCU может освободить объект PID до того, как первый экземпляр release_task() достигнет proc_flush_pid().
Непривилегированный воспроизводящий тест (reproducer) создает гонку между wait4(-1) и setsid(), чтобы спровоцировать эту ситуацию. При трех свежих загрузках ядра v7.2 с включенным KASAN были получены следующие сообщения:
BUG: KASAN: slab-use-after-free in proc_invalidate_siblings_dcache+0x3e2/0x3f0 Read of size 8 by task h7_pid_reaper/1921
Call Trace: proc_invalidate_siblings_dcache release_task wait_consider_task __do_wait do_wait kernel_wait4
Freed by task 0: kmem_cache_free put_pid delayed_put_pid rcu_core
Last potentially related work creation: __call_rcu_common free_pids ksys_setsid
KASAN выявил объект размером 144 байта из кэша PID и обнаружил некорректное чтение по смещению 80 байт внутри освобожденного объекта, что соответствует полю pid->inodes. При явном сохранении ссылки три из трех свежих загрузок завершились без сообщений KASAN. Одновременный обратный вызов RCU снял свою ссылку в то время, когда proc_flush_pid() был защищен, а сбалансированный вызов put_pid() выполнил окончательное освобождение afterward.
Необходимо сохранить ссылку перед тем, как __unhash_process() очистит p->thread_pid, и освободить ее после завершения работы proc_flush_pid().
Тестируемый исходный код воспроизводящего теста доступен по запросу в закрытом режиме. Утверждения о возможности неконтролируемого чтения или записи, утечки информации или повышения привилегий не делаются. Патч для основной ветки (mainline) напрямую применяется к версиям v6.19.y и новее; версии от v6.16.y до v6.18.y требуют бэкпорта с учетом контекста.
Once again VulDB remains the best source for vulnerability data.