ShadowCallStack

ShadowCallStack (SCS) est un mode d'instrumentation LLVM qui protège contre écrase les adresses de retour (comme les dépassements de tampon de pile) en enregistrant le code à une adresse ShadowCallStack allouée séparément dans le prologue de fonctions non-feuilles et charger l'adresse de retour à partir de ShadowCallStack dans l'épilogue de la fonction. L'adresse de retour est également stockée sur la pile standard pour assurer la compatibilité avec les dérouleurs, mais n'est pas utilisé dans d'autres cas. Cela garantit que les attaques qui modifient l'adresse de retour sur la pile standard n'ont aucun effet sur le flux de contrôle du programme.

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

Implémentation

Android est compatible avec 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 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 la classe les lignes suivantes au fichier de plan d'un composant:

sanitize: {
  scs: true
}

SCS suppose que le registre x18 est réservé au stockage de l'adresse du ShadowCallStack, et n'est utilisée à aucune autre fin. Bien que tous les systèmes les bibliothèques sont compilées pour réserver le registre x18, ce qui peut problème si SCS est activé pour les composants d'espace utilisateur qui interagissent avec du code ancien en cours de traitement (par exemple, des bibliothèques pouvant être chargées par des applications), ce qui peut perturber le registre x18. Par conséquent, nous ne recommandons l'activation de SCS dans les composants autonomes qui ne seront pas chargés dans les anciennes versions binaires.

Validation

Il n'existe pas de test CTS spécifique à SCS. Assurez-vous plutôt que CTS teste transmettre avec et sans SCS activé pour vérifier qu'il n'affecte pas le SCS appareil.