ShadowCallStack

ShadowCallStack (SCS) ist ein LLVM-Instrumentierungsmodus , der vor Überschreibungen von Rücksprungadressen (wie Stapelpufferüberläufen) schützt, indem er die Rücksprungadresse einer Funktion in einem separat zugewiesenen ShadowCallStack im Funktionsprolog von Nichtleaf-Funktionen speichert und die Rücksprungadresse aus dem ShadowCallStack in die Funktion lädt Epilog. Die Rücksprungadresse wird aus Kompatibilitätsgründen mit Abwicklern ebenfalls auf dem regulären Stapel gespeichert, bleibt jedoch ansonsten ungenutzt. Dadurch wird sichergestellt, dass Angriffe, die die Rücksprungadresse auf dem regulären Stapel ändern, keine Auswirkungen auf den Programmkontrollfluss haben.

Auf aarch64 nutzt die Instrumentierung das x18 Register, um auf den ShadowCallStack zu verweisen, was bedeutet, dass Verweise auf den ShadowCallStack nicht im Speicher gespeichert werden müssen. Dadurch ist es möglich, eine Laufzeit zu implementieren, die verhindert, dass die Adresse des ShadowCallStack Angreifern ausgesetzt wird, die beliebigen Speicher lesen können.

Implementierung

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

SCS für den Kernel aktivieren

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

CONFIG_SHADOW_CALL_STACK=y

SCS im Userspace aktivieren

Um ShadowCallStack in Userspace-Komponenten zu aktivieren, 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. Während alle Systembibliotheken so kompiliert werden, dass sie das x18 Register reservieren, ist dies möglicherweise problematisch, wenn SCS für Userspace-Komponenten aktiviert ist, die mit In-Process-Legacy-Code interagieren (z. B. Bibliotheken, die von Anwendungen von Drittanbietern geladen werden könnten), was zu Überlastung führen kann das x18 Register. Daher empfehlen wir, SCS nur in eigenständigen Komponenten zu aktivieren, die nicht in ältere 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 bestanden werden, um sicherzustellen, dass SCS keine Auswirkungen auf das Gerät hat.