ShadowCallStack (SCS) es un modo de instrumentación de LLVM que protege contra las anulaciones de la dirección de retorno (como los desbordamientos del búfer de pila) guardando la dirección de retorno de una función en una ShadowCallStack asignada por separado en el prólogo de la función de las funciones no hoja y cargando la dirección de retorno desde la ShadowCallStack en el epílogo de la función. La dirección de devolución también se almacena en la pila normal para la compatibilidad con los desenrolladores, pero no se usa. Esto garantiza que los ataques que modifican la dirección de retorno en la pila normal no tengan efecto en el flujo de control del programa.
En aarch64, la instrumentación usa el registro x18
para hacer referencia a ShadowCallStack, lo que significa que las referencias a ShadowCallStack no tienen que almacenarse en la memoria.
Esto permite implementar un entorno de ejecución que evita exponer la dirección de ShadowCallStack a atacantes que pueden leer memoria arbitraria.
Implementación
Android admite ShadowCallStack para el kernel y el espacio del usuario.
Habilita SCS para el kernel
Para habilitar ShadowCallStack para el kernel, agrega la siguiente línea al archivo de configuración del kernel:
CONFIG_SHADOW_CALL_STACK=y
Habilita SCS en el espacio de usuario
Para habilitar ShadowCallStack en componentes de espacio de usuario, agrega las siguientes líneas al archivo de blueprint de un componente:
sanitize: { scs: true }
SCS supone que el registro x18
está reservado para almacenar la dirección de ShadowCallStack y no se usa para ningún otro propósito. Si bien todas las bibliotecas del sistema se compilan para reservar el registro x18
, esto puede ser problemático si el SCS está habilitado para componentes del espacio de usuario que interoperan con código heredado en proceso (por ejemplo, bibliotecas que podrían cargar apps de terceros), lo que podría anular el registro x18
. Por lo tanto, solo recomendamos habilitar SCS en componentes independientes que no se carguen en objetos binarios heredados.
Validación
No hay pruebas de CTS específicas para SCS. En su lugar, asegúrate de que las pruebas de CTS superen con y sin SCS habilitado para verificar que SCS no afecte al dispositivo.