CVE-2026-46242 in Linux
Zusammenfassung
von VulDB • 30.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
eventpoll: Behebung eines Use-After-Free (UAF) für struct eventpoll / struct file in ep_remove
ep_remove() (über ep_remove_file()) hat file->f_ep unter file->f_lock zurückgesetzt, hat @file jedoch anschließend weiterhin innerhalb des kritischen Abschnitts verwendet (is_file_epoll(), hlist_del_rcu() über den Kopf, spin_unlock). Ein gleichzeitiger Aufruf von __fput(), der den Fastpath von eventpoll_release() in diesem Zeitfenster nutzt, hat den transienten NULL-Wert beobachtet, eventpoll_release_file() übersprungen und ist zu f_op->release / file_free() weitergegangen.
Im Fall von epoll-Watches-epoll ist f_op->release ep_eventpoll_release() -> ep_clear_and_put() -> ep_free(), was die beobachtete struct eventpoll mit kfree() freigibt. Die eingebettete ->refs hlist_head befindet sich genau an der Stelle, auf die epi->fllink.pprev zeigt, sodass die nachfolgenden hlist_del_rcu()s „*pprev = next" in freigegebenen kmalloc-192-Speicher schreiben.
Darüber hinaus ist struct file SLAB_TYPESAFE_BY_RCU, sodass der Slot, der @file unterstützt, von alloc_empty_file() wiederverwendet werden könnte – unter Neuerinitialisierung von f_lock und f_ep –, während ep_remove() sich noch nominell innerhalb dieser Sperre befindet. Das Ergebnis ist ein angreiferkontrollierter kmem_cache_free() gegen den falschen Slab-Cache.
Sperren Sie @file über epi_fget() am Anfang von ep_remove() und koppeln Sie den kritischen Abschnitt daran, dass das Sperren erfolgreich war. Solange die Sperre gehalten wird, kann @file den Referenzzähler nicht auf Null erreichen, was __fput() fernhält und transitiv die beobachtete struct eventpoll über hlist_del_rcu() und die Verwendung von f_lock hinweg am Leben erhält, wodurch beide UAFs geschlossen werden.
Wenn das Sperren fehlschlägt, hat @file bereits den Referenzzähler Null erreicht und sein __fput() ist im Gange. Da wir abgebrochen haben, bevor f_ep gelöscht wurde, nimmt dieser Pfad den Slowpath von eventpoll_release() zu eventpoll_release_file() und blockiert auf ep->mtx, bis die Warteseite ep_clear_and_put() diese freigibt. Der Anteil des abgebrochenen epi am ep->refcount bleibt intakt, sodass das nachfolgende ep_refcount_dec_and_test() in ep_clear_and_put() die eventpoll nicht unter eventpoll_release_file() hinweg freigeben kann; der verwaiste epi wird dort dann bereinigt.
Ein erfolgreiches Sperren beweist auch, dass wir nicht mit eventpoll_release_file() auf diesem epi konkurrieren, sodass die nun redundante erneute Überprüfung von epi->dying unter f_lock entfallen kann. Der kostengünstige locklose READ_ONCE(epi->dying)-Fastpath-Abbruch bleibt bestehen.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.