O ShadowCallStack (SCS) é um modo de instrumentação LLVM que protege contra substituições de endereço de retorno (como estouro de buffer de pilha) salvando o endereço de retorno de uma função em um ShadowCallStack alocado separadamente no prólogo da função de funções não-folhas e carregando o endereço de retorno do ShadowCallStack no epílogo da função. O endereço de retorno também é armazenado na pilha regular para compatibilidade com desrolamentos, mas não é usado. Isso garante que ataques que modificam o endereço de retorno na pilha regular não tenham efeito no fluxo de controle do programa.
No aarch64, a instrumentação usa o registro x18
para fazer referência à ShadowCallStack, o que significa que as referências
à ShadowCallStack não precisam ser armazenadas na memória.
Isso permite implementar um ambiente de execução que evita expor
o endereço da ShadowCallStack para invasores que podem ler
memória arbitrária.
Implementação
O Android oferece suporte a ShadowCallStack para kernel e espaço do usuário.
Ativar a SCS para o kernel
Para ativar a ShadowCallStack para o kernel, adicione a seguinte linha ao arquivo de configuração do kernel:
CONFIG_SHADOW_CALL_STACK=y
Ativar a SCS no espaço do usuário
Para ativar a ShadowCallStack em componentes do espaço do usuário, adicione as linhas abaixo ao arquivo de modelo de um componente:
sanitize: { scs: true }
O SCS presume que o registro x18
está reservado para armazenar o endereço da
ShadowCallStack e não é usado para outras finalidades. Embora todas as bibliotecas
do sistema sejam compiladas para reservar o registro x18
, isso pode ser
problemático se o SCS estiver ativado para componentes do espaço do usuário que interagem com
códigos legados em processo (por exemplo, bibliotecas que podem ser carregadas por apps
de terceiros), o que pode sobrescrever o registro x18
. Portanto, só recomendamos
ativar o SCS em componentes independentes que não serão carregados em binários
legados.
Validação
Não há um teste CTS específico para o SCS. Em vez disso, verifique se os testes de CTS são aprovados com e sem o SCS ativado para verificar se o SCS não está afetando o dispositivo.