Stos wywołań cienia

ShadowCallStack (SCS) to tryb instrumentacji LLVM, który chroni przed nadpisania adresów zwrotnych (np. przepełnienia bufora stosu) przez zapisanie adres zwrotny do oddzielnego przydziału ShadowCallStack w prolog funkcji innych niż liścia i wczytuję adres zwrotny ShadowCallStack w epilogu funkcji. Zapisywany jest także adres zwrotny, ze zwykłym stosem, aby zapewnić zgodność z elementami interfejsu, ale poza tym jest nieużywany. Dzięki temu ataki modyfikujące adres zwrotny przy standardowym stosie nie wpływają na przebieg programu.

W przypadku klucza aarch64 instrumentacja korzysta z funkcji x18 rejestrować, aby odwoływać się do ShadowCallStack, oznacza to, że odwołania do ShadowCallStack, nie muszą być przechowywane w pamięci. Umożliwia to wdrożenie środowiska wykonawczego, które zapobiega ujawnianiu adres klasy ShadowCallStack dla osób przeprowadzających atak, które mogą odczytać dowolną pamięć.

Implementacja

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

Włącz SCS dla jądra

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

CONFIG_SHADOW_CALL_STACK=y

Włącz SCS w przestrzeni użytkownika

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

sanitize: {
  scs: true
}

SCS zakłada, że rejestr x18 jest zarezerwowany do przechowywania adresu ShadowCallStack, nie służy do żadnych innych celów. Choć wszystkie systemy biblioteki są skompilowane w celu zarezerwowania rejestru x18. Może to być problematycznej, jeśli włączono SCS dla komponentów przestrzeni użytkownika, które współpracują z starego kodu (np. bibliotek, które mogą być wczytywane przez aplikacji), co może zakłócać rejestr x18. Dlatego zalecamy stosowanie tylko tych formatów, włączenie SCS w samodzielnie niezależnych komponentach, które nie będą wczytywane do starszych wersji. pliki binarne.

Weryfikacja

Nie ma testów CTS dotyczących konkretnie SCS. Upewnij się, że narzędzie CTS testuje zalicza się z włączonym SCS i bez niego, aby sprawdzić, czy SCS nie ma wpływu urządzenia.