CVE-2025-38670 in Linuxinformazioni

Riassunto

di VulDB • 15/06/2026

Nel kernel Linux è stata risolta la seguente vulnerabilità:

arm64/entry: Maschera i flag DAIF in cpu_switch_to() e call_on_irq_stack()

`cpu_switch_to()` e `call_on_irq_stack()` manipolano il registro SP per passare a stack diversi, insieme allo Shadow Call Stack (SCS) se abilitato. Queste due modifiche dello stack non possono essere eseguite atomicamente ed entrambe le funzioni possono essere interrotte da SErrors o Debug Exceptions che, sebbene improbabili, causano un malfunzionamento grave: in caso di interruzione, si può finire con stack e Shadow Call Stack disallineati, portando alla corruzione degli stack.

In `cpu_switch_to()`, ciò può accadere quando SP_EL0 punta al nuovo task, ma x18 punta ancora allo SCS del vecchio task. Quando il gestore dell'interruzione tenta di salvare il puntatore SCS del task, salverà il puntatore SCS del vecchio task (x18) nella struttura dati del nuovo task (indicata da SP_EL0), corrompendolo.

In `call_on_irq_stack()`, ciò può accadere durante il passaggio dallo stack del task allo stack IRQ e viceversa. In entrambi i casi, si può essere interrotti quando il puntatore SCS punta allo SCS IRQ, ma SP punta allo stack del task. Il gestore dell'interruzione nidificata spinge gli indirizzi di ritorno sullo SCS IRQ. Rileva quindi che SP punta allo stack del task, chiama `call_on_irq_stack()` e corrompe il puntatore SCS del task con il puntatore SCS IRQ, che verrà anche utilizzato!

Ciò porta i task a tornare ad indirizzi presenti nello SCS errato o persino sullo SCS IRQ, innescando kernel panic tramite CONFIG_VMAP_STACK o FPAC se abilitati.

Questo scenario è possibile in una configurazione predefinita, ma improbabile. Tuttavia, quando si abilita CONFIG_ARM64_PSEUDO_NMI, i flag DAIF non sono mascherati e spetta invece al GIC filtrare le interruzioni che la CPU dovrebbe ricevere in base alla priorità. Dato l'obiettivo di emulare gli NMIs (Non-Maskable Interrupts), i pseudo-NMIs possono essere ricevuti dalla CPU anche durante `cpu_switch_to()` e `call_on_irq_stack()`, potenzialmente *molto* frequentemente a seconda della configurazione del sistema e del carico di lavoro, portando a kernel panic imprevedibili.

Maschera completamente DAIF in `cpu_switch_to()` e ripristinalo al ritorno. Fai la stessa cosa in `call_on_irq_stack()`, ma ripristina e maschera attorno all'istruzione branch (salto). Maschera DAIF anche se CONFIG_SHADOW_CALL_STACK non è abilitato, per garantire coerenza del comportamento tra tutte le configurazioni.

Introduci e utilizza una macro assembly per salvare e mascherare DAIF, poiché quella esistente salva ma maschera solo IF.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsabile

Linux

Prenotare

16/04/2025

Divulgazione

22/08/2025

Moderazione

accettato

CPE

pronto

EPSS

0.00142

KEV

no

Attività

molto basso

Fonti

Might our Artificial Intelligence support you?

Check our Alexa App!