CVE-2026-97941
mm/slab: acquisire n->list_lock in __slab_try_return_freelist() per evitare la race
- Pubblicato
- 25 set 2026
- Aggiornato
- 19 ott 2026
- Assegnazione CNA
- Linux
- Evidenza osservata
- 4 nov 2026
CVSS primario
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HBasso · prossimi 30 giorni
- Percentile
- 6,8%
- Data del modello
- 4 nov 2026
L'EPSS è una stima statistica, non una certezza o una misura di impatto. Combinalo con CVSS, stato KEV, esposizione e ambiente.
Riepilogo
Nel kernel Linux è stata risolta la seguente vulnerabilità: mm/slab: acquisire n->list_lock in __slab_try_return_freelist() per evitare una race. Il commit ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") presumeva erroneamente che nessuno avesse liberato un oggetto allo slab fintanto che slab->freelist è NULL e il cmpxchg riesce. Tuttavia, come segnalato da Hyunwoo Kim [1], altre CPU potrebbero aver liberato un oggetto allo slab, inserito lo slab nella lista parziale, quindi allocato un oggetto dallo slab e trovarsi nel mezzo della rimozione dello slab dalla lista sotto n->list_lock. Poiché __refill_objects_node() rimette lo slab su pc.slabs al di fuori di n->list_lock, potrebbe inserire lo slab in quella lista mentre lo slab viene contemporaneamente rimosso da n->partial. Ciò ha portato a una corruzione della lista [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. Si tratta di un classico problema ABA in cui il cmpxchg riesce ma lo stato è cambiato da quando __refill_objects_node() ha prelevato la freelist dallo slab. Come menzionato da Vlastimil Babka [2], dovrebbe essere raro restituire più di uno slab (a causa della lettura race di slab->counters in get_partial_node_bulk()). Pertanto, invece di introdurre ulteriore complessità, acquisire e rilasciare n->list_lock due volte nel caso peggiore. Restituire lo slab direttamente alla lista parziale e mantenere n->list_lock durante il cmpxchg e add_partial(). Questo è simile alla versione iniziale del commit ba7425312607 [3]. Questo è sufficiente per evitare la race poiché la manipolazione della lista è serializzata da n->list_lock. Nel frattempo, ripristinare il suggerimento unlikely() ora che la condizione è improbabile.
Fonti
Utilizzo responsabile
Utilizza le informazioni sulla vulnerabilità solo sui sistemi che possiedi o che sei autorizzato a testare. Kitploit si collega ai metadati della ricerca pubblica e non memorizza codici exploit o payload dannosi.