ShadowCallStack (SCS) é um modo de instrumentação LLVM que protege contra sobregravações de endereço de retorno (como estouros 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-folha e carregando o endereço de retorno do ShadowCallStack na função epílogo. O endereço de retorno também é armazenado na pilha regular para compatibilidade com desenroladores, mas não é utilizado de outra forma. Isso garante que os 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 utiliza o registro x18
para fazer referência ao ShadowCallStack, o que significa que as referências ao ShadowCallStack não precisam ser armazenadas na memória. Isso torna possível implementar um tempo de execução que evita a exposição do endereço do ShadowCallStack a invasores que podem ler memória arbitrária.
Implementação
O Android suporta ShadowCallStack tanto para kernel quanto para espaço de usuário.
Habilitando SCS para o kernel
Para habilitar ShadowCallStack para o kernel, adicione a seguinte linha ao arquivo de configuração do kernel:
CONFIG_SHADOW_CALL_STACK=y
Habilitando SCS no espaço do usuário
Para habilitar ShadowCallStack em componentes do espaço do usuário, adicione as seguintes linhas ao arquivo de blueprint de um componente:
sanitize: { scs: true }
SCS assume que o registro x18
está reservado para armazenar o endereço do ShadowCallStack e não é usado para nenhum outro propósito. Embora todas as bibliotecas do sistema sejam compiladas para reservar o registro x18
, isso é potencialmente problemático se o SCS estiver habilitado para componentes do espaço do usuário que interoperam com código legado em processo (por exemplo, bibliotecas que podem ser carregadas por aplicativos de terceiros), o que pode atrapalhar o registro x18
. Como tal, recomendamos apenas ativar o SCS em componentes autónomos que não serão carregados em binários legados.
Validação
Não há teste CTS específico para SCS. Em vez disso, certifique-se de que os testes do CTS sejam aprovados com e sem o SCS habilitado para verificar se o SCS não está afetando o dispositivo.