HWAddressSanitizer

Vedi Comprendere i report HWASan per informazioni su come leggere gli arresti anomali di HWASan!

AddressSanitizer (HWASan) assistito da hardware è uno strumento di rilevamento degli errori di memoria simile a AddressSanitizer . HWASan utilizza molta meno RAM rispetto ad ASan, il che lo rende adatto alla sanificazione dell'intero sistema. HWASan è disponibile solo su Android 10 e versioni successive e solo su hardware AArch64.

Sebbene sia utile principalmente per il codice C/C++, HWASan può anche aiutare a eseguire il debug del codice Java che causa arresti anomali nel C/C++ utilizzato per implementare le interfacce Java. È utile perché rileva gli errori di memoria quando si verificano, indirizzandoti direttamente al codice responsabile.

Puoi eseguire il flashing di immagini HWASan predefinite sui dispositivi Pixel supportati da ci.android.com ( istruzioni dettagliate per la configurazione ).

Rispetto al classico ASan, HWASan dispone di:

  • Overhead della CPU simile (~2x)
  • Overhead di dimensioni del codice simili (40 – 50%)
  • Overhead di RAM molto inferiore (10% – 35%)

HWASan rileva la stessa serie di bug di ASan:

  • Overflow/underflow del buffer di stack e heap
  • Utilizzo dell'heap dopo la disponibilità
  • Lo stack utilizza l'ambito esterno
  • Doppia libera/selvaggia libera

Inoltre, HWASan rileva l'utilizzo dello stack dopo la restituzione.

HWASan (come ASan) è compatibile con UBSan , entrambi possono essere abilitati su un target contemporaneamente.

Dettagli e limitazioni dell'implementazione

HWASan si basa sull'approccio del tagging della memoria , in cui un piccolo valore di tag casuale è associato sia ai puntatori che agli intervalli di indirizzi di memoria. Affinché un accesso alla memoria sia valido, il puntatore e i tag di memoria devono corrispondere. HWASan si affida alla funzionalità ARMv8 top byte ignore (TBI), chiamata anche tagging dell'indirizzo virtuale , per memorizzare il tag del puntatore nei bit più alti dell'indirizzo.

Puoi leggere ulteriori informazioni sulla progettazione di HWASan sul sito della documentazione di Clang.

In base alla progettazione, HWASan non dispone delle zone rosse di dimensioni limitate di ASan per il rilevamento di overflow o della quarantena a capacità limitata di ASan per il rilevamento dell'uso dopo la disponibilità. Per questo motivo, HWASan è in grado di rilevare un bug indipendentemente dall'entità dell'overflow o da quanto tempo fa la memoria è stata deallocata. Ciò conferisce 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 qualsiasi bug durante un'esecuzione del programma.

Requisiti

Le versioni recenti (4.14+) del comune kernel Android supportano HWASan immediatamente. I rami specifici di Android 10 non supportano HWASan.

Il supporto dello spazio utente per HWASan è disponibile a partire da Android 11 .

Se stai lavorando con un kernel diverso, HWASan richiede che il kernel Linux accetti puntatori con tag negli argomenti delle chiamate di sistema. Il supporto per questo è stato implementato nei seguenti patchset upstream:

Se stai creando con una toolchain personalizzata, assicurati che includa tutto fino al commit LLVM c336557f .

Utilizzando 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 comodità, puoi aggiungere l'impostazione SANITIZE_TARGET a una definizione di prodotto, simile a aosp_coral_hwasan .

Per gli utenti che hanno familiarità con AddressSanitizer, gran parte della complessità di creazione è stata eliminata:

  • Non è necessario eseguire make due volte.
  • Le build incrementali funzionano immediatamente.
  • Non è necessario eseguire il flashing dei dati utente.

Sono state eliminate anche alcune restrizioni di AddressSanitizer:

  • Sono supportati gli eseguibili statici.
  • È corretto saltare la sanificazione di qualsiasi target diverso da libc. A differenza di ASan, non è necessario che se una libreria viene ripulita, anche qualsiasi eseguibile ad essa collegata debba esserlo.

Il passaggio tra HWASan e immagini normali con lo stesso numero di build (o superiore) può essere effettuato liberamente. Non è necessario pulire il dispositivo.

Per ignorare la sanitizzazione di un modulo, utilizzare LOCAL_NOSANITIZE := hwaddress (Android.mk) o sanitize: { hwaddress: false } (Android.bp).

Sanificazione dei singoli target

HWASan può essere abilitato per target in una build normale (non disinfettata), a condizione che anche libc.so sia disinfettato. Aggiungi hwaddress: true al blocco sanitize in "libc_defaults" in bionic/libc/Android.bp. Quindi fai lo stesso con l'obiettivo su cui stai lavorando.

Da notare che la sanificazione di libc abilita il tagging delle allocazioni di memoria heap a livello di sistema, così come il controllo dei tag per le operazioni di memoria all'interno di libc.so . Ciò potrebbe rilevare bug anche nei binari su cui HWASan non è stato abilitato se l'accesso alla memoria non valido è in libc.so (es. pthread_mutex_unlock() su un delete() ed mutex).

Non è necessario modificare alcun 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 di HWASan per gli sviluppatori di app.

Meglio impilare le tracce

HWASan utilizza uno svolgitore veloce basato su frame-pointer per registrare una traccia dello stack per ogni evento di allocazione e deallocazione della memoria nel programma. Android abilita i puntatori ai frame nel codice AArch64 per impostazione predefinita, quindi funziona benissimo nella pratica. Se è necessario rilassarsi tramite il codice gestito, impostare HWASAN_OPTIONS=fast_unwind_on_malloc=0 nell'ambiente del processo. Si noti che le tracce dello stack di accesso alla memoria errate utilizzano lo svolgitore "lento" per impostazione predefinita; questa impostazione influisce solo sulle tracce di allocazione e deallocazione. Questa opzione può richiedere un utilizzo molto intenso della CPU, a seconda del carico.

Simbolizzazione

Vedere Simbolizzazione in "Informazioni sui report HWASan".

HWASan nelle app

Similmente a AddressSanitizer, HWASan non può vedere il codice Java, ma può rilevare 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 creando il relativo codice con SANITIZE_TARGET:=hwaddress in Make o -fsanitize=hwaddress nei flag del compilatore. Su un dispositivo non HWASan (che esegue Android 14 o versioni successive), è necessario aggiungere un'impostazione del file wrap.sh LD_HWASAN=1 . Consulta la documentazione per gli sviluppatori dell'app per ulteriori dettagli.