ShadowCallStack

ShadowCallStack (SCS) est une instrumentation de LLVM mode qui protège contre les écrasements d'adresse de retour (comme pile tampon déborde) en enregistrant l'adresse de retour d'une fonction à une ShadowCallStack allouée séparément dans la fonction prolog de fonctions non - feuilles et le chargement de l'adresse de retour de la ShadowCallStack dans la fonction épilogue. L'adresse de retour est également stockée sur la pile normale pour la compatibilité avec les dérouleurs, mais n'est pas utilisée par ailleurs. Cela garantit que les attaques qui modifient l'adresse de retour sur la pile normale n'ont aucun effet sur le flux de contrôle du programme.

Sur aarch64, les marques d'instrumentation utilisent du x18 registre pour faire référence au ShadowCallStack, ce qui signifie que les références à la ShadowCallStack ne doivent pas être stockés dans la mémoire. Cela permet d'implémenter un runtime qui évite d'exposer l'adresse du ShadowCallStack à des attaquants pouvant lire de la mémoire arbitraire.

Mise en œuvre

Android prend en charge ShadowCallStack pour le noyau et l'espace utilisateur.

Activer SCS pour le noyau

Pour activer ShadowCallStack pour le noyau, ajoutez la ligne suivante au fichier de configuration du noyau :

CONFIG_SHADOW_CALL_STACK=y

Activer SCS dans l'espace utilisateur

Pour activer ShadowCallStack dans les composants de l'espace utilisateur, ajoutez les lignes suivantes au fichier de plan d'un composant :

sanitize: {
  scs: true
}

SCS suppose que le x18 registre est réservé pour stocker l'adresse du ShadowCallStack, et ne sert pas à d'autres fins. Alors que toutes les bibliothèques du système sont compilées pour réserver le x18 registre, cela est potentiellement problématique si SCS est activé pour les composants de l' espace utilisateur qui interopérer avec le code existant en cours (par exemple, les bibliothèques qui pourraient être chargés par des applications tierces), qui peut écraserait le x18 registre. En tant que tel, nous vous recommandons d'activer SCS uniquement dans les composants autonomes qui ne seront pas chargés dans les anciens binaires.

Validation

Il n'y a pas de test CTS spécifiquement pour SCS. Au lieu de cela, assurez-vous que les tests CTS réussissent avec et sans SCS activé pour vérifier que SCS n'affecte pas le périphérique.