ShadowCallStack

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.