Ad

CVE-2026-74384

CRITICAL CVSS 3.1: 9,8 EPSS 0.51%
Обновлено 17 августа 2026
Linux
Параметр Значение
CVSS 9,8 (CRITICAL)
Поставщик Linux
Публичный эксплойт Нет

В ядре Linux устранена следующая уязвимость: nvme-multipath: исправлен размер гибкого массива в структуре nvme_ns_head. struct nvme_ns_head содержит гибкий элемент массива current_path[], который индексируется с использованием идентификатора узла NUMA: голова->текущий_путь[numa_node_id()] В настоящее время структура распределена как: размер = sizeof(struct nvme_ns_head) + (num_possible_nodes() * sizeof(struct nvme_ns *)); голова = kzalloc (размер, GFP_KERNEL); Такое распределение предполагает, что идентификаторы узлов NUMA являются последовательными и плотно распределенными. упаковано из 0 .. num_possible_nodes() - 1. Хотя это предположение справедливо во многих системах это не всегда верно для некоторых архитектур, таких как мощность ПК. В некоторых системах PowerPC идентификаторы узлов NUMA могут быть редкими.

Например: НУМА: Узлы NUMA: 6 NUMA node0 ЦП: 80–159 ЦП NUMA node8: 0–79 Процессоры NUMA node252: Процессоры NUMA node253: Процессоры NUMA node254: Процессоры NUMA node255: То есть возможные/онлайн идентификаторы узлов NUMA: 0, 8, 252, 253, 254, 255. В этом случае: num_possible_nodes() = 6 Таким образом, память выделяется только для 6 записей в current_path[]. Однако, позже массив индексируется с использованием фактического идентификатора узла NUMA.

В результате доступы, такие как: head->current_path[8] или голова->текущий_путь[252] выходит за пределы поля, что приводит к следующему знаку КАСАН: ============================================================== ОШИБКА: KASAN: плита выходит за пределы поля в nvme_mpath_revalidate_paths+0x22c/0x290 [nvme_core] Запись размера 8 по адресу c00020003bda35b8 с помощью задачи kworker/u641:2/1997. ЦП: 1 UID: 0 PID: 1997 Связь: kworker/u641:2 Не испорчен 7.1.0-rc5-dirty #14 PREEMPT(ленивый) Имя оборудования: 8335-GTH POWER9 0x4e1202 opal:skiboot-v6.5.3-35-g1851b2a06 PowerNV Рабочая очередь: асинхронная async_run_entry_fn Отслеживание вызова: [c000200037fa7510] [c0000000021c23d4] dump_stack_lvl+0x88/0xdc (ненадежно) [c000200037fa7540] [c0000000009fda90] print_report+0x22c/0x67c [c000200037fa7630] [c0000000009fd508] kasan_report+0x108/0x220 [c000200037fa7740] [c0000000009fff48] __asan_store8+0xe8/0x120 [c000200037fa7760] [c008000018e76474] nvme_mpath_revalidate_paths+0x22c/0x290 [nvme_core] [c000200037fa7800] [c008000018e6556c] nvme_update_ns_info+0x4a4/0x5e0 [nvme_core] [c000200037fa7a50] [c008000018e66270] nvme_alloc_ns+0x6d8/0x1a70 [nvme_core] [c000200037fa7c20] [c008000018e679fc] nvme_scan_ns+0x3f4/0x630 [nvme_core] [c000200037fa7d10] [c00000000031f22c] async_run_entry_fn+0x9c/0x3a0 [c000200037fa7db0] [c0000000002fa544]process_one_work+0x414/0xa10 [c000200037fa7ec0] [c0000000002fbf00] work_thread+0x320/0x640 [c000200037fa7f80] [c00000000030d0f8] kthread+0x278/0x290 [c000200037fa7fe0] [c00000000000ded8] start_kernel_thread+0x14/0x18 Выделено задачей 1997 на процессоре 1 в 35,928317 с: Адрес ошибки принадлежит объекту c00020003bda3000. который принадлежит кешу kmalloc-rnd-15-2k размером 2048 Глючный адрес расположен в 16 байтах справа от выделенная область размером 1448 байт [c00020003bda3000, c00020003bda35a8) Глючный адрес принадлежит физической странице: Состояние памяти вокруг ошибочного адреса: c00020003bda3480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c00020003bda3500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >c00020003bda3580: 00 00 00 00 00 ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ^ c00020003bda3600: ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК c00020003bda3680: ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ФК ============================================================== Исправьте это, выделив гибкий массив, используя вместо этого nr_node_ids. из num_possible_nodes(). Поскольку nr_node_ids представляет собой максимум возможные идентификаторы узлов NUMA, индексирование current_path[] с помощью numa_node_id() становится безопасным даже в системах с редкими идентификаторами узлов.

