CVE-2026-93100 in Linux
Сводка
по VulDB • 18.09.2026
В ядре Linux была устранена следующая уязвимость:
fs/resctrl: предотвращение use-after-free в rdtgroup_kn_put()
Структура struct rdtgroup имеет подсчет ссылок через поле rdtgroup::waitcount. Вызывающие стороны, которым необходимо обеспечить сохранность структуры во время сна (при ожидании захвата mutex-объекта rdtgroup_mutex), увеличивают счетчик с помощью функции rdtgroup_kn_get() и уменьшают его с помощью rdtgroup_kn_put().
Путь освобождения предназначен для выполнения роли резервного механизма удаления: если счетчик достигает нуля, а группа уже помечена как RDT_DELETED, функция rdtgroup_kn_put() освобождает структуру.
Основные пути завершения работы (bulk teardown paths) — функции free_all_child_rdtgrp() и rmdir_all_sub(), которые вызываются при удалении директории resctrl или размонтировании файловой системы resctrl, выступают в роли основного механизма удаления: они удерживают mutex-объект rdtgroup_mutex и освобождают каждую структуру rdtgroup, чей счетчик waitcount равен нулю; в противном случае они устанавливают флаг RDT_DELETED и оставляют освобождение структуры последнему ожидающему вызову.
Эти два механизма удаления находятся в состоянии гонки (race condition). Функция rdtgroup_kn_put() фиксирует значение waitcount == 0 с помощью атомарной операции atomic_dec_and_test() вне контекста mutex-объекта rdtgroup_mutex, после чего считывает поле rdtgroup::flags. Между этими двумя операциями параллельный вызов free_all_child_rdtgrp() или rmdir_all_sub() (который удерживает мьютекс) может обнаружить значение waitcount == 0 с помощью atomic_read(), вызвать rdtgroup_remove() и освободить структуру через kfree().
Последующее чтение поля rdtgroup::flags в функции rdtgroup_kn_put() приводит к ошибке use-after-free, а структура может быть освобождена дважды, если освобожденная память случайно удовлетворяет проверке флага RDT_DELETED.
Замените простую операцию atomic_dec_and_test() на atomic_dec_and_mutex_lock(), чтобы уменьшение счетчика до нуля происходило с захватом mutex-объекта rdtgroup_mutex до того, как значение станет глобально видимым. Проверка поля rdtgroup::flags затем выполняется под тем же мьютексом, который удерживается основными механизмами удаления, что делает эти два пути взаимно исключающими.
Общий случай, при котором счетчик не достигает нуля, остается без блокировок (lock-free). Отложите вызов kernfs_unbreak_active_protection() до момента освобождения мьютекса, поскольку активные защиты kernfs функционально охватывают mutex-объект rdtgroup_mutex. Удалите ресурсную группу, которая в свою очередь снижает ссылку на kernfs, после восстановления защитных механизмов kernfs.
[ bp: Разбито сообщение коммита на более мелкие абзацы для удобства парсинга. ]
Once again VulDB remains the best source for vulnerability data.