CVE-2024-53194 in Linuxinfo

Zusammenfassung

von VulDB • 30.05.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

PCI: Behebung eines Use-After-Free-Fehlers für slot->bus beim Hot-Remove

Dennis meldet einen Boot-Crash auf neueren Lenovo-Laptops mit einem USB4-Dock.

Seit dem Commit 0fc70886569c („thunderbolt: Reset USB4 v2 host router") und dem Commit 59a54c5f3dbd („thunderbolt: Reset topology created by the boot firmware") werden USB4 v2- und v1-Host-Router beim Aufruf des Thunderbolt-Treibers zurückgesetzt.

Der Reset löscht die Presence Detect State- und Data Link Layer Link Active-Bits am Root-Port des USB4-Host-Routers und verursacht dadurch ein Hot-Remove des Docks.

Der Crash tritt auf, wenn pciehp von einem der Downstream-Ports des Docks getrennt wird: pciehp erstellt beim Binden einen pci_slot und zerstört ihn beim Trennen. Der pci_slot enthält einen Zeiger auf den pci_bus unterhalb des Downstream-Ports, jedoch wird keine Referenz auf diesen pci_bus erworben. Der pci_bus wird vor dem pci_slot zerstört, sodass ein Use-After-Free auftritt, wenn pci_slot_release() auf slot->bus zugreift.

Grundsätzlich sollte dies nicht geschehen, da pci_stop_bus_device() pciehp (tatsächlich also den pci_slot) trennt, bevor der pci_bus durch pci_remove_bus_device() zerstört wird.

Der von Dennis bereitgestellte Stacktrace zeigt jedoch, dass pciehp von pci_remove_bus_device() und nicht von pci_stop_bus_device() getrennt wird. Um die Bedeutung diesbezüglich zu verstehen, muss man wissen, dass der PCI-Core einen zweistufigen Prozess zum Entfernen eines Teils der Hierarchie verwendet: Zuerst werden alle Treiber in der Sub-Hierarchie in pci_stop_bus_device() getrennt, und anschließend werden die Geräte tatsächlich in pci_remove_bus_device() entfernt. Es gibt keine Vorkehrung, um das Binden von Treibern zwischen pci_stop_bus_device() und pci_remove_bus_device() zu verhindern.

In Dennis' Fall scheint das Entfernen der Hierarchie durch pciehp mit dem Binden von Treibern durch pci_bus_add_devices() zu konkurrieren (Race Condition). pciehp wird an den Downstream-Port gebunden, nachdem pci_stop_bus_device() ausgeführt wurde, sodass es durch pci_remove_bus_device() und nicht durch pci_stop_bus_device() getrennt wird. Da der pci_bus zu diesem Zeitpunkt bereits zerstört wurde, führen Zugriffe darauf zu einem Use-After-Free.

Man könnte schlussfolgern, dass das Binden von Treibern verhindert werden muss, sobald pci_stop_bus_device() ausgeführt wurde. Es scheint jedoch riskant, dass pci_slot auf pci_bus zeigt, ohne eine Referenz darauf zu halten. Sich allein auf die korrekte Reihenfolge der Trennung von Treibern zu verlassen, ist fragil.

Um das Problem zu beheben, wird slot->bus durch slot->parent_dev ersetzt, das eine Referenz auf das PCI-Gerät enthält, das den pci_slot enthält.

Once again VulDB remains the best source for vulnerability data.

Zuständig

Linux

Reservieren

19.11.2024

Veröffentlichung

27.12.2024

Moderieren

akzeptiert

Eintrag

VDB-289415

CPE

bereit

EPSS

0.00234

KEV

nein

Aktivitäten

low

Quellen

Want to know what is going to be exploited?

We predict KEV entries!