Getaggte Verweise

Ab Android 11 werden bei 64-Bit-Prozessen alle Heap-Zuweisungen ein von einer Implementierung definiertes Tag, das im obersten Byte des Zeigers auf Geräten mit Kernel-Unterstützung für ARM Top-Byte Ignorieren (TBI). Jede App, die dies ändert -Tag beendet wird, wenn das Tag während der Freigabe überprüft wird. Das ist notwendig für zukünftige Hardware mit ARM Memory Tagging Extension (MTE).

Top-Byte-Ignorieren

Die Top-Byte-Ignorieren-Funktion von ARM ist für 64-Bit-Code in jeder Armv8 AArch64-Hardware verfügbar. Diese Funktion bedeutet, dass die Hardware das obere Byte eines Zeigers ignoriert, wenn auf den Speicher zugreifen.

TBI erfordert eine kompatible Kernel, der getaggte Pointer, die vom Nutzerbereich übergeben werden, korrekt verarbeitet. Common Kernel von Android 4.14 (Pixel 4) und höher bieten das erforderliche TBI Patches.

Geräte mit TBI-Unterstützung im Kernel werden dynamisch erkannt unter die Startzeit des Prozesses und ein implementierungsabhängiges Tag wird oben eingefügt. Byte des Zeigers für alle Heap-Zuweisungen. Danach wird überprüft, dass das Tag beim Freigeben des Arbeitsspeichers nicht abgeschnitten wurde.

Bereitschaft der Speicher-Tagging-Erweiterung

Die Memory Tagging Extension (MTE) von ARM hilft bei der Behebung von Sicherheitsproblemen im Arbeitsspeicher. MEZ Dabei werden die 56.–59. Adressbits jedes Speichers mit Tags versehen. auf den Stack, den Heap und die globalen Werte. Hardware und Anleitungssatz prüft bei jedem Speicherzugriff automatisch, ob das richtige Tag verwendet wird.

Android-Apps, die Informationen falsch im oberen Byte der Zeiger funktionieren auf einem MTE-fähigen Gerät garantiert. Getaggte Zeiger erleichtern das Erkennen und Ablehnen falscher Verwendungen der oberen Byte des Zeigers, bevor MTE-Geräte verfügbar sind.

Entwicklersupport

Wenn Ihre App abgestürzt ist und Sie diesen Link sehen, könnte das folgende Gründe haben: eines der folgenden:

  1. Die App hat versucht, einen Zeiger freizugeben, der nicht vom Heap-Allocator des Systems.
  2. Das obere Byte eines Zeigers wurde durch etwas in Ihrer App geändert. Das Top-Byte Der Zeiger kann nicht geändert werden und der Code muss geändert werden, um dieses Problem zu beheben Problem.

Beispiele für die falsche Verwendung oder Änderung des oberen Byte-Zeigers.

  • Bei Verweisen auf einen bestimmten Typ sind anwendungsspezifische Metadaten gespeichert in den oberen 16 Adressbits.
  • Ein Zeiger, der in den doppelten Wert und dann wieder zurück umgewandelt wird, wodurch die unteren Adressbits verloren gehen.
  • Code, der die Differenz zwischen den Adressen lokaler Variablen berechnet Stapelframes analysieren, um die Rekursionstiefe zu messen.

Einige Apps sind möglicherweise auf Bibliotheken angewiesen, die sich nicht ordnungsgemäß verhalten, wenn der ist das oberste Byte des Zeigers. Uns ist bewusst, dass es möglicherweise diese zugrunde liegenden Probleme in Bibliotheken schnell zu beheben. Daher Apps, die targetSdkLevel < 30 verwenden ist das Zeiger-Tagging nicht standardmäßig aktiviert. Wir bieten auch eine Notfluktuation, Informationen zu Apps, die mit targetSdkLevel >= 30 erstellt wurden um die Übergangsphase zu erleichtern.

Zur Notruffunktion können Sie Folgendes zu Ihrem AndroidManifest.xml-Datei:

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

Dadurch wird die Zeiger-Tagging-Funktion für Ihre Dabei geht es nicht um die Problem mit dem Zustand des Codes. Diese Ausstiegsluke wird in Zukunft verschwinden Versionen von Android, da Probleme dieser Art inkompatibel MTE: