ShadowCallStack

ShadowCallStack (SCS) ist ein LLVM Instrumentierungs Modus, der mit der Adresse überschreibt return schützt (wie Stapelpufferüberlauf) durch eine Funktion der Rücksendeadresse auf einem separat zugeordneten ShadowCallStack in der Funktion prolog von Nichtblattfunktionen Speichern und Laden die Rücksprungadresse aus dem ShadowCallStack in der Funktion Epilog. Die Rücksendeadresse wird aus Kompatibilitätsgründen mit Abwicklern ebenfalls auf dem regulären Stack gespeichert, wird aber ansonsten nicht verwendet. Dadurch wird sichergestellt, dass Angriffe, die die Rückkehradresse auf dem regulären Stack ändern, keinen Einfluss auf den Programmfluss haben.

Auf aarch64 verwenden die Instrumentierung Fabrikaten der x18 - Register den ShadowCallStack zu verweisen, was bedeutet , dass Verweise auf die ShadowCallStack müssen nicht im Speicher abgelegt werden. Dadurch ist es möglich, eine Laufzeitumgebung zu implementieren, die es vermeidet, die Adresse des ShadowCallStack Angreifern preiszugeben, die beliebigen Speicher lesen können.

Implementierung

Android unterstützt ShadowCallStack für Kernel und Userspace.

Aktivieren von SCS für den Kernel

Um ShadowCallStack für den Kernel zu aktivieren, fügen Sie der Kernel-Konfigurationsdatei die folgende Zeile hinzu:

CONFIG_SHADOW_CALL_STACK=y

Aktivieren von SCS im Userspace

Um ShadowCallStack in Userspace-Komponenten zu aktivieren, fügen Sie der Blueprint-Datei einer Komponente die folgenden Zeilen hinzu:

sanitize: {
  scs: true
}

SCS werden davon ausgegangen , dass das x18 - Register reserviert ist , die Adresse des ShadowCallStack zu speichern, und ist nicht für andere Zwecke verwendet. Während alle Systembibliotheken , die reservieren kompiliert werden x18 - Register, ist dies möglicherweise problematisch , wenn SCS für Userspace - Komponenten aktiviert ist , dass interoperabel mit In-Prozess - Legacy - Code (zB Bibliotheken , die von Drittanbieter - Anwendungen geladen werden konnten), die verprügeln kann das x18 - Register. Daher empfehlen wir, SCS nur in eigenständigen Komponenten zu aktivieren, die nicht in Legacy-Binärdateien geladen werden.

Validierung

Es gibt keinen CTS-Test speziell für SCS. Stellen Sie stattdessen sicher, dass CTS-Tests mit und ohne aktiviertem SCS bestehen, um sicherzustellen, dass SCS das Gerät nicht beeinträchtigt.