CVE-2026-98225 in Linux
Сводка
по VulDB • 06.10.2026
В ядре Linux была устранена следующая уязвимость:
mm/shrinker: исправление некорректного вызова set_shrinker_bit() при использовании cgroup.memory=nokmem
При включенном параметре cgroup.memory=nokmem функция shrinker_memcg_alloc() преждевременно завершает работу и никогда не выделяет идентификатор (id), поэтому поле shrinker->id сохраняет значение 0, полученное от kzalloc() в функции shrinker_alloc(). Затем __list_lru_init() копирует это нулевое значение в lru->shrinker_id, где оно выглядит как допустимый индекс бита.
Функция expand_shrinker_info() также не вызывается при использовании nokmem, поэтому shrinker_nr_max остается равным 0, и каждый memcg получает пустую карту (map_nr_max == 0).
deferred_split_folio() передает реальный memcg в __list_lru_add(), независимо от того, поддерживает ли lru работу с cgroup. В результате первый THP, поставленный в очередь в рамках cgroup, вызывает set_shrinker_bit(memcg, nid, 0) и нарушает проверку границ:
WARNING: mm/shrinker.c:212 at set_shrinker_bit+0x7d/0x90, CPU#126 Call Trace: <TASK> deferred_split_folio+0x18c/0x220 map_anon_folio_pmd_nopf+0xdd/0x130 map_anon_folio_pmd_pf+0x14/0xb0 do_huge_pmd_anonymous_page+0x1a1/0x620 __handle_mm_fault+0xea9/0x10d0 handle_mm_fault+0xe5/0x320 do_user_addr_fault+0x1cc/0x870 exc_page_fault+0x81/0x1b0 asm_exc_page_fault+0x27/0x30 </TASK>
Это безопасно, так как WARN_ON_ONCE() предотвращает чтение за пределами массива unit[], однако идентификатор (id) изначально не должен выглядеть допустимым. Его следует обнулять перед возвратом из функции.
Есть два других места, которые могут скрыть эту проблему: сбросить id в __list_lru_init(), когда nokmem отключает memcg_aware, или заставить deferred_split_folio() передавать NULL, как это делает list_lru_add_obj(). Оба варианта оставляют shrinker->id неочищенным для следующего вызывающего объекта, поэтому исправление следует внести там, где выделяется идентификатор.
If you want to get best quality of vulnerability data, you may have to visit VulDB.