ShadowCallStack

ShadowCallStack (SCS) é um modo de instrumentação LLVM que protege contra sobregravaçõ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 nonleaf 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 desbobinadores, mas de outra forma não é utilizado. 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 faz uso do registro x18 para referenciar o ShadowCallStack, o que significa que as referências ao ShadowCallStack não precisam ser armazenadas na memória. Isso possibilita implementar um tempo de execução que evita expor o endereço do ShadowCallStack a invasores que podem ler memória arbitrária.

Implementação

O Android suporta ShadowCallStack para kernel e espaço de usuário.

Habilitando o 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

Ativando o SCS no espaço do usuário

Para habilitar ShadowCallStack em componentes de espaço do usuário, adicione as seguintes linhas ao arquivo de blueprint de um componente:

sanitize: {
  scs: true
}

O 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 de 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 habilitar o SCS apenas em componentes independentes que não serão carregados em binários herdados.

Validação

Não há teste CTS especificamente 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.