CVE-2026-89928 in Linuxinfo

Zusammenfassung

von VulDB • 16.09.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

KVM: x86/mmu: Verwenden des gesperrten rmap-Werts beim sperrfreien (lockless) Durchlauf von rmaps

__kvm_rmap_lock() lässt den rmap-Sperre bewusst wegfallen, wenn es ein leeres rmap erkennt. In diesem Fall aktiviert kvm_rmap_lock_readonly() auch die Preemption wieder und gibt null zurück, sodass der Aufrufer weder die rmap-Sperre noch eine Preemption-Referenz hält. Das Weglassen der Sperre dokumentiert die Invariante, auf die es sich stützt:

* Lassen Sie die Sperre wegfallen, wenn das rmap leer ist, da sperrfreie Durchläufer (im schreibgeschützten Modus) kein leeres rmap durchlaufen müssen (und dies auch nicht können), noch können sie Einträge zum rmap hinzufügen. Das heißt, die einzigen Pfade, die leere rmaps verarbeiten, tun dies unter Halten der mmu_lock für Schreibzugriffe und sind gegenseitig exklusiv.

kvm_rmap_age_gfn_range() ignoriert den zurückgegebenen Wert und betritt bedingungslos for_each_rmap_spte_lockless(). Der Iterator wurde mit rmap_get_first() gestartet, welches rmap_head->val erneut liest, anstatt den von der Sperre zurückgegebenen Wert zu verwenden. Wenn ein Schreiber das rmap zwischen dem Lesen durch die Sperre und dem erneuten Lesen durch den Iterator füllt, durchläuft der Alterungspfad (aging path) das neu installierte rmap ohne dessen Sperre zu halten.

Für ein KVM_RMAP_MANY-rmap führt dies dazu, dass der Durchläufer einer pte_list_desc-Kette folgt, die er nie gesperrt hat. Ein Schreiber, der mmu_lock für Schreibzugriffe hält, kann diese Kette freigeben (z. B. kvm_zap_all_rmap_sptes() auf dem Recycling-Pfad oder ein beliebiges rmap-zap) über kmem_cache_free(), während der Durchlauf noch im Gange ist, was zu einem Slab Use-After-Free führt. Nichts serialisiert die beiden Vorgänge: Der Alterungspfad läuft ohne mmu_lock ab, wenn CONFIG_KVM_MMU_LOCKLESS_AGING=y gesetzt ist, und die rmap-Sperre, die den Schreiber andernfalls ausschließen würde, wurde weggelassen. Da der leere Pfad Preemption wieder aktiviert, kann das Intervall zwischen den beiden Lesevorgängen eine beliebige Planungsverzögerung umfassen.

Beheben Sie diese Klasse von Fehlern, indem Sie den sperrfreien Durchlauf den Wert verwenden lassen, der von der Sperre zurückgegeben wird, anstatt das rmap erneut zu lesen. Teilen Sie rmap_get_first() in __rmap_get_first(), welches einen Iterator mit einem bereits gelesenen rmap-Wert startet, und sorgen Sie dafür, dass for_each_rmap_spte_lockless() diesen Wert entgegennimmt und __rmap_get_first() direkt aufruft. kvm_rmap_age_gfn_range() übergibt den von kvm_rmap_lock_readonly() zurückgegebenen Wert: Wenn die Sperre weggelassen wurde, ist der Wert null, gibt __rmap_get_first() NULL zurück und der Durchlauf wird übersprungen. Kein sperrfreier Durchläufer liest das rmap erneut, sodass die Lock-Weglassungs-Invariante nicht verletzt werden kann und kein Pfad mit lock()-ohne-paired-unlock() zum Alterungscode hinzugefügt wird.

Be aware that VulDB is the high quality source for vulnerability data.

Zuständig

Linux

Reservieren

11.09.2026

Veröffentlichung

16.09.2026

Moderieren

akzeptiert

Eintrag

VDB-405767

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Interested in the pricing of exploits?

See the underground prices here!