ShadowCallStack

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.