CVE-2026-46242
eventpoll: corrige l'UAF de ep_remove entre struct eventpoll et struct file
- Publié
- 30 mai 2026
- Mise à jour
- 5 août 2026
- Attribution de CNA
- Linux
- Preuve observée
- 8 août 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
- 87,4 %
- Date du modèle
- 21 sept. 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 : eventpoll: fix ep_remove struct eventpoll / struct file UAF ep_remove() (via ep_remove_file()) effaçait file->f_ep sous file->f_lock, mais continuait ensuite à utiliser @file dans la section critique (is_file_epoll(), hlist_del_rcu() via la tête de liste, spin_unlock). Un __fput() concurrent empruntant le chemin rapide de eventpoll_release() dans cette fenêtre observait la valeur NULL transitoire, contournait eventpoll_release_file() et aboutissait à f_op->release / file_free(). Pour le cas où un epoll surveille un autre epoll, f_op->release est ep_eventpoll_release() -> ep_clear_and_put() -> ep_free(), qui libère par kfree() le struct eventpoll surveillé. Sa hlist_head ->refs intégrée se trouve exactement à l'endroit où pointe epi->fllink.pprev, de sorte que l'écriture "*pprev = next" du hlist_del_rcu() qui suit écrit dans la mémoire kmalloc-192 libérée. De plus, struct file étant SLAB_TYPESAFE_BY_RCU, l'emplacement mémoire de @file pouvait être recyclé par alloc_empty_file() -- réinitialisant f_lock et f_ep -- alors que ep_remove() est encore censé se trouver dans ce verrou. La conséquence est un kmem_cache_free() contrôlable par un attaquant sur le mauvais cache slab. Épingler @file via epi_fget() au début de ep_remove() et conditionner l'exécution de la section critique à la réussite de l'épinglage. Lorsque l'épinglage est maintenu, @file ne peut pas atteindre un refcount de zéro, ce qui empêche __fput() de se déclencher et, par transitivité, maintient le struct eventpoll surveillé en vie pendant le hlist_del_rcu() et l'utilisation de f_lock, éliminant ainsi les deux UAF. Si l'épinglage échoue, @file a déjà atteint un refcount de zéro et son __fput() est déjà en cours d'exécution. Comme nous avons abandonné avant d'effacer f_ep, ce chemin emprunte le chemin lent de eventpoll_release() vers eventpoll_release_file() et se bloque sur ep->mtx jusqu'à ce que ep_clear_and_put() du thread en attente le libère. La part de ep->refcount associée à l'epi abandonné reste intacte, de sorte que le ep_refcount_dec_and_test() final dans ep_clear_and_put() ne peut pas libérer l'eventpoll alors qu'eventpoll_release_file() l'utilise encore ; l'epi orphelin est ensuite nettoyé à cet endroit. Un épinglage réussi prouve également que nous ne sommes pas en course avec eventpoll_release_file() sur cet epi. La revérification désormais redondante de epi->dying sous f_lock est donc supprimée. Le chemin rapide de sortie anticipée READ_ONCE(epi->dying), sans verrou et peu coûteux, est conservé.
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.