Consulta Informazioni sui report HWASan per informazioni su come leggere gli arresti anomali di HWASan.
L'hardware AddressSanitizer (HWASan) è un errore di memoria di rilevamento dei problemi simile a AddressSanitizer. HWASan usa molta meno RAM rispetto ad ASan, il che la rende adatta la sanificazione dell'intero sistema. HWASan è disponibile solo su Android 10 e successivi, solo su hardware AArch64.
Sebbene sia utile soprattutto per il codice C/C++, HWASan può anche contribuire a eseguire il debug del codice Java che causa arresti anomali in C/C++ utilizzati per implementare le interfacce Java. È utile perché acquisisce la memoria errori quando si verificano, indirizzandoti direttamente al codice responsabile.
Puoi eseguire il flashing di immagini HWASan precompilate sui dispositivi Pixel supportati da ci.android.com (istruzioni di configurazione dettagliate).
Rispetto all'ASAn classico, HWASan offre:
- Carico della CPU simile (~2 volte)
- Overhead simile per le dimensioni del codice (40-50%)
- Overhead della RAM molto inferiore (10-35%)
HWASan rileva lo stesso insieme di bug di ASan:
- Overflow/underflow del buffer dello stack e dell'heap
- Utilizzo dell'heap dopo la prova senza costi
- Utilizzo dello stack al di fuori dell'ambito
- Doppio/libero/selvaggio
Inoltre, HWASan rileva l'utilizzo dello stack dopo il reso.
HWASan (come ASan) è compatibile con UBSan, entrambi possono essere attivati contemporaneamente in un target.
Dettagli e limitazioni dell'implementazione
HWASan si basa sul memoria di tagging, in cui viene associato un piccolo valore di tag casuale sia con puntatori che con intervalli di indirizzi di memoria. Affinché un accesso alla memoria sia valido, i tag del puntatore e della memoria devono corrispondere. HWASan si basa sul rilevamento dei byte più alto (TBI) delle funzionalità ARMv8, chiamato anche codifica degli indirizzi virtuale, per memorizzare il tag puntatore nel i bit più alti dell'indirizzo.
Puoi scoprire di più su progettazione di HWASan sul sito di documentazione di Clang.
Per impostazione predefinita, HWASan non dispone delle zone rosse di dimensioni limitate di ASan per il rilevamento degli overflow o della quarantena con capacità limitata di ASan per il rilevamento dell'utilizzo dopo la fine del periodo di prova. Per questo motivo, HWASan può rilevare un bug indipendentemente dalle dimensioni dell'overflow o dal tempo trascorso dall'allocazione della memoria. Questo offre a HWASan un grande vantaggio rispetto ad ASan.
Tuttavia, HWASan ha un numero limitato di possibili valori di tag (256), il che significa che esiste una probabilità dello 0,4% di perdere un bug durante un'esecuzione del programma.
Requisiti
Le versioni recenti (4.14+) di supporto del kernel Android comune HWASan pronto all'uso. I branch specifici di Android 10 non supportano HWASan.
Il supporto dello spazio utente per HWASan è disponibile a partire da Android 11.
Se utilizzi un kernel diverso, HWASan richiede che il kernel Linux accetti i puntatori con tag negli argomenti delle chiamate di sistema. Il supporto è stato implementato nei seguenti set di patch upstream:
- ABI indirizzo con tag arm64
- arm64: annulla il tagging dei puntatori utente passati al kernel
- mm: evita di creare alias di indirizzi virtuali in brk()/mmap()/mremap()
- arm64: convalida gli indirizzi taggati in access_ok() richiamati dai thread del kernel
Se stai creando con una toolchain personalizzata, assicurati che includa tutto fino al commit LLVM c336557f
Usa HWASan
Utilizza i seguenti comandi per creare l'intera piattaforma utilizzando HWASan:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
Per praticità, puoi aggiungere l'impostazione SANITIZE_TARGET a una definizione di prodotto. simile a aosp_coral_hwasan.
Per gli utenti che hanno familiarità con AddressSanitizer, molte complessità della build sono finite:
- Non è necessario eseguire make due volte.
- Le build incrementali funzionano immediatamente.
- Non è necessario eseguire il flashing dei dati utente.
Sono state eliminate anche alcune limitazioni di AddressSanitizer:
- Gli eseguibili statici sono supportati.
- È consentito saltare la sanificazione di qualsiasi target diverso da libc. A differenza di ASan, senza alcun requisito che se una libreria sia bonificata, devono esserlo anche tutti gli eseguibili che la collegano.
È possibile passare da immagini HWASan a immagini normali e viceversa con lo stesso numero di build (o superiore) fatto liberamente. Non è necessario resettare il dispositivo.
Per saltare la sanificazione di un modulo, utilizza
LOCAL_NOSANITIZE := hwaddress
(Android.mk) o
sanitize: { hwaddress: false }
(Android.bp).
Sanitizzare i singoli target
HWASan può essere attivato per target in una build normale (non sanificata), a condizione che anche libc.so
sia
sanificato. Aggiungi hwaddress: true
al blocco di sanitizzazione in "libc_defaults"
in bionic/libc/Android.bp. Poi fai lo stesso nel target su cui stai lavorando.
Tieni presente che la sanitizzazione di libc consente il tagging delle allocazioni di memoria heap a livello di sistema, nonché il controllo dei tag per le operazioni di memoria all'interno di libc.so
. Potrebbe rilevare bug anche nei file binari
su cui HWASan non è stato abilitato se l'accesso alla memoria non è corretto se si trova in libc.so
(ad es. pthread_mutex_unlock()
su un mutex delete()
ed).
Non è necessario modificare i file di build se l'intera piattaforma è creata utilizzando HWASan.
Flashstation
Per scopi di sviluppo, puoi eseguire il flashing di una build di AOSP abilitata per HWASan su un dispositivo Pixel con bootloader sbloccato utilizzando Flashstation. Seleziona il target _hwasan, ad esempio aosp_flame_hwasan-userdebug. Per ulteriori dettagli, consulta la documentazione NDK per HWASan per gli sviluppatori di app.
Analisi dello stack migliori
HWASan utilizza un smontatore rapido basato su puntatori frame per registrare una traccia
dello stack per ogni evento di allocazione e deallocazione della memoria nel
programma. Android attiva i puntatori ai frame nel codice AArch64 per impostazione predefinita,
quindi nella pratica funziona molto bene. Se devi annullare il codice gestito, imposta HWASAN_OPTIONS=fast_unwind_on_malloc=0
nell'ambiente di processo. Tieni presente che per impostazione predefinita le tracce dello stack di accesso alla memoria errata utilizzano lo scollegamento "lento". Questa impostazione influisce solo sulle tracce di allocazione e deallocazione. Questa opzione può richiedere molto
tempo della CPU, a seconda del carico.
Simbolizzazione
Vedi Simbolizzazione in "Informazioni sui report HWASan".
HWASan nelle app
Analogamente a AddressSanitizer, HWASan non può vedere nel codice Java, ma può rilevare i bug nelle librerie JNI. Fino ad Android 14, l'esecuzione di app HWASan su un dispositivo non HWASan non era supportata.
Su un dispositivo HWASan, le app possono essere controllate con HWASan compilando il loro codice con SANITIZE_TARGET:=hwaddress
in Make o -fsanitize=hwaddress
nei flag del compilatore.
Su un dispositivo non HWASan (con Android 14 o versioni successive), è necessario aggiungere un'impostazione del file wrap.sh
LD_HWASAN=1
.
Per ulteriori dettagli, consulta la
documentazione per gli sviluppatori di app.