CVE-2026-97941
mm/slab: захват n->list_lock в __slab_try_return_freelist() для предотвращения гонки
- Опубликовано
- 25 сент. 2026 г.
- Обновлено
- 19 окт. 2026 г.
- Назначение CNA
- Linux
- Наблюдены доказательства
- 4 нояб. 2026 г.
Первичный CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HНизкий · следующие 30 дней
- Процентиль
- 6,8 %
- Дата модели
- 4 нояб. 2026 г.
EPSS – это статистическая оценка, а не достоверность или мера воздействия. Объедините это с CVSS, статусом KEV, воздействием и вашей средой.
Резюме
В ядре Linux устранена следующая уязвимость: mm/slab: захват n->list_lock в __slab_try_return_freelist() для предотвращения гонки. Коммит ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") ошибочно предполагал, что никто не освободил объект в slab, пока slab->freelist равен NULL и cmpxchg завершается успешно. Однако, как сообщил Hyunwoo Kim [1], другие CPU могли освободить объект в slab, вставить slab в список partial, затем выделить объект из slab и находиться в процессе удаления slab из списка под n->list_lock. Поскольку __refill_objects_node() возвращает slab обратно в pc.slabs вне n->list_lock, он может вставить slab в этот список в то время, как slab одновременно удаляется из n->partial. Это привело к повреждению списка [1]: list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception Это классическая проблема ABA, когда cmpxchg завершается успешно, но состояние изменилось с момента, когда __refill_objects_node() забрал freelist из slab. Как отметил Vlastimil Babka [2], возврат более одного slab должен быть редким (из-за гонки при чтении slab->counters в get_partial_node_bulk()). Поэтому вместо добавления дополнительной сложности дважды захватывается и освобождается n->list_lock в худшем случае. Slab возвращается непосредственно в список partial, а n->list_lock удерживается на протяжении cmpxchg и add_partial(). Это аналогично первоначальной версии коммита ba7425312607 [3]. Этого достаточно для предотвращения гонки, поскольку манипуляции со списком сериализуются посредством n->list_lock. Попутно возвращён хинт unlikely(), поскольку теперь условие маловероятно.
Источники
Ответственное использование
Используйте информацию об уязвимостях только в тех системах, которыми вы владеете или имеете право тестировать. Kitploit ссылается на метаданные общедоступных исследований и не хранит код эксплойта или вредоносные полезные данные.