O ShadowCallStack (SCS) é um modo de instrumentação LLVM que protege contra endereços de retorno são substituídos (como estouro de buffer de pilha) salvando o retornar um endereço para um ShadowCallStack alocado separadamente em o prólogo da função de funções não folha e carregar o endereço de retorno da ShadowCallStack no epílogo da função. O endereço de devolução também é armazenado na pilha regular para compatibilidade com desbobinadores, mas não é utilizado. Isso garante que os ataques que modificam o endereço de retorno na pilha regular não afetam o fluxo de controle do programa.
No aarch64, a instrumentação usa o x18
.
registrar-se para referenciar o ShadowCallStack, o que significa que
para ShadowCallStack não precisam ser armazenados na memória.
Com isso, é possível implementar um ambiente de execução que evita a exposição
o endereço do ShadowCallStack para invasores que podem ler
de memória arbitrária.
Implementação
O Android oferece suporte ao ShadowCallStack para o kernel e o espaço do usuário.
Ativar SCS para o kernel
Para ativar o ShadowCallStack para o kernel, adicione a seguinte linha ao arquivo de configuração do kernel:
CONFIG_SHADOW_CALL_STACK=y
Ativar SCS no espaço do usuário
Para ativar o ShadowCallStack em componentes do espaço do usuário, adicione o linhas a seguir ao arquivo de blueprint de um componente:
sanitize: { scs: true }
O SCS presume que o registro x18
está reservado para armazenar o endereço do
ShadowCallStack e não é usada para nenhuma outra finalidade. Embora todo o sistema
bibliotecas são compiladas para reservar o registro x18
, isso pode
problemático se o SCS estiver ativado para componentes do espaço do usuário que interoperem com
códigos legados no processo (por exemplo, bibliotecas que podem ser carregadas por
apps), o que pode danificar o registro x18
. Por isso, recomendamos apenas
ativar a SCS em componentes independentes que não serão carregados nas versões legadas
binários.
Validação
Não há teste CTS especificamente para SCS. Em vez disso, confirme se os testes do CTS sejam aprovados com e sem o SCS ativado para verificar se o SCS não está afetando o dispositivo.