MTE można włączyć niezależnie w jądrze Androida i w dowolnym procesie w systemie Android. Google nie narzuca żadnej konkretnej konfiguracji i dąży do zapewnienia twórcom urządzeń maksymalnej elastyczności.
Ten dokument opisuje ustawienia i zakres MTE, które naszym zdaniem zapewniają odpowiedni kompromis między bezpieczeństwem a kosztami dla użytkowników Androida, ponieważ stanowią zawsze aktywną metodę łagodzenia podatności.
Bąbelki
MTE w jądrze jest konfigurowany za pomocą wiersza poleceń. Domyślnie jest włączona w trybie synchronizacji. Może się to zmienić w przyszłości z kilku powodów:
- Wykazano, że ma on znaczący wpływ na skuteczność i wymaga optymalizacji.
- Ogólnie uważa się, że jakość kodu jądra jest niewystarczająca do wysyłania MTE w trybie wymuszania (czyli w trybie paniki w przypadku awarii).
Obecna rekomendacja to wyłączenie MTE jądra na urządzeniach produkcyjnych. Aby to zrobić, dodaj kasan=off
do wiersza poleceń jądra.
Userspace
Google udostępnia domyślną listę plików binarnych w przestrzeni użytkownika, które mają być chronione za pomocą MTE. Lista została opracowana przy udziale zespołu ds. zabezpieczeń Androida i zawiera komponenty, które mają uprawnienia lub obsługują dane wejściowe z nieznanych źródeł. Aktualną listę natywnych plików binarnych zalecanych do użycia z MTE znajdziesz w pliku memtag-common.mk w systemie kompilacji Androida. Dodatkowo dostępne są kilka aplikacji systemowych: obecnie są to Nfc, Bluetooth i SecureElement. Te pliki binarne i aplikacje są domyślnie włączone w trybie asynchronicznym.
Obecnie zalecamy używanie domyślnej listy docelowo (nie trzeba wprowadzać żadnych zmian). Dodatkowo zalecamy przeanalizowanie dodatków BSP i OEM do systemu głównego oraz włączenie MTE w przypadku tych, które mają znaczenie dla bezpieczeństwa.
Aplikacje
Obecnie tylko 3 wymienione powyżej aplikacje systemowe korzystają z MTE. Aby aplikacja innej firmy mogła włączyć MTE, jej AndroidManifest.xml
musi określić android:memtagMode
za pomocą wartości innej niż off
. Dlatego popularne pakiety testów porównawczych, takie jak Geekbench czy AnTuTu, nie działają z MTE. Jeśli wyłączysz też MTE jądra (patrz kasan=off
powyżej), benchmarki powinny wykazać bardzo ograniczony wpływ na wydajność, jeśli w ogóle jakiś wystąpi.
W przypadku innych aplikacji aktywnie pracujemy nad wdrożeniem obsługi MTE w Chrome. Obecna wersja Chrome ze Sklepu Play zawiera ustawienie memtagMode=async
w pliku manifestu. Spodziewamy się też, że wiele aplikacji dbających o bezpieczeństwo w ekosystemie Androida (np. aplikacje bankowe) wkrótce zrobi to samo. Z drugiej strony spodziewamy się, że niektóre aplikacje, które wymagają maksymalnej wydajności procesora, takie jak gry, będą miały wyłączoną MTE.
Inne tryby
Powyższe instrukcje używają wszędzie tylko asynchronicznego trybu MTE. W zależności od sprzętu inne tryby mogą być prawie tak samo szybkie lub równie szybkie. Zapewniają też lepszą diagnostykę i nieco skuteczniejsze środki zaradcze w sytuacji wystąpienia luk w zabezpieczeniach.
Zalecamy przetestowanie jednej lub dwóch innych konfiguracji, aby sprawdzić, czy spełniają one Twoje wymagania dotyczące wydajności i mocy. Tryby MTE można ustawić dla każdego rdzenia procesora w systemie, zapisując dane do pliku /sys/devices/system/cpu/cpu*/mte_tcf_preferred
. Na przykład zapisanie wartości sync
(lub asymm
) spowoduje, że każdy proces w przestrzeni użytkownika, który poprosił o tryb asynchroniczny, zostanie automatycznie przełączony do trybu synchronicznego (lub asymetrycznego) podczas działania w tym rdzeniu. Konfigurację można przeprowadzić w pliku rc podczas uruchamiania urządzenia.
Zalecamy przetestowanie 1–2 innych konfiguracji, aby sprawdzić, czy spełniają one Twoje wymagania dotyczące wydajności i mocy. Oto kilka interesujących konfiguracji do wypróbowania:
- Asymm na wszystkich rdzeniach.
- Asymm na dużych rdzeniach, Sync na pozostałych.
Aby sprawdzić, czy proces wymaga trybu asynchronicznego (z możliwością automatycznej aktualizacji), sprawdź, czy ten wiersz zawiera zarówno parametr PR_MTE_TCF_SYNC, jak i PR_MTE_TCF_ASYNC:
debuggerd <PID> | head -30 | grep tagged_addr
Niestety nie ma łatwego sposobu na sprawdzenie skutecznego trybu procesu, ale każdy proces, który zawiera obie wartości wymienione powyżej, podlega automatycznemu uaktualnianiu.