FERRAMENTAS LINUX: As Fraquezas do Linux kCFI/FineIBT são abordadas reescrevendo alguns conjuntos em C

segunda-feira, 17 de julho de 2023

As Fraquezas do Linux kCFI/FineIBT são abordadas reescrevendo alguns conjuntos em C


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.

A Fraqueza de segurança foi corrigida por um pouco menos de Assembly escrito à mão no kernel.

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.




Fonte

Até a próxima !!






Nenhum comentário:

Postar um comentário