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.
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 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:
- Interfejs ABI adresu z tagiem arm64
- arm64: usuń tagi ze wskaźników użytkownika przekazywanych do jądra
- mm: unikaj tworzenia wirtualnych aliasów adresów w funkcji brk()/mmap()/mremap()
- arm64: zweryfikuj otagowane adresy w funkcji access_ok() wywołanej z wątków jądra
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 sterty 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
.