CVE-2026-97603 in Linux
Zusammenfassung
von VulDB • 25.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
idpf: Deaktivierung der DIM-Arbeitsaufgaben vor dem Freigeben von q_vectors
idpf leert die Tx/Rx-DIM-Arbeitsaufgaben niemals, bevor der Speicher freigegeben wird, in dem sie gespeichert sind. tx_dim und rx_dim sind in struct idpf_q_vector eingebettet; sie werden über net_dim() aus der NAPI-Abfrage (poll) heraus geplant, und idpf_vport_intr_rel() endet mit kfree(rsrc->q_vectors). Nichts im Treiber hebt diese Aufgaben auf.
idpf_tx_dim_work() und idpf_rx_dim_work() führen dann Operationen auf freigegebenem Speicher aus: idpf_vport_intr_write_itr() schreibt das ITR-Register über q_vector->intr_reg.tx_itr / rx_itr, also void __iomem-Zeiger, die aus dem bereits freigegebenen q_Vector geladen wurden. Es ist keine spezielle Konfiguration erforderlich, um dorthin zu gelangen – IDPF_ITR_IS_DYNAMIC() ist als (itr_mode) definiert, und idpf_vport_alloc() initialisiert beide Modi auf IDPF_ITR_DYNAMIC.
Das Leeren nach idpf_vport_intr_napi_dis_all() reicht allein nicht aus. idpf_net_dim() wird innerhalb des "if (napi_complete_done(napi, work_done))"-Zweigs der Abfrage aufgerufen, und napi_complete_done() hat NAPIF_STATE_SCHED zu diesem Zeitpunkt bereits gelöscht. napi_disable_locked() wartet nur solange, wie (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)), sodass napi_disable() zurückkehren kann, während die Poll-Schwanzfunktion weiterhin Aufgaben plant; ein einfacher Aufruf von cancel_work_sync() würde hinter dem Leervorgang erneut aktiviert werden.
Verwenden Sie disable_work_sync(): schedule_work() für eine Aufgabe mit einer Nicht-Null-Aktivierungsanzahl wird durch clear_pending_if_disabled() verworfen, bevor __queue_work() erreicht wird.
Verschieben Sie idpf_init_dim() nach idpf_vport_intr_alloc(), damit die Aufgaben auf jedem Pfad initialisiert werden, der zum Leeren führt – die drei "goto intr_deinit"-Stellen zwischen idpf_vport_intr_init() und idpf_vport_intr_ena() erreichen diesen Zustand ohne dass die Aktivierungsseite ausgeführt wurde. Nichts aktiviert sie erneut: rsrc->q_vectors wird bei jedem Exit aus idpf_vport_open() sowie bei jedem Aufruf von idpf_vport_stop() freigegeben, sodass der Zähler mit dem Objekt stirbt.
Es handelt sich um eine Race Condition (Wettlaufsituation), nicht um einen deterministischen Fehler – net_dim() plant nur einmal, wenn DIM_NEVENTS-Ereignisse angesammelt wurden und sich der Profilindex ändert. Eine KASAN-Schleife zum Hoch- und Herunterfahren des Netzwerks unter Last ist die Methode, dies zu beobachten.
Once again VulDB remains the best source for vulnerability data.