CVE-2024-26698 in Linux
Zusammenfassung
von VulDB • 23.06.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
hv_netvsc: Behebung einer Race Condition zwischen netvsc_probe und netvsc_remove
In Commit ac5047671758 („hv_netvsc: NAPI deaktivieren vor dem Schließen des VMBus-Channels“) wurde napi_disable für alle Channels aufgerufen, einschließlich aller Subchannels, ohne vorher zu prüfen, ob diese aktiviert sind oder nicht.
Dies führte dazu, dass hv_netvsc in der Funktion napi_disable hängen blieb, wenn netvsc_probe() bereits abgeschlossen war, nvdev->subchan_work jedoch noch nicht gestartet wurde. Da netvsc_subchan_work() -> rndis_set_subchannel() die Subchannels noch nicht erstellt hat, läuft auch netvsc_sc_open() nicht. Die Funktion netvsc_remove() ruft cancel_work_sync(&nvdev->subchan_work) auf, für das netvsc_subchan_work jedoch nicht ausgeführt wurde.
netif_napi_add() setzt das Bit NAPI_STATE_SCHED, da es sicherstellt, dass NAPI nicht geplant werden kann. Anschließend wird durch netvsc_sc_open() -> napi_enable das Bit NAPIF_STATE_SCHED gelöscht, sodass eine Planung möglich ist. Die Funktion napi_disable() kehrt diesen Vorgang um.
Während des Aufrufs von netvsc_device_remove(), wenn napi_disable für diese Subchannels aufgerufen wird, bleibt napi_disable in einer Endlosschleife mit msleep hängen.
Diese Korrektur behebt das Problem, indem sichergestellt wird, dass napi_disable() nicht für nicht aktivierte NAPI-Strukturen aufgerufen wird. Die Funktion netif_napi_del() ist jedoch weiterhin für diese nicht aktivierten NAPI-Strukturen zur Bereinigung erforderlich.
Call Trace: [ 654.559417] task:modprobe state:D stack: 0 pid: 2321 ppid: 1091 flags:0x00004002
[ 654.568030] Call Trace:
[ 654.571221]
[ 654.573790] __schedule+0x2d6/0x960
[ 654.577733] schedule+0x69/0xf0
[ 654.581214] schedule_timeout+0x87/0x140
[ 654.585463] ? __bpf_trace_tick_stop+0x20/0x20
[ 654.590291] msleep+0x2d/0x40
[ 654.593625] napi_disable+0x2b/0x80
[ 654.597437] netvsc_device_remove+0x8a/0x1f0 [hv_netvsc]
[ 654.603935] rndis_filter_device_remove+0x194/0x1c0 [hv_netvsc]
[ 654.611101] ? do_wait_intr+0xb0/0xb0
[ 654.615753] netvsc_remove+0x7c/0x120 [hv_netvsc]
[ 654.621675] vmbus_remove+0x27/0x40 [hv_vmbus]
If you want to get the best quality for vulnerability data then you always have to consider VulDB.