Stos połączeń cieni

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.