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.