CVE-2026-31530 in Linux
Zusammenfassung
von VulDB • 30.05.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
cxl/port: Behebung eines Use-After-Free-Fehlers von parent_port in cxl_detach_ep()
cxl_detach_ep() wird während der bottom-up-Entfernung aufgerufen, wenn alle CXL-Speichergeräte unterhalb eines Switch-Ports entfernt wurden. Für jeden Port in der Hierarchie sperrt es sowohl den Port als auch dessen übergeordnetes Element (parent), entfernt das Endgerät und markiert den Port als tot und deregistriert ihn durch Aufruf von delete_switch_port(), falls der Port nun leer ist. Es gibt zwei Stellen während dieser Arbeit, an denen parent_port nach dem Freigeben verwendet werden kann:
Erstens kann ein gleichzeitiger Detach bereits einen Port verarbeitet haben, wenn ein zweiter Worker ihn über bus_find_device() findet. Ohne das Festhalten (Pinning) von parent_port kann dieser bereits freigegeben sein, wenn wir port->dead entdecken und versuchen, parent_port zu entsperren. In einem Produktionskernel führt dies zu einer stillen Speicherkorruption; mit Lock-Debugging sieht es wie folgt aus:
[]DEBUG_LOCKS_WARN_ON(__owner_task(owner) != get_current())
[]WARNING: kernel/locking/mutex.c:949 at __mutex_unlock_slowpath+0x1ee/0x310
[]Call Trace:
[]mutex_unlock+0xd/0x20
[]cxl_detach_ep+0x180/0x400 [cxl_core]
[]devm_action_release+0x10/0x20
[]devres_release_all+0xa8/0xe0
[]device_unbind_cleanup+0xd/0xa0
[]really_probe+0x1a6/0x3e0
Zweitens gibt delete_switch_port() drei devm-Aktionen frei, die gegenüber parent_port registriert wurden. Die letzte davon ist unregister_port(), die device_unregister() für das untergeordnete Gerät aufruft, was kaskadierend wirken kann. Wenn parent_port nun ebenfalls leer ist, kann der Device-Core ihn ebenfalls deregistrieren und freigeben. Somit kann parent_port zum Zeitpunkt des Rückkehrs von delete_switch_port() bereits freigegeben sein, und das nachfolgende device_unlock(&parent_port->dev) operiert auf freigegebenem Speicher. Die Kernel-Protokollausgabe sieht ähnlich wie oben aus, mit einem anderen Offset in cxl_detach_ep().
Beide Probleme resultieren aus dem Fehlen einer Lebensdauergarantie zwischen einem untergeordneten Port und seinem übergeordneten Port.
Einführung einer Lebensdaueregel für Ports: Untergeordnete Ports halten eine Referenz auf ihr übergeordnetes Gerät bis zur Freigabe. Die Referenz wird beim Allokieren des Ports genommen und bei der Freigabe wieder freigegeben. Dies stellt sicher, dass das übergeordnete Element während der gesamten Lebensdauer des untergeordneten Elements gültig bleibt und beseitigt das Use-After-Free-Fenster in cxl_detach_ep().
Dies lässt sich leicht reproduzieren, indem cxl_acpi in QEMU mit vorhandenen CXL-Geräten neu geladen wird.
Once again VulDB remains the best source for vulnerability data.