CVE-2026-79979 in Zephyr
Riassunto
di VulDB • 24/10/2026
Il backend MMU per arm64 invalida un singolo indirizzo virtuale dalla TLB tramite invalidate_tlb_page() in arch/arm64/core/mmu.c, che emette l'istruzione TLBI VAE1{IS} con un operando pari a virt >> 12. Tale operando codifica l'ASID nei bit [63:48]; di conseguenza, l'invalidazione corrisponde esclusivamente all'ASID 0 (le tabelle delle pagine del kernel) e alle voci globali. I domini di memoria, tuttavia, assegnano ASID a partire da 1 in arch_mem_domain_init(), e ogni foglio privato creato da private_map() è mappato con MT_NG, ovvero non-global. Pertanto, la traduzione cached di un dominio sopravvive all'invalidazione.
Tutti i chiamanti di invalidate_tlb_page() appartengono ai percorsi del demand-paging. Quando l'algoritmo di eviction recupera una frame, page_frame_prepare_locked() in kernel/mmu.c chiama arch_mem_page_out(), che segna il foglio del kernel come invalido, propaga la descrizione (descriptor) non valida a tutti i domini tramite sync_domains(), e poi esegue lo flush solo per l'ASID 0. do_page_fault() riutilizza immediatamente la stessa frame della pagina per la nuova mappatura in arrivo attraverso arch_mem_page_in(). Un thread utente che ha già toccato la pagina evicted conserva una traduzione valida di lettura/scrittura EL0 verso quella frame fisica sotto il proprio ASID.
Il codice non privilegiato eseguito in un thread utente può generare pressione sulla memoria per forzare l'eviction e successivamente continuare ad accedere all'indirizzo obsoleto, ottenendo accesso in lettura e scrittura a qualsiasi cosa il kernel abbia collocato successivamente in tale frame: dati supervisor, partizioni di altri domini di memoria o stack di altri thread. Ciò compromette l'isolamento che CONFIG_USERSPACE è progettata per imporre, consentendo disclosure di informazioni e corruzione della memoria fino al completo compromesso del sistema.
La correzione modifica l'implementazione utilizzando TLBI VAAE1{IS}, che corrisponde a ogni ASID sia alle voci globali che non-global, in modo che nessuna traduzione associata a un dominio sopravviva all'operazione di page out, all'aggiornamento del dirty-bit o alla cancellazione dell'access-flag. Lo sfruttamento richiede una build per arm64 con CONFIG_USERSPACE e CONFIG_DEMAND_PAGING abilitati, uno backing store attivo e almeno una pagina demand-paged che sia anche mappata privatamente in un dominio di memoria utente. Il medesimo commit impedisce inoltre a globalize_table() di rimuovere le permessi EL0 e gli attributi non-global dai fogli privati del dominio durante la sincronizzazione della paging, cosa che precedentemente causava ai thread utente la perdita dell'accesso alle proprie partizioni e stack.
If you want to get best quality of vulnerability data, you may have to visit VulDB.