Hardware-unterstützte AddressSanitizer

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 im Vergleich zu ASan, wodurch es für Bereinigung des gesamten Systems. HWASan ist nur unter Android 10 verfügbar und höher und nur auf AArch64-Hardware.

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.

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

Im Vergleich zum klassischen ASan hat HWASan:

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

HWASan erkennt die gleichen Fehler wie ASan:

  • Überlauf/Unterlauf für Stack- und Heap-Zwischenspeicher
  • Heap-Nutzung nach kostenloser Nutzung
  • Stack-Verwendung außerhalb des Zuständigkeitsbereichs
  • Doppeltes Freibad/Wildtreffer

Außerdem erkennt HWASan die Stapelnutzung nach der Rückgabe.

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. Für Erinnerungen müssen die Zeiger- und Speicher-Tags übereinstimmen. HWASan stützt sich auf ARMv8-Feature-Top-Byte-Ignorieren (TBI), auch als virtuelles Adress-Tagging, um das Zeiger-Tag im der höchsten Bits der Adresse.

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, entfernt. Dies verschafft HWASan einen großen Vorteil gegenüber ASan.

HWASan hat jedoch eine begrenzte Anzahl möglicher Tag-Werte (256), Das bedeutet, dass es eine Wahrscheinlichkeit von 0,4% gibt, dass Sie einen Fehler übersehen. 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 Zweige bieten keine Unterstützung für HWASan.

HWASan-Unterstützung ist ab Android 11 verfügbar.

Wenn Sie mit einem anderen Kernel arbeiten, muss der Linux-Kernel für HWASan getaggte Pointer in Systemaufrufargumente. Unterstützung dafür wurde in den folgenden Upstream-Patchsets implementiert:

Wenn Sie einen Build mit einer benutzerdefinierten Toolchain ausführen, achten Sie darauf, dass sie alles bis zum LLVM-Commit enthält c336557f

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

Der Einfachheit halber können Sie die Einstellung SANITIZE_TARGET auch einer Produktdefinition hinzufügen. ähnlich wie aosp_coral_hwasan festgelegt ist.

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 einer höheren Build-Nummer frei zu machen. 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 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.

Blitzstation

Zu Entwicklungszwecken kannst du einen HWASan-fähigen Build von AOSP auf einem Pixel-Gerät flashen. mit entsperrtem Bootloader mithilfe von Flashstation 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 nutzt eine schnelle, auf Framepointer basierende Abwicklung, um einen Stack aufzuzeichnen. für jedes Arbeitsspeicherzuweisungs- und Deallocation-Ereignis im . Android aktiviert standardmäßig Frame-Pointer im AArch64-Code. sodass das in der Praxis sehr gut funktioniert. Wenn Sie sich bei Verwalteter Code, HWASAN_OPTIONS=fast_unwind_on_malloc=0 festlegen in der Prozessumgebung. Beachten Sie, dass der Arbeitsspeicher-Zugriffs-Stack verwenden Traces die "langsame" ist standardmäßig „Entwinder“. betrifft diese Einstellung nur die Zuweisungs- und Deallocation-Traces. 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 HWASan-Geräten können Apps mit HWASan überprüft werden, indem eine Code mit SANITIZE_TARGET:=hwaddress in Make oder -fsanitize=hwaddress in Compiler-Flags. 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 .