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.