ShadowCallStack

ShadowCallStack (SCS) es un modo de instrumentación LLVM que protege contra las sobrescrituras de la dirección de retorno (como los desbordamientos del búfer de pila) al guardar la dirección de retorno de una función en un ShadowCallStack asignado por separado en el prólogo de la función de las funciones sin hoja y cargar la dirección de retorno desde ShadowCallStack en la función. epílogo. La dirección de retorno también se almacena en la pila normal para compatibilidad con los desbobinadores, pero no se utiliza por lo demás. Esto asegura 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 utiliza el registro x18 para hacer referencia a ShadowCallStack, lo que significa que las referencias a ShadowCallStack no tienen que almacenarse en la memoria. Esto hace posible implementar un tiempo de ejecución que evita exponer la dirección de ShadowCallStack a atacantes que pueden leer memoria arbitraria.

Implementación

Android es compatible con ShadowCallStack tanto para el kernel como para el espacio de usuario.

Habilitación de SCS para el kernel

Para habilitar ShadowCallStack para el kernel, agregue la siguiente línea al archivo de configuración del kernel:

CONFIG_SHADOW_CALL_STACK=y

Habilitación de SCS en el espacio de usuario

Para habilitar ShadowCallStack en los componentes del espacio de usuario, agregue las siguientes líneas al archivo blueprint de un componente:

sanitize: {
  scs: true
}

SCS asume 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 es potencialmente problemático si SCS está habilitado para los componentes del espacio de usuario que interactúan con el código heredado en proceso (por ejemplo, bibliotecas que podrían cargar aplicaciones de terceros), lo que puede aplastar el registro x18 . Como tal, solo recomendamos habilitar SCS en componentes autónomos que no se cargarán en archivos binarios heredados.

Validación

No existe una prueba CTS específica para SCS. En su lugar, asegúrese de que las pruebas de CTS pasen con y sin SCS habilitado para verificar que SCS no esté afectando el dispositivo.