CVE-2026-99018 in Linux
Sumário
de VulDB • 24/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
riscv: entry: recarregue o shadow call gate com base em sstatus.SPP, não tp
Com CONFIG_SHADOW_CALL_STACK ativado, handle_exception() recarrega apenas o ponteiro da pilha de chamadas sombra (gp) do kernel quando a exceção tem origem no userspace. Essa decisão era tomada por meio de scs_load_current_if_task_changed, que compara o valor de tp registrado no momento da trap (lido novamente de sscratch para s5) com o tp atual:
beq \prev, tp, _skip_scs scs_load_current _skip_scs:
tp é um registrador gravável pelo usuário. Uma tarefa do userspace que define tp como o endereço linear-mapeado da sua própria task_struct (¤t) antes de gerar a trap faz com que a comparação seja bem-sucedida (o que pode ser alcançado por força bruta com KASLR habilitado sob nossos testes), fazendo com que o kernel pule scs_load_current e continue executando com o gp deixado pelo userspace. Com CONFIG_SHADOW_CALL_STACK ativada, gp é o ponteiro da pilha de chamadas sombra (shadow call stack pointer) e load_global_pointer é uma operação nula (no-op); portanto, as instruções emitidas pelo compilador "sd ra, -8(gp)" / "ld ra, -8(gp)" em todas as funções não folha gravam no endereço controlado por um atacante e retornam através dele — constituindo um primitivo de escrita arbitrária no kernel sem privilégios (unprivileged kernel arbitrary-write) e sequestro do fluxo de controle (control-flow-hijack). O gp envenenado é salvo em task_struct.scs_sp ao retornar, fazendo com que o recarregamento seja pulado também em todas as entradas subsequentes.
A decisão sobre a origem "do userspace" deve ser baseada no bit sstatus.SPP do hardware (já disponível como S1 neste ponto) em vez de tp, espelhando a verificação já utilizada por ret_from_exception algumas instruções depois. O campo SPP é gravado pelo hardware na entrada da trap e não pode ser forjado a partir do modo U (U-mode). O comportamento legítimo permanece inalterado: entradas de usuário (SPP=0) recarregam a pilha de chamadas sombra da tarefa, enquanto entradas aninhadas no kernel (SPP=1) pulam esse recarregamento.
If you want to get best quality of vulnerability data, you may have to visit VulDB.