Odebrany

CVE-2026-89928

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ę:

KVM: x86/mmu: Zużywa zablokowaną wartość rmap podczas spaceru bez blokady

__kvm_rmap_lock() celowo pomija blokadę rmap, gdy zaobserwuje
pusta rama. W takim przypadku kvm_rmap_lock_readonly() również ponownie włącza
wywłaszczanie i zwraca zero, więc obiekt wywołujący nie posiada żadnej blokady rmap
ani odniesienia do wywłaszczenia. Elizja dokumentuje niezmiennik
opiera się na:

* Usuń blokadę, jeśli rmap jest pusta, ponieważ chodziki bez zamków (tylko do odczytu
* mode) nie muszą (i nie mogą) chodzić po pustej mapie, ani nie mogą dodawać
* wpisy do rmapu. Tj. jedyne ścieżki, które przetwarzają puste rmapy
* zrób to trzymając mmu_lock do zapisu i wzajemnie się wykluczają.

kvm_rmap_age_gfn_range() ignoruje zwróconą wartość i bezwarunkowo
wchodzi do for_each_rmap_spte_lockless(). Iterator zaczął się od
rmap_get_first(), która ponownie odczytuje rmap_head->val zamiast używać
wartość zwrócona przez blokadę. Jeśli moduł zapisujący zapełni rmap pomiędzy plikami
odczyt blokady i ponowny odczyt iteratora, ścieżka starzenia przechodzi na nowo
zainstalowałem rmap bez trzymania blokady.

W przypadku mapy KVM_RMAP_MANY oznacza to, że piechur podąża za a
łańcuch pte_list_desc, którego nigdy nie blokował. Pisarz posiadający mmu_lock dla
zapis może zwolnić ten łańcuch (np. kvm_zap_all_rmap_sptes() w koszu
path lub dowolny rmap zap) za pomocą kmem_cache_free() podczas spaceru
postęp, dzięki czemu płyta nie będzie już używana. Nic nie serializuje tych dwóch: the
ścieżka starzenia działa bez mmu_lock gdy CONFIG_KVM_MMU_LOCKLESS_AGING=y,
a blokada rmap, która w przeciwnym razie wykluczałaby autora, została usunięta.
Ponieważ pusta ścieżka ponownie umożliwia wywłaszczanie, odstęp między
dwa odczyty mogą obejmować dowolne opóźnienie planowania.

Napraw klasę błędu, powodując, że spacer bez zamka zużywa wartość
zwrócony przez zamek zamiast ponownego odczytania rmapu. Podziel
rmap_get_first() na __rmap_get_first(), która rozpoczyna iterator od
już przeczytaną wartość rmap i wykonaj funkcję for_each_rmap_spte_lockless().
tę wartość i bezpośrednio wywołaj funkcję __rmap_get_first().
kvm_rmap_age_gfn_range() przekazuje wartość zwróconą przez
kvm_rmap_lock_readonly(): gdy blokada została zdjęta, wartość wynosi zero,
__rmap_get_first() zwraca NULL i przechodzenie jest pomijane. Brak blokady
walker ponownie odczytuje rmap, więc niezmiennik blokady elizji nie może być
naruszona i do pliku nie jest dodawana żadna ścieżka lock()-without-paired-unlock().
kod starzenia.

>_ 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