Embora o suporte Intel Shadow Stack exista desde as CPUs Tiger Lake como parte da Tecnologia de Aplicação de Fluxo de Controle (CET) da Intel, finalmente para o kernel Linux 6.4 esse recurso de segurança está sendo ativado com o kernel Linux principal.
Os engenheiros da Intel Linux trabalham há muito tempo no suporte à pilha de sombra como parte do CET. A outra parte do CET, Indirect Branch Tracking, foi upstream no Linux 5.18.
A funcionalidade de pilha de sombra da Intel para Linux 6.4 é proteção de endereço de retorno para se defender contra ataques de programação orientada a retorno (ROP). As CPUs AMD mais recentes também fornecem a funcionalidade Shadow Stack compatível com a implementação da Intel.
O antigo engenheiro da Intel Linux, Dave Hansen, enviou a solicitação pull x86/shstk na segunda-feira por finalmente introduzir esse recurso. Ele explicou nessa mensagem:
Por favor, puxe x86/shstk para 6.4. Este é o tão esperado suporte Shadow Stack. É o recurso de segurança de hardware mais desejado em muito tempo. Tanto a AMD quanto a Intel têm implementações (compatíveis). Ele está presente no lado da Intel desde os processadores de 11ª geração, mas teve alguns tropeços no caminho e está um pouco atrasado.
A parte mais complicada de tudo isso (IMNHO) foi que as pilhas de sombra existem em uma área cinza de permissão. Uma PTE de pilha de sombra diz literalmente Write=0, mas algumas instruções _podem_ gravar nela. Os PTEs também não podem ser somente leitura, portanto, não podem ser COW’d. Eles são estranhos.
As permissões Write=0,Dirty=1 PTE também significam que o bit sujo não pode ser usado tão livremente quanto antes. Essas duas coisas se combinam para criar uma boa quantidade de rotatividade de gerenciamento de PTE.
Mais algumas coisas que você deve saber:
1. Há uma quantidade não trivial de churn de mm de núcleo. Tem críticas do pessoal da mm e espero que não seja surpresa para o Andrew. Eles adicionam um argumento VMA a pte_mkwrite(). Há um novo usuário na pilha de Andrew que precisará ser consertado antes que seja mesclado com a árvore mm.
2. Houve um emaranhado incomum de problemas de compatibilidade de espaço de usuário com pilhas de sombra. Embora a mudança para os novos valores arch_prctl() tenha ajudado, ainda podemos imaginar cenários em que esse código antigo pode nos morder. O plano é tentar proibir qualquer aplicativo problemático de usar o shadow stack se algo acontecer na prática. Obviamente, devemos estar atentos a eles.
3. Isso entra em conflito com o código LAM que vem em x86/mm. Discutirei a resolução quando enviar x86/mm.
Até o momento, Linus Torvalds ainda não conseguiu o suporte Shadow Stack ou fez comentários na lista de discussão. Veremos se está tudo bem com Linus puxando esse recurso para o Linux 6.4 ou se ele tem reservas devido aos comentários acima. Esperançosamente, esse recurso de segurança Intel/AMD para ajudar a evitar ataques ROP será finalmente mesclado.