Antes do lançamento do Kernel Linux 6.5-rc2, foi mesclado um conjunto de alterações no código do kernel x86/x86_64 durante a noite para lidar com algumas vulnerabilidades no código de Integridade do Fluxo de Controle (kCFI) / FineIBT (Indirect Branch Tracking) do kernel.
Desde os dias do Kernel Linux 6.1, o código de integridade do fluxo de controle do kernel tem sido uma alternativa confiável ao código CFI anterior. No Kernel Linux 6.2, foi introduzido o FineIBT como um esquema CFI alternativo, que utiliza o kCFI fornecido pelo compilador em conjunto com a integridade do fluxo de controle de hardware proporcionada pelo Indirect Branch Tracking da Intel.
Esses esforços têm como objetivo impedir ataques de sequestro de fluxo de controle no kernel, mas recentemente foram descobertas algumas vulnerabilidades no código do kernel. Durante a noite, foi mesclado um novo código para lidar com essas fraquezas, e parte da solução é reescrever parte do código Assembly em C.
O engenheiro da Intel, Peter Zijlstra, resumiu na solicitação pull:
O principal problema observado por Alyssa foi que, com o FineIBT ativado, os prólogos das funções possuem uma instrução ENDBR espúria:
__cfi_foo:
endbr64
subl $hash, %r10d
jz 1f
ud2
nop
1:
foo:
endbr64 <---sadface
Isso significa que qualquer chamada indireta que falhe em atingir o símbolo __cfi e, em vez disso, direcione-se para (o antigo normal) foo+0, será bem-sucedida devido a esse segundo ENDBR.
A correção desse problema levou à descoberta de uma única chamada indireta que ainda estava causando o problema: ret_from_fork(). Como se trata de um stub de montagem, o compilador não gerava a chamada indireta kCFI apropriada, e isso não estava sendo corrigido.
Brian criou uma correção mais abrangente - converter a parte relevante para C, com apenas um invólucro asm muito fino. Isso garante que o bootstrap do encadeamento do kernel seja uma chamada kCFI adequada.
Durante as discussões sobre o assunto, Kees observou que os hashes kCFI poderiam/deveriam ser envenenados para selar todas as funções cujo endereço nunca é obtido, limitando ainda mais os alvos válidos do kCFI - assim como já fazemos com o IBT.
Assim, o que começou como uma observação e correção "simples" se transformou em uma série de correções inter-relacionadas na infraestrutura do CFI.
Esse código foi mesclado antes do Kernel Linux 6.5-rc2 e, como fornece correções, acabará sendo portado para as séries recentes e estáveis do kernel também.
Até a próxima !!
Nenhum comentário:
Postar um comentário