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:
- arm64 tagged address ABI
- 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: sprawdzanie oznaczonych adresów w funkcji access_ok() wywoływanej 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.
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.