Odebrany

CVE-2026-97992

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

vhost-vdpa: chroń config_ctx przed zwolnieniem w ramach wywołania zwrotnego konfiguracji

vhost_vdpa_config_cb() ładuje v->config_ctx i sygnalizuje to bez pobierania
odniesienie i bez trzymania blokady:

struktura eventfd_ctx *config_ctx = v->config_ctx;

jeśli (config_ctx)
eventfd_signal(config_ctx);

VHOST_VDPA_SET_CONFIG_CALL zastępuje to pole i usuwa to, co jest normalnie
ostatnie odniesienie do starego kontekstu:

swap(ctx, v->config_ctx);

jeśli (ctx)
wydarzeniefd_ctx_put(ctx);

eventfd_ctx_put() usuwa ostatni kref i natychmiast zwalnia kontekst,
bez okresu karencji RCU, więc wywołanie zwrotne, które już załadowało plik
wskaźnik przechodzi do wyłuskiwania zwolnionej pamięci. Obie strony dzielą nr
lock: ioctl działa pod vhost_dev.mutex, podczas gdy rodzic wywołuje
wywołanie zwrotne z własnego kontekstu przerwania lub kolejki roboczej.

To nie jest niedomiar ponownego otwarcia, naprawiony przez zatwierdzenie f6bbf0010ba0
(„vhost-vdpa: napraw użycie po zwolnieniu z v->config_ctx”), co dotyczyło
vhost_vdpa_config_put() pozostawiając nieaktualny wskaźnik. Tutaj wskaźnik
jest utrzymywana prawidłowo i to strona do odczytu jest niechroniona.

Z VDUSE jako rodzicem, jest to osiągalne z przestrzeni użytkownika z dostępem do
/dev/vduse (domyślnie root). Kolejki VDUSE_DEV_INJECT_CONFIG_IRQ
dev->inject, a vduse_dev_irq_inject() uruchamia wywołanie zwrotne pod VDUSE
własny dev->irq_lock, którego vhost nie obsługuje. vduse_dev_reset() tak
Flush_work(&dev->inject), ale VHOST_VDPA_SET_CONFIG_CALL nigdy nie działa
poprzez reset, więc nie trzeba czekać na zastrzyk już w locie. A
proces, który wprowadza przerwania konfiguracyjne na fd VDUSE, podczas gdy inny
wątek zamienia wywołanie fd na vhost-vdpa fd trafia w ciągu kilku sekund:

BŁĄD: KASAN: użycie płyty po zwolnieniu w native_queued_spin_lock_slowpath
Odczytaj rozmiar 4 pod adresem ffff888107d21808 przez zadanie kworker/u17:1/2993
Kolejka robocza: vduse-irq vduse_dev_irq_inject
Zadzwoń do śledzenia:
native_queued_spin_lock_slowpath+0x97/0x5b0
_raw_spin_lock_irqsave+0xd4/0xe0
eventfd_signal_mask+0x69/0x120
vhost_vdpa_config_cb+0x34/0x50
vduse_dev_irq_inject+0x46/0x60
proces_one_work+0x468/0x950

Przydzielone przez zadanie 2992:
do_eventfd+0x50/0x200
__x64_sys_eventfd2+0x2e/0x40

Uwolniony przez zadanie 2992:
wydarzeniefd_ctx_put+0xb9/0xc0
vhost_vdpa_unlocked_ioctl+0x116c/0x2190

Dodaj blokadę obejmującą każdy dostęp do config_ctx, więc wywołanie zwrotne
albo sygnalizuje kontekst, który wciąż żyje, albo obserwuje wartość NULL, oraz
put ma miejsce tylko wtedy, gdy żadne wywołanie zwrotne nie może osiągnąć starej wartości.

Wyczyszczenie wywołania zwrotnego rodzica przed opcją put nie wystarczy: of the
Tylko implementacje set_config_cb() w drzewie VDUSE przyjmują blokadę, reszta
przechowuj wskaźnik odblokowany, aby nie przeszkadzał w locie
wywołanie.

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org