Informationen zum Lesen von HWASan-Abstürzen finden Sie unter HWASan-Berichte.
Hardware-unterstützter AddressSanitizer (HWASan) ist ein Speicherfehler Erkennungstool ähnlich dem AddressSanitizer sein. HWASan benötigt im Vergleich zu ASan viel weniger RAM, was es für die Bereinigung des gesamten Systems geeignet macht. 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. Das ist hilfreich, weil es sich daran erinnert, wenn sie auftreten, und verweist Sie direkt auf den entsprechenden Code.
Sie können vorkonfigurierte HWASan-Images von ci.android.com auf unterstützte Pixel-Geräte flashen (detaillierte Einrichtungsanleitung).
Im Vergleich zum klassischen ASan hat HWASan:
- Ähnlicher CPU-Overhead (~2x)
- Ähnlicher Overhead bei der Codegröße (40–50 %)
- Viel weniger RAM-Overhead (10–35 %)
HWASan erkennt die gleichen Fehler wie ASan:
- Überlauf/Unterlauf für Stack- und Heap-Zwischenspeicher
- Heap-Nutzung nach dem Freigeben
- Stack-Verwendung außerhalb des Zuständigkeitsbereichs
- 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.
Details und Einschränkungen der Implementierung
HWASan basiert auf der Arbeitsspeicher Tagging-Ansatz, bei dem ein kleiner zufälliger Tag-Wert sowohl mit Zeigern als auch mit Speicheradressen. Damit ein Speicherzugriff gültig ist, müssen die Zeiger- 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 verfügt standardmäßig nicht über die roten Zonen von ASan Überläufe oder ASans beschränkte Quarantäne für Nutzungserkennung nach der kostenlosen Version. Aus diesem Grund kann HWASan einen Programmfehler erkennen, egal wie groß der Überlauf ist oder wie lange es her ist, wieder entfernt. Das bietet HWASan einen großen Vorteil gegenüber ASan.
HWASan hat jedoch eine begrenzte Anzahl möglicher Tag-Werte (256), Das bedeutet, dass eine Wahrscheinlichkeit von 0,4 % während einer Ausführung des Programms.
Voraussetzungen
Aktuelle Versionen (4.14 und höher) des Unterstützung für gängige Android-Kernel HWASan, sofort einsatzbereit. 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 bei HWASan getaggte Pointer in Systemaufrufargumente. Die Unterstützung dafür wurde in den folgenden Upstream-Patch-Sets implementiert:
- arm64-getaggte Adresse ABI
- arm64: Entfernen des Tags von Nutzerzeigern, die an den Kernel übergeben werden
- mm: Avoid creating virtual address aliases in brk()/mmap()/mremap()
- arm64: Getaggte Adressen in access_ok() validieren, die aus Kernel-Threads aufgerufen werden
Wenn Sie mit einer benutzerdefinierten Toolchain erstellen, muss diese alles bis zum LLVM-Commit c336557f enthalten.
HWASan verwenden
Mit den folgenden Befehlen können Sie die gesamte Plattform mit HWASan 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.
- Es ist nicht erforderlich, Nutzerdaten zu flashen.
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 ist es nicht erforderlich, dass eine ausführbare Datei, die mit einer Bibliothek verknüpft ist, ebenfalls bereinigt wird, wenn die Bibliothek bereinigt wird.
Der Wechsel zwischen HWASan und regulären Images mit derselben (oder einer höheren) Build-Nummer frei zu machen. Das Gerät muss nicht gelöscht 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 in einem regulären (nicht bereinigten) Build pro Ziel aktiviert werden, solange auch libc.so
bereinigt wird. hwaddress: true
dem Block zur Bereinigung in "libc_defaults"
hinzufügen
in bionic/libc/Android.bp. Wiederholen Sie diesen Vorgang für das Ziel, an dem Sie gerade arbeiten.
Beachten Sie, dass das Bereinigen von libc das Tagging von Heap-Speicherzuweisungen systemweit ermöglicht, sowie die Tag-Kennzeichnung
Überprüfung der Tags auf Speichervorgänge in libc.so
. 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.
Flashstation
Für Entwicklungszwecke können Sie mit Flashstation ein HWASan-kompatibles AOSP-Build auf ein Pixel mit entsperrtem Bootloader flashen. Wählen Sie das _hwasan-Ziel 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 nutzt eine schnelle, auf Framepointer basierende Abwicklung, um einen Stack aufzuzeichnen.
für jedes Arbeitsspeicherzuweisungs- und
Deallocation-Ereignis im
. Android aktiviert Frame Pointer in AArch64-Code standardmäßig, sodass dies in der Praxis hervorragend funktioniert. Wenn Sie sich beim Entspannen
Verwalteter Code, HWASAN_OPTIONS=fast_unwind_on_malloc=0
festlegen
in der Prozessumgebung. 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 Nicht-HWASan-Gerät mit Android 14 oder höher: eine Dateieinstellung „wrap.sh“
LD_HWASAN=1
muss hinzugefügt werden.
Weitere Informationen finden Sie in der
Dokumentation für App-Entwickler
.