Показать оригинальное описание (EN)

In the Linux kernel, the following vulnerability has been resolved: nvme-multipath: fix flex array size in struct nvme_ns_head struct nvme_ns_head contains a flexible array member, current_path[], which is indexed using the NUMA node ID: head->current_path[numa_node_id()] The structure is currently allocated as: size = sizeof(struct nvme_ns_head) + (num_possible_nodes() * sizeof(struct nvme_ns *)); head = kzalloc(size, GFP_KERNEL); This allocation assumes that NUMA node IDs are sequential and densely packed from 0 .. num_possible_nodes() - 1. While this assumption holds on many systems, it is not always true on some architectures such as powerpc. On some powerpc systems, NUMA node IDs can be sparse. For example: NUMA: NUMA node(s): 6 NUMA node0 CPU(s): 80-159 NUMA node8 CPU(s): 0-79 NUMA node252 CPU(s): NUMA node253 CPU(s): NUMA node254 CPU(s): NUMA node255 CPU(s): That is, the possible/online NUMA node IDs are: 0, 8, 252, 253, 254, 255 In this case: num_possible_nodes() = 6 So memory is allocated for only 6 entries in current_path[]. However, the array is later indexed using the actual NUMA node ID. As a result, accesses such as: head->current_path[8] or head->current_path[252] goes out of bounds, leading to the following KASAN splat: ================================================================== BUG: KASAN: slab-out-of-bounds in nvme_mpath_revalidate_paths+0x22c/0x290 [nvme_core] Write of size 8 at addr c00020003bda35b8 by task kworker/u641:2/1997 CPU: 1 UID: 0 PID: 1997 Comm: kworker/u641:2 Not tainted 7.1.0-rc5-dirty #14 PREEMPT(lazy) Hardware name: 8335-GTH POWER9 0x4e1202 opal:skiboot-v6.5.3-35-g1851b2a06 PowerNV Workqueue: async async_run_entry_fn Call Trace: [c000200037fa7510] [c0000000021c23d4] dump_stack_lvl+0x88/0xdc (unreliable) [c000200037fa7540] [c0000000009fda90] print_report+0x22c/0x67c [c000200037fa7630] [c0000000009fd508] kasan_report+0x108/0x220 [c000200037fa7740] [c0000000009fff48] __asan_store8+0xe8/0x120 [c000200037fa7760] [c008000018e76474] nvme_mpath_revalidate_paths+0x22c/0x290 [nvme_core] [c000200037fa7800] [c008000018e6556c] nvme_update_ns_info+0x4a4/0x5e0 [nvme_core] [c000200037fa7a50] [c008000018e66270] nvme_alloc_ns+0x6d8/0x1a70 [nvme_core] [c000200037fa7c20] [c008000018e679fc] nvme_scan_ns+0x3f4/0x630 [nvme_core] [c000200037fa7d10] [c00000000031f22c] async_run_entry_fn+0x9c/0x3a0 [c000200037fa7db0] [c0000000002fa544] process_one_work+0x414/0xa10 [c000200037fa7ec0] [c0000000002fbf00] worker_thread+0x320/0x640 [c000200037fa7f80] [c00000000030d0f8] kthread+0x278/0x290 [c000200037fa7fe0] [c00000000000ded8] start_kernel_thread+0x14/0x18 Allocated by task 1997 on cpu 1 at 35.928317s: The buggy address belongs to the object at c00020003bda3000 which belongs to the cache kmalloc-rnd-15-2k of size 2048 The buggy address is located 16 bytes to the right of allocated 1448-byte region [c00020003bda3000, c00020003bda35a8) The buggy address belongs to the physical page: Memory state around the buggy address: c00020003bda3480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c00020003bda3500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >c00020003bda3580: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc ^ c00020003bda3600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc c00020003bda3680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ================================================================== Fix this by allocating the flexible array using nr_node_ids instead of num_possible_nodes(). Since nr_node_ids represents the maximum possible NUMA node IDs, indexing current_path[] using numa_node_id() becomes safe even on systems with sparse node IDs.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Низкая
Легко эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Высокое
Полная утечка данных
Целостность
Высокое
Полная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1