CVE-2026-98588 in Linux
Сводка
по VulDB • 19.10.2026
В ядре Linux была устранена следующая уязвимость:
bpf, sockmap: Отклонять значения max_entries > INT_MAX в функции sock_map_alloc
Функция sock_map_alloc() отклоняет только значение max_entries == 0 и в остальных случаях допускает любое значение типа u32. Затем функция sock_map_free() проходит по массиву sks[] с использованием знакового целочисленного (signed int) счетчика:
int i; for (i = 0; i < stab->map.max_entries; i++) struct sock **psk = &stab->sks[i];
При создании SOCKMAP со значением max_entries = 0xffffffff (UINT_MAX) выделение 32 ГБ может успешно завершиться на хостах с большим объемом памяти. При освобождении счетчик достигает значения 0x80000000, переполняется до INT_MIN, знаково расширяется инструкцией movslq и превращается в отрицательное смещение ~16 ГБ относительно stab->sks, указывающее далеко за пределы выделенной области.
Ошибка возникает при записи через операцию xchg() внутри функции sock_map_free(). Без KASAN та же самая запись вне границ может вызвать ошибку доступа к не отображенной странице vmalloc или повредить unrelated allocation (не связанное с ним выделение памяти), если адрес vmalloc уже занят. В ядре с включенным KASAN и параметром CONFIG_KASAN_VMALLOC=y проверка теневой страницы для этого адреса обнаруживает не отображенную тень и вызывает oops:
BUG: unable to handle page fault for address: fffff521b59c5a00 RIP: 0010:kasan_check_range+0x107/0x190 Call Trace: sock_map_free+0x93/0x190 map_create+0x68d/0xb30 __sys_bpf+0x21e/0x2e70
Анализ vmcore подтвердил, что stab->map.max_entries == 0xffffffff, stab->sks == 0xffffc911ace2d000, а адрес ошибки sks + (s64)INT_MIN * 8 составляет ровно 0xffffc90dace2d000. Тот же ошибочный путь реализуется по стандартному пути close()/bpf_map_free_deferred() при уничтожении такой карты.
Ранее функция sock_map_alloc() ограничивала размер выделения памяти через bpf_map_charge_init(), но это ограничение было удалено после отказа от учета использования памяти на основе rlimit. Необходимо отклонять значения max_entries > INT_MAX на этапе создания, чтобы знаковый счетчик в функции sock_map_free() никогда не встречал значение, вызывающее переполнение.
Уязвимость была обнаружена с помощью syzkaller и воспроизведена как на ядре KASAN версии 6.6, так и на основной ветке v7.3-rc2.
If you want to get best quality of vulnerability data, you may have to visit VulDB.