Google setzt sich dafür ein, die Rassengerechtigkeit für schwarze Gemeinschaften zu fördern. Siehe wie.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

HWAddressSanitizer

Der hardwareunterstützte AddressSanitizer (HWASan) ist ein Tool zur Erkennung von Speicherfehlern, das dem AddressSanitizer ähnelt . HWASan benötigt im Vergleich zu ASan viel weniger RAM, wodurch es für die Desinfektion des gesamten Systems geeignet ist. HWASan ist nur für Android 10 und höher sowie für AArch64-Hardware verfügbar. Sie können vorgefertigte HWASan-Bilder von ci.android.com auf unterstützte Pixel-Geräte flashen ( detaillierte Anweisungen zur Einrichtung ).

Im Vergleich zum klassischen ASan hat HWASan:

  • Ähnlicher CPU-Overhead (~ 2x)
  • Ähnlicher Aufwand für die Codegröße (40 - 50%)
  • Viel geringerer RAM-Overhead (10% - 35%)

HWASan erkennt die gleichen Fehler wie ASan:

  • Überlauf / Unterlauf des Stapel- und Haufenpuffers
  • Haufen nach kostenlos verwenden
  • Stapelverwendung außerhalb des Anwendungsbereichs
  • Double Free / Wild Free

Darüber hinaus erkennt HWASan die Stapelverwendung nach der Rückgabe.

Implementierungsdetails und Einschränkungen

HWASan basiert auf dem Speicherkennzeichnungsansatz , bei dem ein kleiner zufälliger Kennzeichnungswert sowohl Zeigern als auch Bereichen von Speicheradressen zugeordnet wird. Damit ein Speicherzugriff gültig ist, müssen Zeiger und Speicher-Tags übereinstimmen. HWASan verwendet das Top-Byte-Ignorieren (TBI) der ARMv8-Funktion, das auch als Tagging für virtuelle Adressen bezeichnet wird, um das Zeiger-Tag in den höchsten Bits der Adresse zu speichern.

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

HWASan verfügt standardmäßig nicht über ASans Redzonen mit begrenzter Größe zum Erkennen von Überläufen oder über die Quarantäne mit begrenzter Kapazität von ASan zum Erkennen der Verwendung nach kostenlosem Zugriff. Aus diesem Grund kann HWASan einen Fehler erkennen, unabhängig davon, wie groß der Überlauf ist oder wie lange es her ist, dass der Speicher freigegeben wurde. Dies gibt HWASan einen großen Vorteil gegenüber ASan.

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

Für HWASan muss der Linux-Kernel markierte Zeiger in Systemaufrufargumenten akzeptieren. Unterstützung ist in vorgefertigten Kerneln für Pixel 2-, 3-, 3a- und 4-Geräte in Android 10- und höheren Zweigen sowie in entsprechenden Quellzweigen im AOSP-Kernel-Quellrepository verfügbar . Es ist bekannt, dass Pixel 2, 3, 3a und 4 mit einem gesamten mit HWASan erstellten System funktionieren.

Unterstützung für Nicht-Pixel-Geräte ist im allgemeinen Android-Kernel in Android-4.14 und höheren Zweigen verfügbar, jedoch nicht in Android 10-spezifischen Zweigen wie Android-4.14-q . Sie müssen auch die LLVM-Toolchain auf r370808 aktualisieren, indem Sie die neue Toolchain in CL 1182220 und die entsprechende Änderung des Build-Systems in CL 1164431 auswählen .

Verwenden von HWASan

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

lunch aosp_walleye-userdebug # (or any other product)
make SANITIZE_TARGET=hwaddress

Im Gegensatz zu ASan müssen bei HWASan nicht zweimal gebaut werden. Inkrementelle Builds funktionieren einfach, es gibt keine speziellen Anweisungen zum Flashen oder Löschen, 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 eine bereinigte Datei, die mit ihr verknüpft ist, auch bereinigt wird, wenn eine Bibliothek bereinigt wird.

Verwenden Sie LOCAL_NOSANITIZE := hwaddress oder LOCAL_NOSANITIZE := hwaddress sanitize: { hwaddress: false } , um die LOCAL_NOSANITIZE := hwaddress eines Moduls zu überspringen.

Einzelne Module können mit HWASan bereinigt werden, mit der Einschränkung, dass libc auch HWASan-ified 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 mit _hwasan angehängter Build (einschließlich libc ) verwendet wird. Daher ist eine _hwasan Bereinigung von libc für HWASan-Builds nicht erforderlich.

Bessere Stapelspuren

HWASan verwendet einen schnellen, auf Frame-Zeigern basierenden Abwickler, um eine Stapelverfolgung für jedes Speicherzuweisungs- und Freigabeereignis im Programm aufzuzeichnen. Android aktiviert standardmäßig Frame-Zeiger in AArch64-Code, sodass dies in der Praxis hervorragend funktioniert. Wenn Sie verwalteten Code HWASAN_OPTIONS=fast_unwind_on_malloc=0 müssen, setzen Sie HWASAN_OPTIONS=fast_unwind_on_malloc=0 in der Prozessumgebung. Beachten Sie, dass bei Stapelspuren für fehlerhaften Speicherzugriff standardmäßig der "langsame" Abwickler verwendet wird. Diese Einstellung wirkt sich nur auf Zuordnungs- und Freigabespuren aus. Diese Option kann je nach Auslastung sehr CPU-intensiv sein.

Symbolisierung

Siehe Symbolisierung in der ASan-Dokumentation.

HWASan 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 HWASan-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.