ShadowCallStack

ShadowCallStack (SCS) est un mode d'instrumentation LLVM qui protège contre les écrasements d'adresse de retour (comme les débordements de tampon de pile) en enregistrant l'adresse de retour d'une fonction dans un ShadowCallStack alloué séparément dans le prolog de fonction des fonctions non feuilles et en chargeant l'adresse de retour à partir de ShadowCallStack dans l'épilogue de la fonction. L'adresse de retour est également stockée sur la pile régulière pour assurer la compatibilité avec les outils de débogage, mais elle n'est pas utilisée. Cela garantit que les attaques qui modifient l'adresse de retour sur la pile régulière n'ont aucun effet sur le flux de contrôle du programme.

Sur aarch64, l'instrumentation utilise le registre x18 pour référencer ShadowCallStack, ce qui signifie que les références à ShadowCallStack n'ont pas besoin d'être stockées en mémoire. Cela permet d'implémenter un environnement d'exécution qui évite d'exposer l'adresse de ShadowCallStack aux pirates informatiques pouvant lire une mémoire arbitraire.

Implémentation

Android est compatible avec ShadowCallStack pour le noyau et l'espace utilisateur.

Activer le SCS pour le kernel

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

CONFIG_SHADOW_CALL_STACK=y

Activer le SCS dans l'espace utilisateur

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

sanitize: {
  scs: true
}

SCS suppose que le registre x18 est réservé au stockage de l'adresse de ShadowCallStack et qu'il n'est utilisé à aucune autre fin. Bien que toutes les bibliothèques système soient compilées pour réserver le registre x18, cela peut poser problème si le SCS est activé pour les composants de l'espace utilisateur qui interagissent avec le code ancien en cours de traitement (par exemple, les bibliothèques pouvant être chargées par des applications tierces), ce qui peut écraser le registre x18. Par conséquent, nous vous recommandons de n'activer le SCS que dans les composants autonomes qui ne seront pas chargés dans les binaires existants.

Validation

Il n'existe aucun test CTS spécifique au SCS. Assurez-vous plutôt que les tests CTS sont réussis avec et sans SCS activé pour vérifier que SCS n'a aucun impact sur l'appareil.