CVE-2026-97941
mm/slab : prendre n->list_lock dans __slab_try_return_freelist() pour éviter la course
- Publié
- 25 sept. 2026
- Mise à jour
- 19 oct. 2026
- Attribution de CNA
- Linux
- Preuve observée
- 4 nov. 2026
CVSS primaire
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HFaible · 30 prochains jours
- Percentile
- 6,8 %
- Date du modèle
- 4 nov. 2026
EPSS est une estimation statistique, et non une certitude ou une mesure d'impact. Combinez-le avec CVSS, le statut KEV, l'exposition et votre environnement.
Résumé
Dans le noyau Linux, la vulnérabilité suivante a été corrigée : mm/slab : prendre n->list_lock dans __slab_try_return_freelist() pour éviter une condition de course. Le commit ba7425312607 (« mm, slab: add an optimistic __slab_try_return_freelist() ») supposait à tort que personne n'avait libéré d'objet vers le slab tant que slab->freelist est NULL et que le cmpxchg réussit. Cependant, comme l'a signalé Hyunwoo Kim [1], d'autres CPU peuvent avoir libéré un objet vers le slab, inséré le slab dans la liste partielle, puis alloué un objet depuis le slab, et être en train de retirer le slab de la liste sous n->list_lock. Étant donné que __refill_objects_node() remet le slab sur pc.slabs en dehors de n->list_lock, il peut insérer le slab dans cette liste alors que le slab est simultanément retiré de n->partial. Cela a conduit à une corruption de liste [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. Il s'agit d'un problème ABA classique où le cmpxchg réussit mais l'état a changé depuis que __refill_objects_node() a pris la freelist du slab. Comme l'a mentionné Vlastimil Babka [2], il devrait être rare de retourner plus d'un slab (en raison de la lecture sujette à concurrence de slab->counters dans get_partial_node_bulk()). Par conséquent, plutôt que d'introduire une complexité supplémentaire, acquérir et libérer n->list_lock deux fois dans le pire des cas. Retourner le slab directement à la liste partielle et maintenir n->list_lock pendant le cmpxchg et add_partial(). Cela est similaire à la version initiale du commit ba7425312607 [3]. Cela suffit pour éviter la condition de course, car la manipulation de liste est sérialisée par n->list_lock. Au passage, rétablir l'indication unlikely() maintenant que la condition est peu probable.
Sources
Utilisation responsable
Utilisez les informations de vulnérabilité uniquement sur les systèmes que vous possédez ou que vous êtes autorisé à tester. Kitploit renvoie aux métadonnées de la recherche publique et ne stocke pas de code d'exploitation ni de charges utiles malveillantes.