Hardwaregestützter AddressSanitizer

<ph type="x-smartling-placeholder">

Siehe Informationen zu HWASan finden Sie Informationen zum Lesen von HWASan-Abstürzen.

Hardware-unterstützter AddressSanitizer (HWASan) ist ein Speicherfehler Erkennungstool ähnlich dem AddressSanitizer sein. HWASan benötigt viel weniger RAM als ASan, sodass es für Bereinigung des gesamten Systems. HWASan ist nur unter Android 10 und höher und nur auf AArch64-Hardware verfügbar.

HWASan ist zwar in erster Linie für C/C++-Code nützlich, kann aber auch zum Debuggen von Java-Code beitragen, Abstürze in C/C++, die zur Implementierung von Java-Schnittstellen verwendet werden. Es ist hilfreich, weil es Speicherfehler erkennt, sobald sie auftreten, und Sie direkt auf den Code verweist, der dafür verantwortlich ist.

Du kannst vordefinierte HWASan-Images auf unterstützten Pixel-Geräten von ci.android.com (detaillierte Anleitung zur Einrichtung)

Im Vergleich zur klassischen ASan bietet HWASan:

  • Ähnlicher CPU-Overhead (~2x)
  • Aufwand mit ähnlicher Codegröße (40–50%)
  • Viel geringerer RAM-Overhead (10 % bis 35 %)

HWASan erkennt die gleichen Fehler wie ASan:

  • Stack- und Heap-Pufferüberlauf/-unterlauf
  • Heap-Nutzung nach dem Freigeben
  • Stack außerhalb des Gültigkeitsbereichs verwendet
  • Double Free/Wild Free

Darüber hinaus erkennt HWASan die Stacknutzung nach der Rückkehr.

HWASan (wie ASan) ist kompatibel mit UBSan können beide gleichzeitig für ein Ziel aktiviert werden.

Implementierungsdetails und Einschränkungen

HWASan basiert auf der Arbeitsspeicher Tagging-Ansatz, bei dem ein kleiner zufälliger Tag-Wert sowohl mit Zeigern als auch mit Speicheradressen. Für Erinnerungen müssen die Pointer- und Speicher-Tags übereinstimmen. HWASan nutzt die ARMv8-Funktion „Top Byte Ignore“ (TBI), auch virtuelles Adress-Tagging genannt, um das Pointer-Tag in den höchsten Bits der Adresse zu speichern.

Weitere Informationen das Design von HWASan auf der Dokumentationswebsite von Clang.

HWASan hat keine Redzones mit begrenzter Größe wie ASan zum Erkennen von Überläufen und keine Quarantäne mit begrenzter Kapazität wie ASan zum Erkennen von Nutzung nach Freigabe. Aus diesem Grund kann HWASan einen Programmfehler erkennen, egal wie groß der Überlauf ist oder wie lange es her ist, wieder entfernt. Dies verschafft HWASan einen großen Vorteil gegenüber ASan.

HWASan hat jedoch eine begrenzte Anzahl möglicher Tag-Werte (256), was bedeutet, dass bei einer Ausführung des Programms mit einer Wahrscheinlichkeit von 0,4 % ein Fehler übersehen wird.

Voraussetzungen

Neuere Versionen (4.14 und höher) des gemeinsamen Android-Kernels unterstützen HWASan ohne weitere Maßnahmen. Die Android 10-spezifischen Branches unterstützen HWASan nicht.

HWASan wird ab Android 11 unterstützt.

Wenn Sie mit einem anderen Kernel arbeiten, muss der Linux-Kernel für HWASan getaggte Zeiger in Systemaufrufargumenten akzeptieren. Die Unterstützung dafür wurde in den folgenden Upstream-Patch-Sets implementiert:

Wenn Sie mit einer benutzerdefinierten Toolchain erstellen, muss diese alles bis zum LLVM-Commit c336557f enthalten.

HWASan verwenden

Verwenden Sie die folgenden Befehle, um die gesamte Plattform mit HWASan zu erstellen:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Sie können die Einstellung „SANITIZE_TARGET“ einer Produktdefinition hinzufügen, ähnlich wie bei aosp_coral_hwasan.

