Disinfettante per indirizzi HWA

Vedere Comprensione dei rapporti 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 principalmente utile per il codice C/C++, HWASan può anche aiutare a eseguire il debug del codice Java che causa arresti anomali in 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 su dispositivi Pixel supportati da ci.android.com ( istruzioni di configurazione dettagliate ).

Rispetto al classico ASan, HWASan ha:

  • Sovraccarico CPU simile (~2x)
  • Sovraccarico di dimensioni del codice simili (40-50%)
  • Overhead RAM molto più piccolo (10% - 35%)

HWASan rileva la stessa serie di bug di ASan:

  • Overflow/underflow del buffer dello stack e dell'heap
  • Uso dell'heap dopo libero
  • Uso dello stack al di fuori dell'ambito
  • Doppio libero/selvaggio libero

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 di implementazione e limitazioni

HWASan si basa sull'approccio di tagging della memoria , in cui un piccolo valore di tag casuale è associato sia a puntatori che a 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 funzione ARMv8 top byte ignore (TBI), chiamata anche virtual address tagging , per memorizzare il tag del puntatore nei bit più alti dell'indirizzo.

Puoi leggere di più sul design 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 il libero. Per questo motivo, HWASan è in grado di rilevare un bug indipendentemente dall'entità dell'overflow o da quanto tempo è stata deallocata la memoria. 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 out-of-the-box. 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 i puntatori con tag negli argomenti delle chiamate di sistema. Il supporto per questo è stato implementato nei seguenti patchset upstream:

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

Utilizzo di HWASan

Utilizzare 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, molta complessità della build è scomparsa:

  • Non c'è bisogno di 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:

  • Gli eseguibili statici sono supportati.
  • Va bene saltare la sanificazione di qualsiasi destinazione diversa da libc. A differenza di ASan, non è necessario che se una libreria viene disinfettata, lo deve essere anche qualsiasi eseguibile che la collega.

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 saltare la sanificazione di un modulo, usa LOCAL_NOSANITIZE := hwaddress (Android.mk) o sanitize: { hwaddress: false } (Android.bp).

Sanificazione dei singoli bersagli

HWASan può essere abilitato per target in una build regolare (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 nel bersaglio su cui stai lavorando.

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

Non è necessario modificare alcun file di compilazione se l'intera piattaforma è compilata utilizzando HWASan.

Stazione flash

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 . Selezionare il target _hwasan, ad esempio aosp_flame_hwasan-userdebug. Consulta la documentazione NDK per HWASan per gli sviluppatori di app per ulteriori dettagli.

Migliori tracce dello stack

HWASan utilizza un veloce svolgitore basato su frame-pointer per registrare una traccia dello stack per ogni allocazione di memoria e evento di deallocazione nel programma. Android abilita i puntatori di frame nel codice AArch64 per impostazione predefinita, quindi funziona alla grande nella pratica. Se devi rilassarti tramite codice gestito, imposta HWASAN_OPTIONS=fast_unwind_on_malloc=0 nell'ambiente di 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ò essere molto impegnativa per la CPU, a seconda del carico.

Simbolizzazione

Vedere Simbolizzazione in "Informazioni sui report HWASan".

HWASan nelle app

Simile a AddressSanitizer, HWASan non può vedere nel 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 costruendo il loro 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.