Wspomagany sprzętowy czytnik adresu

Aby dowiedzieć się, jak interpretować raporty HWASan, przeczytaj artykuł Informacje o raportach HWASan.

AdresSanitizer z obsługą sprzętową (HWASan) to narzędzie do wykrywania błędów pamięci podobne do AddressSanitizer. HWASan, i wykorzystuje znacznie mniej pamięci RAM w porównaniu z ASan, dezynfekcji całego systemu. HWASan jest dostępny tylko na Androidzie 10 lub nowszym i tylko na sprzęcie AArch64.

Jest to przydatne głównie w przypadku kodu C/C++, jednak może także być pomocne w debugowaniu kodu w Javie, który sprawia, w kodzie C/C++ używanych do implementacji interfejsów Java. Jest to przydatne, ponieważ pozwala wykrywać błędy pamięci w momencie ich wystąpienia i wskazuje kod, który je wywołuje.

Gotowe obrazy HWASan można wgrać na obsługiwane urządzenia Pixel ze strony ci.android.com (szczegółowe instrukcje konfiguracji).

W porównaniu do klasycznego ASan HWASan ma:

  • Podobny narzut procesora (ok. 2x)
  • Narzut związany z podobnym rozmiarem kodu (40–50%)
  • znacznie mniejsze obciążenie pamięci RAM (10–35%),

HWASan wykrywa ten sam zestaw błędów co ASan:

  • Przepełnienie/niedopełnienie bufora stosu i bufora stosu.
  • Użycie sterty po zwalnianiu
  • Użycie zasobów spoza zakresu
  • Podwójny wolny/szlachetny

Dodatkowo HWASan wykrywa użycie stosu po powrocie.

HWASan (tak samo jak ASan) jest zgodny z UBSan. Oba mogą być włączone na tym samym celu jednocześnie.

Szczegóły implementacji i ograniczenia

HWASan opiera się na podejściu tagowania pamięci, w którym mała losowa wartość tagu jest powiązana zarówno z wskaźnikami, jak i z zakresami adresów pamięci. Aby dostęp do pamięci był prawidłowy, tagi wskaźnika i pamięci muszą być zgodne. HWASan opiera się na ignorowaniu górnego bajtów (TBI) funkcji ARMv8, nazywanej też tagowanie adresów wirtualnych, by przechowywać tag wskaźnika w sekcji najwyższe bity adresu.

Więcej informacji znajdziesz design HWASan na stronie z dokumentacją Clang.

Z założenia HWASan nie ma ograniczonych czerwonych stref ASan dla wykrywanie przepełnienia lub kwarantanna ASan o ograniczonej pojemności w po to, żeby wykryć użycie tych treści. Z tego powodu HWASan może wykryć błąd, bez względu na to, jak duże jest nadmiarowe obciążenie i jak dawno temu było w pamięci przydzielony. Daje to HWASan dużą przewagę nad ASan.

HWASan ma jednak ograniczoną liczbę możliwych wartości tagów (256), co oznacza, że prawdopodobieństwo pominięcia któregokolwiek błędu wynosi 0,4%. podczas jednego uruchomienia programu.

Wymagania

Najnowsze wersje (4.14 i nowsze) obsługa typowego jądra Androida; Gotowy do działania HWAS. Gatunki Androida 10 nie obsługują HWASan.

Obsługa obszaru użytkownika w przypadku HWASan jest dostępna od Androida 11.

Jeśli używasz innego jądra, HWASan wymaga, aby jądro Linuxa akceptowało otagowane wskaźniki w argumentach wywołania systemu. Obsługa tej funkcji została wdrożona w tych zbiorach poprawek upstream:

Jeśli tworzysz materiały z użyciem niestandardowego łańcucha narzędzi, upewnij się, że zawiera on wszystko, aż do zatwierdzenia LLVM c336557f.

Korzystanie z HWASan

Aby utworzyć całą platformę przy użyciu HWASan, użyj tych poleceń:

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

Możesz dla wygody dodać ustawienie SANITIZE_TARGET do definicji produktu, podobne do aosp_coral_hwasan.

