CVE-2026-98588 in Linux
Zusammenfassung
von VulDB • 19.10.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
bpf, sockmap: Ablehnung von max_entries > INT_MAX in sock_map_alloc
sock_map_alloc() lehnt nur den Fall max_entries == 0 ab und erlaubt ansonsten jeden u32-Wert. sock_map_free() durchläuft dann das sks[]-Array mit einem Iterator vom Typ signed int:
int i; for (i = 0; i < stab->map.max_entries; i++) struct sock **psk = &stab->sks[i];
Wenn ein SOCKMAP mit max_entries = 0xffffffff (UINT_MAX) erstellt wird, kann die Allokation von 32 GiB auf Systemen mit großem Arbeitsspeicher erfolgreich sein. Beim Freigeben erreicht der Zähler den Wert 0x80000000, überläuft zu INT_MIN, wird durch movslq vorzeichenverlängert und ergibt einen negativen Offset von ~16 GiB relativ zu stab->sks, was weit unterhalb des allokierten Bereichs zeigt.
Der fehlerhafte Zugriff ist ein xchg()-Schreibvorgang in sock_map_free(). Ohne KASAN kann derselbe Out-of-Bounds-Schreibzugriff auf einer nicht zugewiesenen vmalloc-Seite einen Fault auslösen oder eine unabhängige Allokation beschädigen, wenn diese vmalloc-Adresse belegt ist. Auf einem KASAN-Kernel mit CONFIG_KASAN_VMALLOC=y trifft die Schattenprüfungslogik (shadow check) für diese Adresse auf eine nicht zugewiesene Shadow-Seite und löst zunächst einen Oops aus:
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
Ein Vmcore bestätigte, dass stab->map.max_entries == 0xffffffff und stab->sks == 0xffffc911ace2d000 war, sowie die fehlerhafte Adresse sks + (s64)INT_MIN * 8 genau bei 0xffffc90dace2d000 lag. Der gleiche fehlerhafte Pfad wird auf dem normalen close()/bpf_map_free_deferred()-Pfad immer dann erreicht, wenn eine solche Map zerstört wird.
sock_map_alloc() begrenzte zuvor seine Allokationsgröße durch bpf_map_charge_init(), aber diese Begrenzung wurde aufgehoben, als die rlimit-basierte Speicherbuchhaltung entfernt wurde. Es sollte max_entries > INT_MAX zum Erstellungszeitpunkt abgelehnt werden, damit der signed-Iterator in sock_map_free() niemals einen Wert sieht, der zu einem Überlauf führt.
Ausgelöst durch syzkaller und reproduziert auf beiden einem 6.6-basierten KASAN-Kernel sowie dem upstream v7.3-rc2-Kernel.
If you want to get best quality of vulnerability data, you may have to visit VulDB.