Markierte Zeiger

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Ab Android 11 verfügen alle Heap-Zuweisungen für 64-Bit-Prozesse über ein implementierungsdefiniertes 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 für zukünftige Hardware mit Unterstützung für ARM Memory Tagging Extension (MTE) erforderlich.

Ignorieren des obersten Bytes

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

TBI erfordert einenkompatiblen Kernel , der markierte Zeiger, die vom Userspace übergeben werden, korrekt verarbeitet. Android Common Kernels ab 4.14 (Pixel 4) und höher enthalten die erforderlichen TBI-Patches .

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

Speicher-Tagging-Erweiterungsbereitschaft

Die Memory Tagging Extension (MTE) von ARM hilft bei der Lösung von Problemen mit der Speichersicherheit. MTE funktioniert, indem es die 56. bis 59. Adressbits jeder Speicherzuweisung auf dem Stack, dem Heap und den Globals markiert . Die Hardware und der Befehlssatz prüfen automatisch, ob bei jedem Speicherzugriff das richtige Tag verwendet wird.

Android-Apps, die fälschlicherweise Informationen im obersten Byte des Zeigers speichern , brechen auf einem MTE-fähigen Gerät garantiert ab . Gekennzeichnete Zeiger erleichtern das Erkennen und Zurückweisen falscher Verwendungen des obersten Bytes des Zeigers, bevor MTE-Geräte verfügbar sind.

Entwicklerunterstützung

Wenn Ihre App abgestürzt ist und Sie zu diesem Link aufgefordert wurden, kann dies Folgendes bedeuten:

  1. Die Anwendung hat versucht, einen Zeiger freizugeben, der nicht von der Heap-Zuweisung 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 Byte-Zeiger falsch verwendet oder geändert wurde.

  • Zeiger auf einen bestimmten Typ haben anwendungsspezifische Metadaten, die in den oberen 16 Adressbits gespeichert sind.
  • Ein Zeiger wird auf Double und dann zurück gecastet, wobei die unteren Adressbits verloren gehen.
  • Codeberechnung der Differenz zwischen den Adressen lokaler Variablen aus verschiedenen Stack-Frames als Möglichkeit zur Messung der Rekursionstiefe.

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. Daher ist für Anwendungen, die targetSdkLevel < 30 verwenden, das Pointer-Tagging standardmäßig nicht aktiviert. Wir bieten auch eine Notlösung für Anwendungen, die mit targetSdkLevel >= 30 wurden, um die Übergangszeit zu erleichtern.

Die Notausstiegsluke wird verwendet, indem Sie Folgendes zu Ihrer AndroidManifest.xml -Datei hinzufügen:

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

Dadurch wird die Pointer-Tagging-Funktion für Ihre Anwendung deaktiviert. Bitte beachten Sie, dass dies nicht das zugrunde liegende Codeintegritätsproblem anspricht. Diese Notluke wird in zukünftigen Versionen von Android verschwinden, da Probleme dieser Art nicht mit MTE kompatibel sein werden.