Markierte Zeiger

Ab Android 11 haben für 64-Bit-Prozesse alle Heap-Zuordnungen ein durch die Implementierung definiertes Tag, das im obersten Byte des Zeigers auf Geräten mit Kernel-Unterstützung für ARM Top-Byte Ignore (TBI) festgelegt ist. Jede Anwendung, die dieses Tag modifiziert, wird beendet, wenn das Tag während der Freigabe überprüft wird. Dies ist notwendig für zukünftige Hardware mit ARM Speichern Tagging Erweiterung (MTE) Unterstützung.

Top-Byte ignorieren

Die Top-Byte-Ignore-Funktion von ARM ist für 64-Bit-Code in der gesamten Armv8-AArch64-Hardware verfügbar. Dieses Merkmal bedeutet, dass die Hardware beim Zugriff auf den Speicher das oberste Byte eines Zeigers ignoriert.

TBI erfordert einenkompatiblen Kernel das richtig Griffe markiert Zeiger von User - Space übergeben. Android Gemeinsamer Kern von 4,14 (Pixel 4) und eine höhere Funktion der erforderlichen TBI Patches .

Geräte mit TBI-Unterstützung im Kernel werden zum Prozessstart dynamisch erkannt und für alle Heap-Zuweisungen wird ein implementierungsabhängiges Tag in das oberste Byte des Zeigers eingefügt. Danach wird überprüft, ob das Tag beim Freigeben des Speichers nicht abgeschnitten wurde.

Bereitschaft der Speicher-Tagging-Erweiterung

Die Memory Tagging Extension (MTE) von ARM hilft bei der Behebung von Speichersicherheitsproblemen. MTE funktioniert durch die 56. bis 59. Adresse Bits jeder Speicherzuweisung auf den Stapel, Haufen Tagging und Globals. Der Hardware- und Befehlssatz überprüft bei jedem Speicherzugriff automatisch, ob das richtige Tag verwendet wird.

Android - Apps , die falsch Informationen im oberen Byte des Zeigers gespeichert sind , auf einem MTE-fähiges Gerät brechen garantiert. Mit Tags versehene Zeiger machen es einfacher, falsche Verwendungen des obersten Bytes des Zeigers zu erkennen und abzulehnen, bevor MTE-Geräte verfügbar sind.

Entwicklerunterstützung

Wenn Ihre App abgestürzt ist und Sie mit diesem Link aufgefordert wurden, kann dies eine der folgenden Bedeutungen haben:

  1. Die Anwendung hat versucht, einen Zeiger freizugeben, der nicht vom Heap-Allocator des Systems zugewiesen wurde.
  2. Etwas in Ihrer App hat das oberste Byte eines Zeigers geändert. Das oberste Byte des Zeigers kann nicht geändert werden und Ihr Code muss geändert werden, um dieses Problem zu beheben.

Beispiele dafür, dass der oberste Bytezeiger falsch verwendet oder geändert wird.

  • Zeiger auf einen bestimmten Typ haben anwendungsspezifische Metadaten, die in den oberen 16 Adressbits gespeichert sind.
  • Ein Zeiger, der auf Double und dann zurück umgewandelt wird, wobei die unteren Adressbits verloren gehen.
  • Code, der die Differenz zwischen den Adressen lokaler Variablen aus verschiedenen Stack-Frames berechnet, um die Rekursionstiefe zu messen.

Einige Anwendungen können von Bibliotheken abhängen, die sich falsch verhalten, wenn das oberste Byte des Zeigers gesetzt ist. Wir wissen, dass es nicht trivial sein kann, diese zugrunde liegenden Probleme in Bibliotheken schnell zu beheben. Als solche Anwendungen , die verwenden targetSdkLevel < 30 wird standardmäßig aktiviert nicht Zeiger Tagging haben. Wir bieten auch einen Notausstieg für Anwendungen mit eingebauter targetSdkLevel >= 30 die Übergangszeit zu erleichtern.

Die Notausstieg wird durch Hinzufügen der folgenden auf Ihre verwendet AndroidManifest.xml Datei:

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

Dadurch wird die Pointer-Tagging-Funktion für Ihre Anwendung deaktiviert. Bitte beachten Sie, dass diese Adresse nicht das zugrunde liegende Code Gesundheitsproblem. Diese Notausstieg wird in zukünftigen Versionen von Android verschwinden, weil Probleme dieser Art mit unvereinbar sein MTE .