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 prologue de fonction des fonctions non-feuilles et en chargeant l'adresse de retour de ShadowCallStack dans la fonction. épilogue. L'adresse de retour est également stockée sur la pile régulière pour la compatibilité avec les dérouleurs, mais est autrement inutilisée. 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, l'instrumentation utilise le registre x18 pour référencer le ShadowCallStack, ce qui signifie que les références au ShadowCallStack n'ont pas besoin d'être stockées en 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

Activation de SCS dans l'espace utilisateur

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

sanitize: {
  scs: true
}

SCS suppose que le registre x18 est réservé pour stocker l'adresse du ShadowCallStack et 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 SCS est activé pour les composants de l'espace utilisateur qui interagissent avec le code hérité du processus (par exemple, les bibliothèques qui pourraient être chargées par des applications tierces), ce qui peut encombrer le registre x18 . En tant que tel, nous recommandons uniquement d'activer SCS dans les composants autonomes qui ne seront pas chargés dans les fichiers binaires hérités.

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'a pas d'impact sur l'appareil.