ShadowCallStack (SCS) ist ein LLVM-Instrumentierungsmodus, der vor Malware und -Rückgabeadresse überschreibt (z. B. Stack-Pufferüberläufe), indem die an ein separat zugewiesenes ShadowCallStack in den Funktionsprolog von Nicht-Blatt-Funktionen und das Laden der Rückgabeadresse aus ShadowCallStack im Funktions-Epilog. Auch die Rücksendeadresse wird gespeichert, auf dem normalen Stack, um Kompatibilität mit Abwicklern zu gewährleisten, wird aber ansonsten nicht verwendet. Dadurch wird sichergestellt, dass Angriffe, bei denen die Rücksendeadresse im regulären Stack geändert wird, haben keine Auswirkungen auf den Ablauf der Programmsteuerung.
Auf aarch64 nutzt die Instrumentierung die x18
um auf den ShadowCallStack zu verweisen, was bedeutet,
müssen nicht im Arbeitsspeicher gespeichert werden.
So können Sie eine Laufzeit implementieren,
die Adresse des ShadowCallStack an Angreifer weiterzugeben,
einem beliebigen Arbeitsspeicher.
Implementierung
Android unterstützt ShadowCallStack sowohl für den Kernel als auch für den Nutzerbereich.
SCS für den Kernel aktivieren
Um ShadowCallStack für den Kernel zu aktivieren, fügen Sie die folgende Zeile zur Kernel-Konfigurationsdatei:
CONFIG_SHADOW_CALL_STACK=y
SCS im Userspace aktivieren
Um ShadowCallStack in Userspace-Komponenten zu aktivieren, fügen Sie den folgenden Zeilen in die Blueprint-Datei einer Komponente ein:
sanitize: { scs: true }
SCS geht davon aus, dass das x18
-Register zum Speichern der Adresse des
ShadowCallStack und wird nicht für andere Zwecke verwendet. Während alle Systeme
Bibliotheken kompiliert werden, um das x18
-Register zu reservieren. Dies ist möglicherweise
problematisch, wenn SCS für Userspace-Komponenten aktiviert ist, die mit
In Bearbeitung befindlicher Legacy-Code (z. B. Bibliotheken, die von Drittanbieter-
Apps), wodurch das x18
-Register überschrieben werden kann. Daher empfehlen wir nur
Aktivierung von SCS in eigenständigen Komponenten, die nicht in Legacy-Komponenten geladen werden
Binärdateien.
Zertifizierungsstufe
Es gibt keinen speziellen CTS-Test für SCS. Stellen Sie stattdessen sicher, dass CTS Tests durchführt, mit und ohne aktiviertes SCS übergeben, um zu überprüfen, ob SCS .