ShadowCallStack (SCS) es un modo de instrumentación de LLVM que protege contra reemplazo de direcciones de devolución (como desbordamientos del búfer de pila) guardando la dirección de devolución a una ShadowCallStack asignada por separado en el prólogo de funciones que no son de hoja y la carga de la dirección de retorno desde ShadowCallStack en el epílog de la función. La dirección de devolución también se almacena en la pila regular para brindar compatibilidad con los desenrolladores, pero no se usa. Esto garantiza que los ataques que modifiquen la dirección de devolución en la pila normal no tienen efecto en el flujo de control del programa.
En aarch64, la instrumentación usa x18
.
para hacer referencia a ShadowCallStack, lo que significa que las
a ShadowCallStack no tienen que almacenarse en la memoria.
Esto permite implementar un entorno de ejecución que evite exponer
la dirección de ShadowCallStack a los atacantes que pueden leer
memoria arbitraria.
Implementación
Android admite ShadowCallStack tanto para el kernel como para el espacio del usuario.
Cómo habilitar SCS para el kernel
Para habilitar ShadowCallStack para el kernel, agrega la siguiente línea al archivo de configuración de kernel:
CONFIG_SHADOW_CALL_STACK=y
Habilitar SCS en el espacio del usuario
Para habilitar ShadowCallStack en los componentes del espacio de usuario, agrega el elemento siguientes líneas al archivo de plano de un componente:
sanitize: { scs: true }
SCS supone que el registro x18
está reservado para almacenar la dirección de la
ShadowCallStack y no se usa para ningún otro fin. Si bien todo el sistema
se compilan bibliotecas para reservar el registro x18
. Esto puede ser
problemático si SCS está habilitado para componentes del espacio del usuario que interoperan con
código heredado en proceso (por ejemplo, bibliotecas que podrían ser cargadas por terceros
apps), que pueden bloquear el registro x18
. Por eso, solo recomendamos
Habilitación de SCS en componentes autónomos que no se cargarán en versiones heredadas
binarios.
Validación
No hay una prueba de CTS específica para SCS. En cambio, asegúrate de que las pruebas del CTS aprueba con y sin SCS habilitado para verificar que SCS no tenga ningún impacto en la dispositivo.