CVE-2025-38670 in Linux
Sumário
de VulDB • 20/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
arm64/entry: Mascara DAIF em cpu_switch_to() e call_on_irq_stack()
`cpu_switch_to()` e `call_on_irq_stack()` manipulam SP para alternar entre diferentes pilhas, juntamente com a Shadow Call Stack (SCS), se estiver habilitada. Essas duas alterações de pilha não podem ser realizadas atomicamente e ambas as funções podem ser interrompidas por SErrors ou Debug Exceptions, o que, embora improvável, é extremamente problemático: se interrompidas, podemos acabar com pilhas e Shadow Call Stack dessincronizadas, levando ao corrompimento das pilhas.
Em `cpu_switch_to()`, isso pode ocorrer quando SP_EL0 aponta para a nova tarefa, mas x18 ainda aponta para a SCS da tarefa antiga. Quando o manipulador de interrupção tenta salvar o ponteiro SCS da tarefa, ele salvará o ponteiro SCS da tarefa antiga (x18) na estrutura da nova tarefa (apontada por SP_EL0), corrompendo-o.
Em `call_on_irq_stack()`, isso pode ocorrer ao alternar da pilha da tarefa para a pilha de IRQ e ao alternar de volta. Em ambos os casos, podemos ser interrompidos quando o ponteiro SCS aponta para a SCS de IRQ, mas SP aponta para a pilha da tarefa. O manipulador de interrupção aninhada empurra seus endereços de retorno para a SCS de IRQ. Em seguida, detecta que SP aponta para a pilha da tarefa, chama `call_on_irq_stack()` e corrompe o ponteiro SCS da tarefa com o ponteiro SCS de IRQ, que também será utilizado!
Isso leva a tarefas retornando a endereços na SCS errada, ou mesmo na SCS de IRQ, acionando kernel panics via CONFIG_VMAP_STACK ou FPAC, se habilitados.
Isso é possível em uma configuração padrão, mas improvável. No entanto, ao habilitar CONFIG_ARM64_PSEUDO_NMI, DAIF é desmascarado e em vez disso, o GIC é responsável por filtrar quais interrupções a CPU deve receber com base na prioridade. Dado o objetivo de emular NMIs, pseudo-NMIs podem ser recebidas pela CPU mesmo em `cpu_switch_to()` e `call_on_irq_stack()`, possivelmente *muito* frequentemente, dependendo da configuração do sistema e da carga de trabalho, levando a kernel panics imprevisíveis.
Mascara completamente DAIF em `cpu_switch_to()` e restaura-o ao retornar. Faça o mesmo em `call_on_irq_stack()`, mas restaure e mascare ao redor do branch. Mascara DAIF mesmo se CONFIG_SHADOW_CALL_STACK não estiver habilitada para consistência do comportamento entre todas as configurações.
Introduz e utiliza uma macro de assembly para salvar e mascarar DAIF, pois a existente salva, mas mascara apenas IF.
If you want to get best quality of vulnerability data, you may have to visit VulDB.