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 zużywa znacznie mniej pamięci RAM w porównaniu z ASan, co czyni go odpowiednim do sterylizacji całego systemu. Oprogramowanie HWASan jest dostępne tylko na Androidzie 10 i wyższych i tylko na sprzęcie AArch64.
HWASan jest przydatny przede wszystkim w przypadku kodu C/C++, ale może też pomóc w debugowaniu kodu Javy, który powoduje awarie kodu C/C++ używanego do implementowania interfejsów Javy. Jest pomocna, bo zapamiętuje zapamiętywanie w razie wystąpienia błędów, wskazując bezpośrednio odpowiedzialny kod.
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 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. 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 o projektowaniu HWASan znajdziesz w dokumentacji 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 niezależnie od tego, jak duży jest przepełniony obszar danych lub jak dawno został zwolniony. Dzięki temu HWASan ma dużą przewagę nad ASan.
HWASan ma jednak ograniczoną liczbę możliwych wartości tagów (256), co oznacza, że podczas jednego uruchomienia programu istnieje 0,4% prawdopodobieństwo, że nie zostanie wykryty żaden błąd.
Wymagania
Najnowsze wersje (4.14+) wspólnego jądra Androida obsługują HWAS „z pudełka”. Gałęzie przeznaczone do 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:
- Interfejs ABI adresu z tagiem arm64
- arm64: odznaczanie znaczników z wskaźnikami użytkownika przekazywanymi do jądra
- mm: Avoid creating virtual address aliases in 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 znający narzędzie AddressSanitizer nie muszą już zajmować się wieloma złożonymi kwestiami związanymi z kompilacją:
- Nie musisz uruchamiać make dwukrotnie.
- Gotowe narzędzia przyspieszają 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. Nie trzeba czyścić urządzenia.
Aby pominąć oczyszczanie modułu, użyj
LOCAL_NOSANITIZE := hwaddress
(Android.mk) lub
sanitize: { hwaddress: false }
(Android.bp).
Sanitize individual targets
HWASan można włączyć w ramach poszczególnych docelowych wersji w ramach zwykłej (nieoczyszczonej) kompilacji, o ile libc.so
zostanie również oczyszczona. 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 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()
na zablokowanym delete()
.
Jeśli cała platforma jest kompilowana za pomocą HWASan, nie trzeba 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 odtworzyć kod zarządzany, ustaw parametr HWASAN_OPTIONS=fast_unwind_on_malloc=0
w środowisku procesu. 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. Ta opcja może być bardzo
intensywność pracy procesora w zależności od obciążenia.
Symbolizacja
Patrz symbolizacja. w sekcji „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
.
Zobacz
dokumentacja dla deweloperów aplikacji
.