Stos połączeń cieni

ShadowCallStack (SCS) to tryb oprzyrządowania LLVM , który chroni przed nadpisywaniem adresów zwrotnych (np. przepełnieniem bufora stosu) poprzez zapisywanie adresu zwrotnego funkcji w oddzielnie przydzielonym ShadowCallStack w prologu funkcji funkcji innych niż liść i ładowanie adresu zwrotnego z ShadowCallStack do funkcji epilog. Adres zwrotny jest również przechowywany na zwykłym stosie w celu zapewnienia zgodności z odwijakami, ale poza tym jest nieużywany. Dzięki temu ataki modyfikujące adres zwrotny na zwykłym stosie nie będą miały wpływu na przepływ kontroli programu.

W aarch64 oprzyrządowanie wykorzystuje rejestr x18 do odwoływania się do ShadowCallStack, co oznacza, że ​​odniesienia do ShadowCallStack nie muszą być przechowywane w pamięci. Umożliwia to zaimplementowanie środowiska wykonawczego, które pozwala uniknąć ujawniania adresu ShadowCallStack atakującym, którzy 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 tak, aby rezerwować rejestr x18 , jest to potencjalnie problematyczne, jeśli SCS jest włączone dla komponentów przestrzeni użytkownika, które współpracują ze starszym kodem w procesie (na przykład biblioteki, które mogą być ładowane przez aplikacje innych firm), co może powodować problemy rejestr x18 . W związku z tym zalecamy włączenie SCS tylko w samodzielnych komponentach, które nie zostaną zał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łączoną funkcją SCS i bez niej, aby sprawdzić, czy SCS nie ma wpływu na urządzenie.