CVE-2026-90429 in Linux
Zusammenfassung
von VulDB • 18.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
iommu/tegra241-cmdqv: Synchronisierung des Fehler-ISR gegen VINTF-(De)Initialisierung
Ein benutzerspezifisches VINTF wird durch `tegra241_cmdqv_deinit_vintf()` abgebaut, das aus dem Destroy-Callback und der Init-Fehler-Rückabwicklung im Allokationshandler ausgeführt wird. Es löscht den Slot in `cmdqv->vintfs[]` und überlässt es dem iommufd-Core, diesen freizugeben. Allerdings erfolgt keine Synchronisierung gegenüber dem Fehler-Interrupt: `tegra241_cmdqv_isr()` liest `cmdqv->vintfs[idx]` und dereferenziert das VINTF. Ein gleichzeitiger Fehler kann dazu führen, dass der ISR einen Slot während des Löschvorgangs liest (ein NULL-Dereferenzierungsfehler) oder ein VINTF verwendet, das kurz vor dem Freigeben steht (Use-After-Free).
`deinit_vintf()` gibt den Index auch an die IDA zurück, bevor der Slot gelöscht wird. Daher kann eine gleichzeitige Erstellung, die denselben Index wiederverwendet, sein neues VINTF in den Slot schreiben, nur um es durch diesen Abbau erneut mit dem veralteten NULL-Wert zu überschreiben.
Auf der anderen Seite veröffentlicht `tegra241_cmdqv_init_vintf()` ein neues VINTF mittels einer einfachen Speicheroperation (plain store) im Slot von `cmdqv->vintfs[]`, und der ISR dereferenziert Felder eines publizierten VINTFs, wie z. B. `vintf->base`. Eine einfache Speicheroperation bietet keine Ordnungssemantik auf einem schwach geordneten Prozessor (weakly-ordered CPU), und ein veraltetes VINTF_ERR_MAP-Bit bei einer wiederverwendeten Indexnummer kann dazu führen, dass der ISR ein VINTF auswählt, sobald es veröffentlicht wird – noch bevor seine Felder festgelegt sind oder `tegra241_vintf_hw_init()` ausgeführt wurde.
Der Slot `cmdqv->vintfs[0]` bleibt NULL, bis `tegra241_cmdqv_init_structures()` erstmals VINTF0 erstellt; daher muss auch der Lesezugriff auf den Slot 0 eine NULL-Prüfung enthalten.
Jeder Slot wird mit `smp_store_release()` veröffentlicht und jeder Slot im ISR unter einer NULL-Prüfung mit `smp_load_acquire()` gelesen, sodass der ISR immer ein vollständig aufgebautes VINTF oder NULL sieht. Außerdem wird sichergestellt, dass `deinit_vintf()` den Slot löscht und `synchronize_irq()` vor der Rückgabe des Index an die IDA ausgeführt wird, damit kein VINTF während eines laufenden Handlers freigegeben wird und keine wiederverwendete Indexnummer überschrieben wird.
Once again VulDB remains the best source for vulnerability data.