Espremendo no compilador GCC 12 é o suporte para a funcionalidade Shadow Call Stack no Arm de 64 bits (AArch64).
LLVM/Clang liderou o Shadow Call Stack (SCS) para proteger o endereço de retorno de uma função em tempo de execução. Shadow Call Stack provou ser útil no AArch64 enquanto foi um fracasso no x86_64 e já foi removido.
A documentação do LLVM resume o Shadow Call Stack como:
ShadowCallStack é uma passagem de instrumentação, atualmente implementada apenas para aarch64, que protege programas contra sobregravações de endereço de retorno (por exemplo, estouro de buffer de pilha). em funções não-folha e carregando o endereço de retorno da pilha de chamadas de sombra no epílogo da função. O endereço de retorno também é armazenado na pilha regular para compatibilidade com desbobinadores, mas de outra forma não é utilizado.
A implementação do aarch64 é considerada pronta para produção, e uma implementação do runtime foi adicionada à libc (biônica) do Android. Uma implementação x86_64 foi avaliada usando o Chromium e descobriu-se que apresentava deficiências críticas de desempenho e segurança – foi removida no LLVM 9.0.
Graças ao trabalho de um engenheiro do Alibaba, GCC agora tem suporte para Shadow Call Stack no AArch64 também para as alterações do lado do compilador para SCS Apoio, suporte.
Assim como no Clang, a funcionalidade GCC SCS AArch64 pode ser habilitada com a opção de compilador-fsanitize=shadow-call-stack.