CVE-2026-46242
eventpoll: behebe UAF von struct eventpoll / struct file in ep_remove
- Veröffentlicht
- 30.05.2026
- Aktualisiert
- 05.08.2026
- CNA zuweisen
- Linux
- Beweise beobachtet
- 08.08.2026
Primäres CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HNiedrig · nächste 30 Tage
- Perzentil
- 87,4 %
- Modelldatum
- 21.09.2026
EPSS ist eine statistische Schätzung, keine Gewissheit oder ein Maß für die Auswirkung. Kombinieren Sie es mit CVSS, KEV-Status, Belichtung und Ihrer Umgebung.
Zusammenfassung
Im Linux-Kernel wurde die folgende Schwachstelle behoben: eventpoll: behebt die UAF von ep_remove struct eventpoll / struct file ep_remove() (über ep_remove_file()) setzte file->f_ep unter file->f_lock zurück, verwendete @file danach aber weiterhin innerhalb des kritischen Abschnitts (is_file_epoll(), hlist_del_rcu() über den Kopf, spin_unlock). Ein gleichzeitiger __fput()-Aufruf, der in diesem Zeitfenster den Schnellpfad von eventpoll_release() nimmt, beobachtete den vorübergehenden NULL-Wert, übersprang eventpoll_release_file() und lief zu f_op->release / file_free(). Im Fall epoll-watches-epoll ist f_op->release ep_eventpoll_release() -> ep_clear_and_put() -> ep_free(), das das beobachtete struct eventpoll per kfree() freigibt. Sein eingebetteter ->refs hlist_head ist genau die Stelle, auf die epi->fllink.pprev zeigt, sodass das anschließende "*pprev = next" von hlist_del_rcu() in freigegebenen kmalloc-192-Speicher schreibt. Darüber hinaus ist struct file SLAB_TYPESAFE_BY_RCU, sodass der @file zugrunde liegende Slot von alloc_empty_file() wiederverwendet werden könnte -- wobei f_lock und f_ep neu initialisiert werden -- während sich ep_remove() nominell noch innerhalb dieser Sperre befindet. Das Ergebnis ist ein vom Angreifer kontrollierbarer kmem_cache_free() gegen den falschen Slab-Cache. Pinne @file über epi_fget() am Anfang von ep_remove() und lasse den kritischen Abschnitt nur bei erfolgreichem Pinnen durchlaufen. Bei gehaltenem Pin kann @file keinen Refcount von null erreichen, was __fput() zurückhält und das beobachtete struct eventpoll transitiv über die hlist_del_rcu()- und die f_lock-Nutzung hinweg am Leben hält, wodurch beide UAFs geschlossen werden. Schlägt das Pinnen fehl, hat @file bereits einen Refcount von null erreicht und sein __fput() ist bereits im Gange. Da wir ausgestiegen sind, bevor f_ep zurückgesetzt wurde, nimmt dieser Pfad den langsamen Pfad von eventpoll_release() in eventpoll_release_file() und blockiert auf ep->mtx, bis das ep_clear_and_put() der wartenden Seite die Sperre freigibt. Der Anteil des ausgestiegenen epi an ep->refcount bleibt intakt, sodass das abschließende ep_refcount_dec_and_test() in ep_clear_and_put() das eventpoll nicht unter eventpoll_release_file() freigeben kann; das verwaiste epi wird dort anschließend bereinigt. Ein erfolgreiches Pinnen beweist außerdem, dass wir auf diesem epi nicht mit eventpoll_release_file() konkurrieren; entferne daher die nun redundante erneute Prüfung von epi->dying unter f_lock. Der kostengünstige locklose READ_ONCE(epi->dying)-Schnellpfad-Ausstieg bleibt erhalten.
Verantwortungsvoller Umgang
Verwenden Sie Schwachstelleninformationen nur auf Systemen, die Sie besitzen oder zu deren Testen Sie berechtigt sind. Kitploit verlinkt auf öffentliche Forschungsmetadaten und speichert keinen Exploit-Code oder bösartige Payloads.