Für Nutzer, die mit AddressSanitizer vertraut sind, entfällt ein Großteil der Build-Komplexität:

  • Du musst die Aktion nicht zweimal ausführen.
  • Inkrementelle Builds sind sofort einsatzbereit.
  • Nutzerdaten müssen nicht geflasht werden.

Einige AddressSanitizer-Einschränkungen wurden ebenfalls aufgehoben:

  • Statische ausführbare Dateien werden unterstützt.
  • Sie können die Bereinigung aller Ziele außer libc überspringen. Im Gegensatz zu ASan gibt es Es ist nicht erforderlich, dass bei einer Bereinigung einer Bibliothek auch alle ausführbaren Dateien, die sie verlinkt, ebenfalls verknüpft werden müssen.

Der Wechsel zwischen HWASan- und regulären Images mit derselben (oder höheren) Build-Nummer ist jederzeit möglich. Das Gerät muss nicht auf die Werkseinstellungen zurückgesetzt werden.

Wenn Sie die Bereinigung eines Moduls überspringen möchten, verwenden Sie LOCAL_NOSANITIZE := hwaddress (Android.mk) oder sanitize: { hwaddress: false } (Android.bp).

Einzelne Ziele bereinigen

HWASan kann pro Ziel in einem regulären (unbereinigten) Build aktiviert werden, solange libc.so ebenfalls gesäubert. hwaddress: true dem Block zur Bereinigung in "libc_defaults" hinzufügen in bionic/libc/Android.bp. Wiederholen Sie dann den Vorgang im Ziel, an dem Sie gerade arbeiten.

Durch die Sanitierung von libc können Heap-Speicherzuordnungen systemweit getaggt und die Tags für Speichervorgänge in libc.so geprüft werden. Dadurch können auch in Binärprogrammen Fehler erkannt werden. für die HWASan nicht aktiviert wurde, wenn sich der fehlerhafte Arbeitsspeicherzugriff in libc.so befindet (Beispiel: pthread_mutex_unlock() auf einem delete()ed Mutex).

Wenn die gesamte Plattform mit HWASan erstellt wird, müssen keine Build-Dateien geändert werden.

Blitzstation

Für Entwicklungszwecke können Sie mit Flashstation ein HWASan-kompatibles AOSP-Build auf ein Pixel mit entsperrtem Bootloader flashen. Wählen Sie das Ziel „_hwasan“ aus, z.B. aosp_flame_hwasan-userdebug. Weitere Informationen finden Sie in der NDK-Dokumentation für HWASan für App-Entwickler.

Bessere Stacktraces

HWASan verwendet einen schnellen, frame-pointerbasierten Unwinder, um für jedes Ereignis der Speicherzuweisung und ‑entnahme im Programm einen Stack-Trace aufzuzeichnen. Android aktiviert Frame Pointer in AArch64-Code standardmäßig, sodass dies in der Praxis hervorragend funktioniert. Wenn Sie verwalteten Code zurückspulen müssen, legen Sie HWASAN_OPTIONS=fast_unwind_on_malloc=0 in der Prozessumgebung fest. Hinweis: Für Stack-Traces mit fehlerhaftem Speicherzugriff wird standardmäßig der „langsame“ Unwinder verwendet. Diese Einstellung wirkt sich nur auf die Traces für die Speicherzuweisung und -entnahme aus. Diese Option kann sehr CPU-intensiv, je nach Auslastung.

Symbolisierung

Siehe Symbolisierung im Abschnitt „Informationen zu HWASan-Berichten“.

HWASan in Apps

Ähnlich wie AddressSanitizer hat HWASan keinen Einblick in Java-Code, aber können Programmfehler in den JNI-Bibliotheken erkannt werden. Bis Android 14 mit HWASan Apps auf Geräten ohne HWASan wurden nicht unterstützt.

Auf einem HWASan-Gerät können Apps mit HWASan geprüft werden, indem der Code mit SANITIZE_TARGET:=hwaddress in Make oder -fsanitize=hwaddress in Compiler-Flags erstellt wird. Auf einem Gerät ohne HWASan (mit Android 14 oder höher) muss die Dateieinstellung „wrap.sh“ hinzugefügt werden. Weitere Informationen finden Sie in der Entwicklerdokumentation für Apps.