CVE-2026-97533 in Linuxinfo

Zusammenfassung

von VulDB • 25.09.2026

Im Linux-Kernel wurde folgende Schwachstelle behoben:

x86/mm/pat: Erwerben des init_mm-Lese-Sperres bei Attributänderungen, um Use-After-Free (UAF) zu vermeiden.

Ein vorheriger Commit schützte vor Wettläufen zwischen ptdump und CPA-Collapse; jedoch besteht weiterhin ein solcher Wettbewerb zwischen Attributänderungen und Collapse, wie von Denis V. Lunev gemeldet (verlinkt).

Wenn eine Attributänderung auftritt, erhält ein sperrloser Page-Table-Walker einen PTE-Eintrag, der später über set_pte_atomic() beschrieben wird:

... -> change_page_attr_set_clr() -> __change_page_attr_set_clr() -> __change_page_attr() -> _lookup_address_cpa() -> lookup_address_in_pgd_attr() -> [ sperrloser Page-Table-Walker ]
-> set_pte_atomic()

Es gibt nichts, das einen gleichzeitigen CPA-Collapse verhindert, der den hier abgerufenen PTE freigeben kann, was zu einem Use-After-Free führt.

Durch Anlegen der mmap-Schreibsperre auf init_mm während des CPA-Collapses wird dieser Wettlauf behoben, indem eine mmap-Lesesperre für init_mm bei __change_page_attr_set_clr() erworben wird.

Dies sperrt den gesamten Vorgang ab, über den der Walk und das Schreiben des PTE-Eintrags erfolgen, wodurch der Wettlauf gelöst wird.

Es ist hier sicher, dies zu tun, da beim Eintritt in __change_page_attr_set_clr() keine Spinlocks gehalten werden.

Die Sperre darf jedoch nicht während einer Allokation gehalten werden, da eine Allokation Reclaim auslösen kann und Shrinker rekursiv in CPA aufrufen können, was Deadlocks ermöglicht (init_mm -> ... -> fs_reclaim -> init_mm).

Eine Page-Table wird alloziert, wenn ein Huge-Pages aufgeteilt werden muss:

-> change_page_attr_set_clr() -> __change_page_attr_set_clr() -> __change_page_attr() -> split_large_page() [ pagetable_alloc() ]
-> __split_large_page()

Vermeiden Sie Deadlocks, indem Sie die mmap-Sperre während der pagetable_alloc()-Funktion in split_large_page() freigeben und verfolgen, ob dies erforderlich ist, indem Sie ein neues Flag 'init_mm_read_locked' zur Struktur cpa_data hinzufügen.

Dies ist sicher, da __split_large_page() (aufgerufen mit wiederhergestellten Sperren) überprüft, dass der Page-Table-Eintrag derselbe ist wie vor dem Freigeben der Sperren, und __change_page_attr() den gesamten Page-Table-Walk bei jeder Aufteilung erneut durchführt, sodass gleichzeitige Split- und Collapse-Vorgänge berücksichtigt werden.

Auch ein gleichzeitiger ptdump ist sicher, da die Sperre nur während der Page-Table-Allokation freigegeben wird, zu diesem Zeitpunkt jedoch noch keine Änderungen an der Page-Table vorgenommen wurden.

Das CPA_COLLAPSE-Flag wird ausschließlich von set_memory_rox() festgelegt, das exklusiv mit vmalloc-Bereichen arbeitet und auf x86 nur im Modul-Mapping-Raum erfolgt.

Dies ist wichtig, da einige Aufrufer __change_page_attr_set_clr() direkt aufrufen und diese Sperre umgehen. Keiner dieser Aufrufer operiert jedoch innerhalb des Modul-Mapping-Raums.

* cpa_process_alias() - ein rekursiver Helfer, der von __change_page_attr_set_clr() aufgerufen wird. * __set_memory_enc_pgtable() - arbeitet am direkten Mapping und (über __vmbus_establish_gpadl()) im vmalloc-Mapping-Raum. * __set_pages_[n]p() - aufgerufen von set_direct_map_[invalid, default,
valid]_noflush(), __kernel_map_pages() - arbeitet am Direct-Map-Bereich. * kernel_[un]map_pages_in_pgd() - arbeitet an EFI-Bereichen.

Diese Arbeit basiert auf der hervorragenden Analyse des Fehlers durch Denis V. Lunev; dafür sei gedankt.

[ dhansen: Wechsel zur imperativen Stimme im Changelog ]

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Zuständig

Linux

Reservieren

24.09.2026

Veröffentlichung

25.09.2026

Moderieren

akzeptiert

Eintrag

VDB-409912

CPE

bereit

EPSS

0.00000

KEV

nein

Aktivitäten

very low

Quellen

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!