Otagowane wskaźniki

Począwszy od Androida 11, w przypadku procesów 64-bitowych wszystkie przydziały sterty tag zdefiniowany przez implementację, który jest umieszczony w górnym bajcie wskaźnika na urządzeniach z obsługa funkcji ignorowania górnego bajtów (TBI) przez jądra systemu ARM. Każda aplikacja, która to modyfikuje kończy się, gdy tag jest sprawdzany podczas alokacji udziału w transakcji. Jest to konieczne dla przyszłego sprzętu z obsługą rozszerzenia ARM Memory Tagging Extension (MTE).

Ignorowanie górnego bajtów

Dostępna w architekturze ARM funkcja ignorowania górnego bajtów jest dostępna w przypadku 64-bitowego kodu w całym sprzęcie Armv8 AArch64. Ta funkcja oznacza, że sprzęt ignoruje górny bajt wskaźnika, gdy dostępu do pamięci.

TBI wymaga zgodnego jądro, które prawidłowo obsługuje otagowane wskaźniki przekazywane z przestrzeni użytkownika. Wspólne nerki Androida w wersji 4.14 (Pixel 4) i nowszych wymagają TBI .

Urządzenia z obsługą TBI w jądrze są dynamicznie wykrywane czas rozpoczęcia procesu, a na górze wstawiono tag zależny od implementacji bajt wskaźnika dla wszystkich alokacji sterty. Następnie przeprowadzany jest test, aby aby upewnić się, że tag nie został obcięty podczas zwalniania lokalizacji pamięci.

Gotowość rozszerzenia do tagowania pamięci

Rozszerzenie ARM Memory Tagging Extension (MTE) pomaga rozwiązywać problemy z bezpieczeństwem pamięci. MTE działa poprzez tagowanie 56–59 bitów adresu każdej pamięci na stosie, stercie i globalnych. Zestaw urządzeń i instrukcji przy każdym dostępie do pamięci automatycznie sprawdza, czy używany jest właściwy tag.

Aplikacje na Androida, które nieprawidłowo przechowują informacje w górnym bajcie na urządzeniu obsługującym MTE na pewno nie będą działać. Otagowane wskaźniki ułatwiają wykrywanie i odrzucanie nieprawidłowych przypadków użycia najważniejszych wartości bajt wskaźnika, zanim urządzenia MTE będą dostępne.

Pomoc dla programistów

Jeśli Twoja aplikacja uległa awarii i pojawił się ten link, może to oznaczać, jedną z tych wartości:

  1. Aplikacja próbowała zwolnić wskaźnik, który nie został przydzielony przez przez mechanizm przydzielający stos systemu.
  2. Coś w Twojej aplikacji zmodyfikowało górny bajt wskaźnika. Górny bajt argumentu nie można zmienić wskaźnika, a ten problem można rozwiązać, zmieniając kod Google Cloud.

Przykłady nieprawidłowego użycia lub zmodyfikowania wskaźnika górnego bajtów.

  • Wskaźniki do określonego typu pozwalają przechowywać metadane konkretnych aplikacji tych 16 pierwszych bitów adresu.
  • Wskaźnik jest rzutowany na podwójne, a potem z powrotem, tracąc dolne bity adresu.
  • Kod obliczający różnicę między adresami zmiennych lokalnych z różnych ramek stosu, aby zmierzyć głębokość rekurencji.

Niektóre aplikacje mogą zależeć od bibliotek, które działają nieprawidłowo, gdy górny bajt wskaźnika jest ustawiony. Zdajemy sobie sprawę, że może to być nie jest łatwe, aby szybko rozwiązać te problemy w bibliotekach. W związku z tym: aplikacje korzystające z targetSdkLevel < 30 nie będzie mieć domyślnie włączonego tagowania wskaźników. Zapewniamy również możliwość wyjścia dla aplikacji stworzonych w języku: targetSdkLevel >= 30 aby ułatwić okres przejściowy.

Aby użyć włazu awaryjnego, należy dodać Plik AndroidManifest.xml:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

Powoduje to wyłączenie funkcji tagowania wskaźnika dla: . Nie dotyczy to który jest przyczyną problemów. Ten właz awaryjny zniknie w przyszłości wersji Androida, ponieważ tego typu problemy będą niezgodne MTE.