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.

Ответственный

Linux

Резервировать

25.09.2026

Раскрытие

25.09.2026

Модерация

принято

Вход

VDB-410136

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Want to stay up to date on a daily basis?

Enable the mail alert feature now!