HWAddressSanitizer

Hardware-assisted AddressSanitizer (HWASan) ist ein Tool zur Erkennung von Speicherfehlern, ähnlich wie AddressSanitizer . HWASan verwendet im Vergleich zu ASan viel weniger RAM, wodurch es für die Bereinigung des gesamten Systems geeignet ist. HWASan ist nur auf Android 10 und höher und nur auf AArch64-Hardware verfügbar.

Obwohl HWAAn hauptsächlich für C/C++-Code nützlich ist, kann es auch beim Debuggen von Java-Code helfen, der Abstürze in C/C++ verursacht, das zum Implementieren von Java-Schnittstellen verwendet wird. Es ist hilfreich, weil es Speicherfehler abfängt, wenn sie auftreten, und Sie direkt auf den verantwortlichen Code hinweist.

Sie können vorgefertigte HWAAn-Images von ci.android.com auf unterstützte Pixel-Geräte flashen ( detaillierte Einrichtungsanweisungen ).

Im Vergleich zum klassischen ASan hat HWAAn:

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

HWASan erkennt die gleichen Fehler wie ASan:

  • Stack- und Heap-Pufferüberlauf/-unterlauf
  • Heap-Nutzung nach kostenlos
  • Stack-Verwendung außerhalb des Gültigkeitsbereichs
  • Doppelt frei/wild frei

Darüber hinaus erkennt HWAAn die Stack-Nutzung nach der Rückgabe.

Implementierungsdetails und Einschränkungen

HWASan basiert auf dem Speicher-Tagging -Ansatz, bei dem ein kleiner zufälliger Tag-Wert sowohl mit Zeigern als auch mit Bereichen von Speicheradressen verknüpft wird. Damit ein Speicherzugriff gültig ist, müssen Zeiger und Speicherkennzeichen übereinstimmen. HWASan stützt sich auf das ARMv8-Feature Top Byte Ignore (TBI), auch Virtual Address Tagging genannt, um das Pointer-Tag in den höchsten Bits der Adresse zu speichern.

Weitere Informationen zum Design von HWAAn finden Sie auf der Clang-Dokumentationsseite.

Per Design hat HWASan nicht die Redzones von ASan mit begrenzter Größe zur Erkennung von Überläufen oder die Quarantäne von ASan mit begrenzter Kapazität zur Erkennung der Nutzung nach der kostenlosen Nutzung. Aus diesem Grund kann HWASan einen Fehler erkennen, egal wie groß der Überlauf ist oder wie lange es her ist, dass der Speicher freigegeben wurde. Dies gibt HWAAn einen großen Vorteil gegenüber ASan.

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

Anforderungen

HWASan erfordert, dass der Linux-Kernel markierte Zeiger in Systemaufrufargumenten akzeptiert. Die Unterstützung dafür wurde in den folgenden Upstream-Patchsets implementiert:

Diese Patches sind als Backports im gemeinsamen Android-Kernel in Android-4.14- und höheren Zweigen verfügbar, jedoch nicht in Android-10-spezifischen Zweigen wie android-4.14-q .

Userspace-Unterstützung für HWAAn ist ab Android 11 verfügbar.

Wenn Sie mit einer benutzerdefinierten Toolchain erstellen, stellen Sie sicher, dass sie alles bis zum LLVM-Commit c336557f enthält .

Mit HWAsan

Verwenden Sie die folgenden Befehle, um die gesamte Plattform mit HWAAn 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 zu einer Produktdefinition hinzufügen, ähnlich wie bei aosp_coral_hwasan .

Im Gegensatz zu ASan müssen Sie mit HWAAn nicht zweimal bauen. Inkrementelle Builds funktionieren einfach, es gibt keine speziellen Flash-Anweisungen oder Löschanforderungen, statische ausführbare Dateien werden unterstützt und es ist in Ordnung, die Bereinigung einer anderen Bibliothek als libc zu überspringen. Es ist auch nicht erforderlich, dass bei der Bereinigung einer Bibliothek alle ausführbaren Dateien, die mit ihr verknüpft sind, ebenfalls bereinigt werden müssen.

Um die Bereinigung eines Moduls zu überspringen, verwenden LOCAL_NOSANITIZE := hwaddress oder sanitize sanitize: { hwaddress: false } .

Einzelne Module können mit HWAAn bereinigt werden, mit der Einschränkung, dass libc ebenfalls HWAAn-ifiziert ist. Dies kann durch Hinzufügen von sanitize: { hwaddress: true } zur jeweiligen Android.bp -Moduldefinition erfolgen. Die gesamte Android-Plattform wird mit HWASan erstellt, wenn ein Build mit _hwasan -Suffix verwendet wird (einschließlich libc ), und daher ist eine manuelle Bereinigung von libc für HWASan-Builds nicht erforderlich.

Bessere Stacktraces

HWASan verwendet einen schnellen, Frame-Pointer-basierten Unwinder, um einen Stack-Trace für jedes Speicherzuweisungs- und Freigabeereignis im Programm aufzuzeichnen. Android aktiviert standardmäßig Frame-Zeiger im AArch64-Code, sodass dies in der Praxis hervorragend funktioniert. Wenn Sie über verwalteten Code entspannen müssen, legen HWASAN_OPTIONS=fast_unwind_on_malloc=0 in der Prozessumgebung fest. Beachten Sie, dass Stack-Traces für fehlerhaften Speicherzugriff standardmäßig den „langsamen“ Unwinder verwenden; diese Einstellung betrifft nur Zuordnungs- und Freigabeablaufverfolgungen. Diese Option kann je nach Auslastung sehr CPU-intensiv sein.

Symbolisierung

Siehe Symbolisierung in der ASan-Dokumentation.

HWAAn in Apps

Ähnlich wie AddressSanitizer kann HWASan nicht in Java-Code sehen, aber es kann Fehler in den JNI-Bibliotheken erkennen. Im Gegensatz zu ASan wird das Ausführen von HWAAn-Apps auf einem Nicht-HWASan-Gerät nicht unterstützt.

Auf einem HWASan-Gerät können Apps mit HWASan überprüft werden, indem ihr Code mit SANITIZE_TARGET:=hwaddress in Make oder -fsanitize=hwaddress in Compiler-Flags erstellt wird. Weitere Einzelheiten finden Sie in der Dokumentation für App-Entwickler .