Wspomagany sprzętowy czytnik adresu

Patrz Omówienie HWASan raportów, aby dowiedzieć się, jak odczytywać informacje o awariach HWASan.

Wspomagany sprzętowo aplikacja AddressSanitizer (HWASan) oznacza błąd pamięci narzędzie do wykrywania podobne do AddressSanitizer. HWASan, i wykorzystuje znacznie mniej pamięci RAM w porównaniu z ASan, dezynfekcji całego systemu. Oprogramowanie HWASan jest dostępne tylko na Androidzie 10 i wyższych i tylko na sprzęcie AArch64.

Choć HWASan jest szczególnie przydatny w przypadku kodu C/C++, może również być pomocny w debugowaniu kodu w Javie, który powoduje w kodzie C/C++ używanych do implementacji interfejsów Java. Jest pomocna, bo zapamiętuje zapamiętywanie w razie wystąpienia błędów, wskazując bezpośrednio odpowiedzialny kod.

Możesz wgrywać gotowe obrazy HWASan na obsługiwane urządzenia Pixel z 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 mniejszy narzut pamięci RAM (10–35%)

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

  • Przepełnienie/niedopełnienie bufora stosu i sterty
  • Wykorzystanie sterty po bezpłatnym
  • Użycie stosu poza zakresem
  • Podwójny wolny/szlachetny

Dodatkowo HWASan wykrywa użycie stosu po powrocie.

HWASan (tak samo jak ASan) jest zgodny z UBSan mogą być włączone w miejscu docelowym jednocześnie.

Szczegóły i ograniczenia implementacji

Środowisko HWASan opiera się pamięć tagowaniem, w której kojarzona jest mała wartość losowa tagu. zarówno ze wskaźnikami, jak i z zakresami adresów pamięci. Wspomnienie aby dostęp 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. Dzięki temu HWASan ma 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 pracujesz z innym jądrem, HWASan wymaga, aby jądro Linux akceptowało otagowane wskaźniki argumentów wywołania systemowego. Obsługa tego rozwiązania została wdrożona w następujących nadrzędnych zestawach poprawek:

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

Używanie 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.
  • Dzięki przyrostowemu narzędziu możesz od razu zacząć pracę.
  • Nie ma potrzeby aktualizowania danych użytkownika.

Zrezygnowaliśmy też z niektórych ograniczeń usługi AddressSanitizer:

  • Statyczne pliki wykonywalne są obsługiwane.
  • Można pominąć dezynfekcję obiektów docelowych innych 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 między HWASan a zwykłymi obrazami z tym samym (lub wyższym) numerem kompilacji może być można robić swobodnie. Czyszczenie pamięci urządzenia nie jest wymagane.

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

Napraw poszczególne wartości docelowe

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 miejscu docelowym, nad którym pracujesz.

Pamiętaj, że oczyszczanie biblioteki libc umożliwia tagowanie alokacji pamięci na stercie w całym systemie, sprawdzania tagów pod kątem operacji pamięci wewnątrz 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() w delete()edytowanym trybie mutex).

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. Zobacz Dokumentacja NDK na temat HWASan dla deweloperów aplikacji.

Lepsze zrzuty stosu

HWASan nagrywa stos za pomocą szybkiego elementu rozwijania opartego na wskaźnikach klatek dla każdego zdarzenia alokacji pamięci i przydziału lokalizacji w funkcji programu. 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. Zwróć uwagę, że nieprawidłowy stos dostępu do pamięci w śladach używamy funkcji „wolne” domyślny element rozwijania; dotyczy tylko tego ustawienia oraz śledzenie alokacji i alokacji. Ta opcja może być bardzo intensywność pracy procesora w zależności od obciążenia.

Symbole

Patrz symbolizacja. w artykule „Interpretowanie raportów HWASan”.

HWASan w aplikacjach

Podobnie jak w przypadku AddressSanitizer, HWASan nie widzi kodu Java, ale i 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 aplikacje można sprawdzać za pomocą HWASan, tworząc ich kod z SANITIZE_TARGET:=hwaddress w Make lub -fsanitize=hwaddress w flagach kompilatora. na urządzeniu bez obsługi HWASan (z Androidem 14 lub nowszym) ustawienie pliku wrap.sh Musisz dodać LD_HWASAN=1. Zobacz dokumentacja dla deweloperów aplikacji .