Konfiguracja MTE

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.