ShadowCallStack

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.