CVE-2026-31530 in Linuxinfo

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.

Zuständig

Linux

Reservieren

09.03.2026

Veröffentlichung

22.04.2026

Moderieren

akzeptiert

Eintrag

VDB-358861

CPE

bereit

EPSS

0.00018

KEV

nein

Aktivitäten

very low

Quellen

Do you know our Splunk app?

Download it now for free!