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-feuille et en chargeant l'adresse de retour de ShadowCallStack dans la fonction. épilogue. L'adresse de retour est également stockée sur la pile normale pour des raisons de compatibilité avec les dérouleurs, mais elle est par ailleurs 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 capables de lire de la mémoire arbitraire.

Mise en œuvre

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

Activation de 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 est potentiellement problématique si SCS est activé pour les composants de l'espace utilisateur qui interagissent avec le code hérité en cours (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 d'activer SCS uniquement dans les composants autonomes qui ne seront pas chargés dans les binaires hérités.

Validation

Il n’existe pas de test CTS spécifiquement pour le 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.