Użytkownicy zaznajomieni z usługą AddressSanitizer nie muszą już martwić się o wiele złożoności:

  • Nie musisz biegać dwa razy.
  • Gotowe narzędzia przyspieszają pracę.
  • Nie trzeba flashować danych użytkownika.

Usunięto też niektóre ograniczenia związane z AddressSanitizer:

  • Obsługiwane są statyczne pliki wykonywalne.
  • Możesz pominąć oczyszczanie dowolnego celu innego niż libc. W przeciwieństwie do ASan nie ma wymogu, że po oczyszczeniu biblioteki każdy plik wykonywalny, z którym jest połączona, również musi zostać oczyszczony.

Przełączanie się między obrazami HWASan i zwykłymi obrazami o tym samym (lub wyższym) numerze kompilacji jest dowolne. Czyszczenie pamięci urządzenia nie jest wymagane.

Aby pominąć sterylizację modułu, użyj opcji LOCAL_NOSANITIZE := hwaddress (Android.mk) lub sanitize: { hwaddress: false } (Android.bp).

Sanitize individual targets

HWASan można włączyć dla poszczególnych miejsc docelowych w zwykłej (nieoczyszczonej) kompilacji, o ile występuje też zasada libc.so oczyszczony. Dodaj hwaddress: true do bloku oczyszczania w: "libc_defaults" w plikach bionic/libc/Android.bp. Następnie zrób to samo w przypadku celu, nad którym pracujesz.

Pamiętaj, że sterylizacja biblioteki libc umożliwia oznaczanie alokacji pamięci stosu w całym systemie, a także sprawdzanie tagów pod kątem operacji na pamięci w funkcji libc.so. Może to wychwytywać błędy nawet w plikach binarnych że oprogramowanie HWASan nie zostało włączone, jeśli dostęp do pamięci jest nieprawidłowy w: libc.so (Na przykład pthread_mutex_unlock() na zablokowanym delete().

Jeśli cała platforma korzysta z HWASan, nie musisz zmieniać żadnych plików kompilacji.

Flashstation

Na potrzeby programowania możesz zainstalować na urządzeniu Pixel kompilację AOSP z włączoną obsługą HWASan z odblokowanym programem rozruchowym Flashstation Wybierz cel _hwasan, np. aosp_flame_hwasan-userdebug. Więcej informacji znajdziesz w dokumentacji NDK dla HWASan dla programistów aplikacji.

Lepsze zrzuty stosu

HWASan używa szybkiego odwijacza opartego na wskazniku ramki do rejestrowania ścieżki stosu dla każdego zdarzenia przydzielenia i zwolnienia pamięci w programie. Android domyślnie włącza wskaźniki klatek w kodzie AArch64, więc w praktyce świetnie się to sprawdza. Jeśli chcesz się zrelaksować kod zarządzany, ustaw HWASAN_OPTIONS=fast_unwind_on_malloc=0 w środowisku procesów. Pamiętaj, że śledzenie ścieżki dostępu do pamięci z błędem domyślnie używa „wolnego” odwijacza. To ustawienie dotyczy tylko śledzenia alokacji i zwolnienia pamięci. W zależności od obciążenia ta opcja może mocno obciążać procesor.

Symbolizacja

Zapoznaj się z sekcją Symbolizacja w artykule „Interpretowanie raportów HWASan”.

HWASan w aplikacjach

Podobnie jak narzędzie AddressSanitizer, HWASan nie może przeglądać kodu Java, ale może wykrywać błędy w bibliotekach JNI. Do Androida 14 z obsługą HWASan aplikacje na urządzeniach innych niż HWASan nie były obsługiwane.

Na urządzeniu HWASan można sprawdzać aplikacje za pomocą HWASan, kompilując kod za pomocą parametru SANITIZE_TARGET:=hwaddress w Make lub parametru -fsanitize=hwaddress w flagach kompilatora. Na urządzeniu, które nie jest urządzeniem HWASan (z Androidem 14 lub nowszym), należy dodać ustawienie pliku wrap.sh:LD_HWASAN=1. Więcej informacji znajdziesz w dokumentacji dla programistów aplikacji.