CVE-2026-97918 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
tracing: Отмена регистрации при сбое включения триггера гистограммы
Коммит 6f86bdeab633 ("tracing: Fix bad hist from corrupting named_triggers list") описывал, как триггер, который был зарегистрирован, но отсутствует в списке file->triggers, освобождается (free), оставаясь при этом в глобальном списке named_triggers. В рамках этого коммита регистрация была перемещена вниз так, чтобы hist_trigger_enable() следовала за ней непосредственно. Однако один из путей выполнения всё равно приводит к этой ситуации. Функция hist_trigger_enable() добавляет триггер и сразу же удаляет его обратно, если событие не может быть включено:
list_add_tail_rcu(&data->list, &file->triggers);
update_cond_flag(file);
if (trace_event_trigger_enable_disable(file, 1) < 0) {
list_del_rcu(&data->list); update_cond_flag(file); ret--; }
В результате обход списка в hist_unregister_trigger() не находит ничего, тест остаётся NULL, и вызов ->free(), который должен был вызвать del_named_trigger(), пропускается. Ветка out_unreg переходит к out_free, где триггер всё равно освобождается:
BUG: KASAN: slab-use-after-free in find_named_trigger+0xac/0xc0 Read of size 8 at addr ffff8880091d3160 by task init/1 find_named_trigger+0xac/0xc0 hist_register_trigger+0xc1/0xa00 event_hist_trigger_parse+0x3146/0x6af0 event_trigger_write+0xce/0x160 Freed by task 69: kfree+0x154/0x420 trigger_kthread_fn+0xfd/0x160
Необходимо оставить триггер в таком состоянии, чтобы hist_unregister_trigger() мог его найти и отменить регистрацию. Это единственный код, который знает обо всех элементах, созданных cmd_ops->init(): записи в списке named list, ссылке на hist_pad, ссылке на триггер, с которым разделяется гистограмма по имени (named histogram), а также скопированном cmd_ops. Кроме того, это обеспечивает корректную обработку отказа trace_event_trigger_enable_disable(), чьи sm_ref и буферизованные ссылки на событие в противном случае остались бы «висячими».
Поскольку ->free() освобождает trigger_data и (для триггера, который не разделяет свою гистограмму) hist_data вместе с ним, ветка out_unreg больше не может переходить к out_free. Для триггеров, которые разделяют данные, hist_register_trigger() уже уничтожает hist_data вызывающей стороны, поэтому этот переход также приводил бы к чтению из освобождённой памяти.
По той же причине необходимо переместить проверку enable_timestamps в hist_unregister_trigger() выше вызова ->free: hist_data не переживает триггер, если удаляемый триггер является владельцем этих данных.
If you want to get best quality of vulnerability data, you may have to visit VulDB.