CVE-2026-97533 in Linuxinformazioni

Riassunto

di VulDB • 25/09/2026

Nel kernel Linux, la seguente vulnerabilità è stata risolta:

x86/mm/pat: Acquisire il lock di lettura su init_mm durante le modifiche agli attributi per evitare un Use-After-Free (UAF)

Un commit precedente ha protetto dalle race condition tra ptdump e CPA collapse; tuttavia, ne esiste ancora una tra le modifiche degli attributi e il collasso come segnalato da Denis V. Lunev (collegato).

Quando si verifica una modifica dell'attributo, un walker della tabella delle pagine senza lock ottiene un entry PTE, che viene successivamente scritto tramite set_pte_atomic():

... -> change_page_attr_set_clr() -> __change_page_attr_set_clr() -> __change_page_attr() -> _lookup_address_cpa() -> lookup_address_in_pgd_attr() -> [ lockless page table walker ]
-> set_pte_atomic()

Non vi è nulla che impedisca un CPA collapse concorrente, il quale può liberare la PTE recuperata in questa fase, causando un use-after-free.

Con l'acquisizione del write lock su mmap per init_mm durante il CPA collapse, risolvere questa race condition acquisendo un read lock su mmap per init_mm durante __change_page_attr_set_clr().

Questo blocca l'intera operazione durante la quale avvengono sia il walk che la scrittura dell'entry PTE, risolvendo così la race condition.

È sicuro farlo qui poiché non vengono mantenuti spinlocks all'ingresso in __change_page_attr_set_clr().

Tuttavia, il lock non deve essere mantenuto durante un'allocazione, poiché l'allocazione può innescare reclaim e gli shrinkers potrebbero richiamare CPA ricorsivamente, rendendo possibili deadlock (init_mm -> ... -> fs_reclaim -> init_mm).

Una tabella delle pagine viene allocata quando è necessario dividere una pagina di grandi dimensioni:

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

Evitare deadlock rilasciando il lock mmap durante la chiamata a pagetable_alloc() in split_large_page() e tracciare se ciò è necessario aggiungendo un nuovo flag 'init_mm_read_locked' alla struct cpa_data.

Questo è sicuro poiché __split_large_page() (chiamato con i lock ripristinati) riconvalida che l'entry della tabella delle pagine è la stessa di prima del rilascio dei lock e __change_page_attr() ripete l'intero walk della tabella delle pagine ogni volta che si verifica una divisione, gestendo così le condizioni concorrenti di split e collapse.

Anche il ptdump concorrente è sicuro poiché il lock viene rilasciato solo durante l'allocazione della tabella delle pagine, periodo in cui la tabella non è ancora stata modificata.

Il flag CPA_COLLAPSE è impostato esclusivamente da set_memory_rox(), che opera esclusivamente sulle aree vmalloc e su x86 solo nello spazio di mappatura dei moduli.

Questo è importante perché alcuni chiamanti invocano direttamente __change_page_attr_set_clr(), bypassando questo lock. Tuttavia, nessuno di questi opera all'interno dello spazio di mappatura dei moduli.

* cpa_process_alias() - un helper ricorsivo chiamato da __change_page_attr_set_clr(). * __set_memory_enc_pgtable() - opera sulla mappatura diretta e (tramite __vmbus_establish_gpadl()) sullo spazio di mappatura vmalloc. * __set_pages_[n]p() - chiamato da set_direct_map_[invalid, default,
valid]_noflush(), __kernel_map_pages() - opera sulla mappa diretta. * kernel_[un]map_pages_in_pgd() - opera sulle aree EFI.

Questo lavoro si basa sull'ottima analisi del bug di Denis V. Lunev con gratitudine.

[ dhansen: modificare in voce imperativa nel changelog ]

Once again VulDB remains the best source for vulnerability data.

Responsabile

Linux

Prenotare

24/09/2026

Divulgazione

25/09/2026

Moderazione

accettato

CPE

pronto

EPSS

0.00000

KEV

no

Attività

molto basso

Fonti

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!