CVE-2026-68329 in Linux
Zusammenfassung
von VulDB • 10.08.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
iommu/amd: Warten auf den Abschluss statt vorzeitiger Rückgabe in iommu_completion_wait()
need_sync ist eine pro-IOMMU-Flagge, die von allen Domänen und Geräten hinter diesem IOMMU gemeinsam genutzt wird. Sie wird gesetzt, wenn ein Befehl mit sync == true eingereiht wird, und gelöscht, wenn ein Completion-Wait (CWAIT)-Befehl eingereiht wird. Ein gelöschtes need_sync bedeutet jedoch nur, dass ein abdeckender CWAIT-Befehl eingereiht wurde, nicht aber, dass alle zuvor eingereihten Befehle tatsächlich in der Hardware abgeschlossen wurden.
iommu_completion_wait() las need_sync sperrfrei und gab vorzeitig zurück, wenn dieser Wert falsch war. Dies verletzt den Vertrag „blockieren, bis alle zuvor eingereihten Befehle abgeschlossen sind", in einem Multi-CPU-Szenario:
CPU2: queue inv-B => need_sync = true CPU1: queue CWAIT(N); need_sync = false; dann wait_on_sem(N) CPU2: read need_sync == false => return 0 (kein Warten!)
CPU2 gibt zurück, ohne auf eine Sequenznummer zu warten, obwohl sein inv-B möglicherweise noch nicht abgeschlossen wurde (CWAIT(N), das nach inv-B eingereiht wurde, ist noch nicht signalisiert). CPU1 fährt dann fort, beispielsweise Seiten-Tabellen-Seiten freizugeben, während der IOMMU weiterhin veraltete Übersetzungen durchlaufen kann, was ein Use-after-Free-Fenster öffnet. Dies ist eine logische Race Condition in der Bedeutung der Flagge und kein Speicher-Sichtbarkeitsproblem, daher helfen Barrieren allein nicht weiter.
Beheben Sie das Problem ohne Verlust der Optimierung zur Vermeidung redundanter CWAIT-Befehle: Nehmen Sie iommu->lock vor dem Test von need_sync an, und geben Sie bei einem falschen Wert nicht vorzeitig zurück, sondern warten Sie auf die zuletzt zugewiesene Sequenznummer (cmd_sem_val). Da need_sync == false impliziert, dass nach dem letzten CWAIT kein Sync-Befehl eingereiht wurde, ist dieser CWAIT FIFO-geordnet hinter jedem noch nicht abgeschlossenen Befehl platziert. Das Warten auf dessen Sequenznummer garantiert daher, dass alle vorherigen Befehle (die möglicherweise von einer anderen CPU eingereiht wurden) abgeschlossen sind. Der häufige Pfad mit ausstehender Arbeit bleibt unverändert und es wird kein zusätzlicher Hardware-Befehl ausgegeben.
If you want to get best quality of vulnerability data, you may have to visit VulDB.