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.