ShadowCallStack (SCS) to tryb instrumentacji LLVM , który chroni przed nadpisaniem adresu powrotnego (np. przepełnieniem bufora stosu) poprzez zapisanie adresu powrotu funkcji do oddzielnie przydzielonego ShadowCallStack w prologu funkcji funkcji innych niż liście i ładowanie adresu powrotu z ShadowCallStack w funkcji epilog. Adres powrotny jest również przechowywany na zwykłym stosie w celu zapewnienia zgodności z rozwijaczami, ale poza tym nie jest używany. Gwarantuje to, że ataki, które modyfikują adres powrotu na zwykłym stosie, nie mają wpływu na przepływ sterowania programem.
W aarch64 oprzyrządowanie wykorzystuje rejestr x18
do odwoływania się do ShadowCallStack, co oznacza, że odwołania do ShadowCallStack nie muszą być przechowywane w pamięci. Dzięki temu możliwe jest zaimplementowanie środowiska wykonawczego, które unika narażania adresu ShadowCallStack na osoby atakujące, które mogą odczytać dowolną pamięć.
Realizacja
Android obsługuje ShadowCallStack zarówno dla jądra, jak i przestrzeni użytkownika.
Włączanie SCS dla jądra
Aby włączyć ShadowCallStack dla jądra, dodaj następujący wiersz do pliku konfiguracyjnego jądra:
CONFIG_SHADOW_CALL_STACK=y
Włączanie SCS w przestrzeni użytkownika
Aby włączyć ShadowCallStack w komponentach przestrzeni użytkownika, dodaj następujące wiersze do pliku planu 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. Chociaż wszystkie biblioteki systemowe są kompilowane w celu zarezerwowania rejestru x18
, jest to potencjalnie problematyczne, jeśli SCS jest włączony dla komponentów przestrzeni użytkownika, które współdziałają ze starszym kodem w procesie (na przykład bibliotekami, które mogą być ładowane przez aplikacje innych firm), co może utrudniać rejestr x18
. W związku z tym zalecamy włączanie SCS tylko w niezależnych komponentach, które nie będą ładowane do starszych plików binarnych.
Walidacja
Nie ma testu CTS specjalnie dla SCS. Zamiast tego upewnij się, że testy CTS przeszły pomyślnie z włączonym SCS i bez niego, aby sprawdzić, czy SCS nie wpływa na urządzenie.