ShadowCallStack

ShadowCallStack (SCS) ist ein LLVM-Instrumentierungsmodus, der vor Überschreibungen der Rückgabeadresse (z. B. Stack-Buffer-Overflows) schützt. Dazu wird die Rückgabeadresse einer Funktion im Prolog der Funktion nicht untergeordneten Funktionen in einem separat zugewiesenen ShadowCallStack gespeichert und im Epilog der Funktion aus dem ShadowCallStack geladen. Die Rücksendeadresse wird auch auf dem regulären Stack gespeichert, um mit Unwindern kompatibel zu sein, ist aber ansonsten nicht verwendet. So wird sichergestellt, dass Angriffe, die die Rücksprungadresse auf dem regulären Stack ändern, keine Auswirkungen auf den Programmablauf haben.

Unter aarch64 verwendet die Instrumentierung das x18-Register, um auf den ShadowCallStack zu verweisen. Das bedeutet, dass Verweise auf den ShadowCallStack nicht im Arbeitsspeicher gespeichert werden müssen. So ist es möglich, eine Laufzeit zu implementieren, die verhindert, dass die Adresse des ShadowCallStacks an Angreifer weitergegeben wird, die beliebigen Speicher lesen können.

Implementierung

Android unterstützt ShadowCallStack sowohl für den Kernel als auch für den Nutzerbereich.

SCS für den Kernel aktivieren

Wenn Sie ShadowCallStack für den Kernel aktivieren möchten, fügen Sie der Kernel-Konfigurationsdatei die folgende Zeile hinzu:

CONFIG_SHADOW_CALL_STACK=y

SCS im Userspace aktivieren

Wenn Sie ShadowCallStack in Userspace-Komponenten aktivieren möchten, fügen Sie der Blueprint-Datei einer Komponente die folgenden Zeilen hinzu:

sanitize: {
  scs: true
}

SCS geht davon aus, dass das x18-Register zum Speichern der Adresse des ShadowCallStack reserviert ist und nicht für andere Zwecke verwendet wird. Alle Systembibliotheken werden zwar so kompiliert, dass das x18-Register reserviert wird, dies kann jedoch problematisch sein, wenn SCS für Userspace-Komponenten aktiviert ist, die mit In-Process-Altcode interagieren (z. B. Bibliotheken, die von Drittanbieter-Apps geladen werden könnten), was das x18-Register überschreiben kann. Wir empfehlen daher, SCS nur in eigenständigen Komponenten zu aktivieren, die nicht in alte Binärdateien geladen werden.

Zertifizierungsstufe

Es gibt keine CTS-Tests speziell für SCS. Achten Sie stattdessen darauf, dass die CTS-Tests mit und ohne aktiviertem SCS bestehen, um sicherzustellen, dass SCS keine Auswirkungen auf das Gerät hat.