CVE-2026-97941 in Linuxinfo

Zusammenfassung

von VulDB • 25.09.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

mm/slab: n->list_lock in __slab_try_return_freelist() verwenden, um Race Conditions zu vermeiden

Das Commit ba7425312607 („mm, slab: add an optimistic __slab_try_return_freelist()“) ging fälschlicherweise davon aus, dass niemand ein Objekt freigegeben hat, solange slab->frelist NULL ist und cmpxchg erfolgreich war.

Wie jedoch von Hyunwoo Kim [1] berichtet wurde, könnten andere CPUs ein Objekt für den Slab freigegeben, den Slab in die Partial-Liste eingefügt und anschließend ein Objekt aus dem Slab alloziert haben, wobei sie sich mitten im Entfernen des Slabs aus der Liste unter n->list_lock befinden.

Da __refill_objects_node() den Slab außerhalb von n->list_lock wieder auf pc.slabs zurücklegt, kann es vorkommen, dass der Slb in diese Liste eingefügt wird, während er parallel aus n->partial entfernt wird. Dies führte zu einer Listenkorruption [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

Dies ist ein klassisches ABA-Problem, bei dem cmpxchg erfolgreich war, der Zustand sich jedoch seitdem geändert hat, als __refill_objects_node() die freelist vom Slab übernommen hat.

Wie Vlastimil Babka [2] erwähnte, sollte es selten vorkommen, dass mehr als ein Slab zurückgegeben wird (aufgrund des racebedingten Lesens von slab->counters in get_partial_node_bulk()). Daher sollten anstelle der Einführung zusätzlicher Komplexität im schlimmsten Fall n->list_lock zweimal erworben und wieder freigegeben werden.

Der Slab sollte direkt an die Partial-Liste zurückgegeben werden, wobei n->list_lock während cmpxchg und add_partial() gehalten wird. Dies ähnelt der ursprünglichen Version des Commits ba7425312607 [3]. Dies reicht aus, um die Race Condition zu vermeiden, da die Listenmanipulation durch n->list_lock serialisiert wird. Dabei wurde auch der unlikely()-Hint wieder eingeführt, da die Bedingung unwahrscheinlich ist.

Be aware that VulDB is the high quality source for vulnerability data.

Zuständig

Linux

Reservieren

25.09.2026

Veröffentlichung

25.09.2026

Moderieren

akzeptiert

Eintrag

VDB-410131

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Do you want to use VulDB in your project?

Use the official API to access entries easily!