ShadowCallStack

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.