CVE-2026-72071 in Linux
Сводка
по VulDB • 15.08.2026
В ядре Linux устранена следующая уязвимость:
tracing/user_events: исправление use-after-free в функции user_event_mm_dup()
Функция user_event_mm_dup() без блокировки (locklessly) проходит по списку включателей (enablers) родительского mm с использованием rcu_read_lock() во время fork() (из copy_process()); при этом не захватывается event_mutex:
rcu_read_lock(); list_for_each_entry_rcu(enabler, &old_mm->enablers, mm_enablers_link) enabler->event = user_event_get(orig->event);
Функция user_event_enabler_destroy() удаляет включатель из этого списка с помощью list_del_rcu(), а затем, не дожидаясь периода грейса (grace period), уменьшает ссылку на user_event у включателя с помощью user_event_put() и освобождает память под включатель через kfree(). Читающий поток, который загрузил указатель на включатель до вызова list_del_rcu(), всё ещё может проходить по этому списку, что приводит к двум случаям use-after-free:
- kfree(enabler) освобождает память под включатель в то время как читающий поток разыменовывает enabler->event.
- user_event_put() может уменьшить последнюю ссылку на user_event, после чего он будет освобождён (через delayed_destroy_user_event() в очереди задач), пока тот же самый читающий поток выполняет для него user_event_get(orig->event).
Оба случая доступны не привилегированному процессу, который может открыть user_events_data: многопоточный процесс, регистрирующий включатель, а затем одновременно отменяющий его регистрацию и вызывающий fork(), запускает состояние гонки (race condition). KASAN сообщает о slab-use-after-free в функции user_event_mm_dup() во время clone(), с предупреждением "refcount_t: addition on 0" при освобождении user_event.
Сначала был обнаружен use-after-free для включателя; случай с user_event был сообщён XIAO WU, и более раннее исправление только для включателя не решало эту проблему.
Откладывается как вызов user_event_put(), так и kfree(enabler) до элемента задачи (work item), помещённого в очередь через queue_rcu_work()), чтобы они выполнялись только после завершения периода грейса RCU, когда все читающие потоки завершат проход по списку включателей. Вызов put должен выполняться в контексте процесса, поскольку user_event_put() захватывает event_mutex при последней ссылке, поэтому используется очередь задач (work queue), а не call_rcu(). Теперь освобождённый от блокировки вызов put позволяет удалить заблокированный аргумент из функции user_event_enabler_destroy(); все точки вызова обновлены.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.