ShadowCallStack

ShadowCallStack (SCS) to tryb instrumentacji LLVM, który chroni przed nadpisaniem adresu powrotu (np. przez przepełnienie bufora stosu) przez zapisanie adresu powrotu funkcji w oddzielnie przydzielonym ShadowCallStack w prologu funkcji niebędącej funkcją liścia i ładując adres powrotu z ShadowCallStack w epilogu funkcji. Adres zwrotny jest również przechowywany na zwykłym stosie w celu zapewnienia zgodności z rozwijaczami, ale w innych przypadkach nie jest używany. Dzięki temu ataki, które modyfikują adres zwrotny na zwykłym stosie, nie mają wpływu na przepływ sterowania programem.

W przypadku aarch64 pomiar korzysta z rejestru x18, aby odwoływać się do ShadowCallStack, co oznacza, że odwołania do ShadowCallStack nie muszą być przechowywane w pamięci. Umożliwia to wdrożenie środowiska wykonawczego, które nie ujawnia adresu ShadowCallStack potencjalnym przeciwnikom, którzy mogą odczytać dowolną pamięć.

Implementacja

Android obsługuje ShadowCallStack zarówno w jądrze, jak i w przestrzeni użytkownika.

Włączanie SCS dla jądra

Aby włączyć ShadowCallStack dla jądra, dodaj ten wiersz do pliku konfiguracyjnego jądra:

CONFIG_SHADOW_CALL_STACK=y

Włączanie SCS w przestrzeni użytkownika

Aby włączyć ShadowCallStack w komponentach w przestrzeni użytkownika, dodaj te wiersze do pliku blueprint komponentu:

sanitize: {
  scs: true
}

SCS zakłada, że rejestr x18 jest zarezerwowany do przechowywania adresu ShadowCallStack i nie jest używany do żadnych innych celów. Wszystkie biblioteki systemowe są kompilowane w sposób, który rezerwuje rejestr x18. Może to jednak stanowić problem, jeśli SCS jest włączony w przypadku komponentów w przestrzeni użytkownika, które współpracują z kodem zabytkowym w procesie (np. bibliotekach, które mogą być ładowane przez aplikacje innych firm), co może powodować zaśmiecanie rejestru x18. Dlatego zalecamy włączanie SCS tylko w samodzielnych komponentach, które nie będą ładowane do starszych binarnych plików binarnych.

Weryfikacja

Nie ma testów CTS przeznaczonych specjalnie do SCS. Zamiast tego sprawdź, czy testy CTS przechodzą z włączonym i wyłączonym SCS, aby upewnić się, że SCS nie wpływa na urządzenie.