AddressSanitizer con supporto hardware

Consulta la sezione Informazioni su 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 predefinite sui dispositivi Pixel supportati a partire da ci.android.com. (istruzioni dettagliate per la configurazione).

Rispetto alla versione classica di ASan, HWASan offre:

  • Overhead CPU simile (~2x)
  • Overhead per dimensioni codice simili (40-50%)
  • Overhead RAM molto minore (10%-35%)

HWASan rileva lo stesso insieme di bug di ASan:

  • overflow/underflow del buffer di stack e 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 possono essere abilitate contemporaneamente su una destinazione.

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. Per un ricordo sia valido, il puntatore e i tag di memoria devono corrispondere. HWASan si basa sul rilevamento dei byte principali (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ù il design di HWASan sul sito della documentazione Clang.

Per progettazione, HWASan non dispone delle zone rosse di dimensioni limitate di ASan per rilevare gli overflow o la quarantena a capacità limitata di ASan rilevare l'uso dopo la prova senza costi. Per questo motivo, HWASan può rilevare un bug a prescindere dalle dimensioni dell'overflow o da quanto tempo è stato ma non in fase di distribuzione. 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 c'è una probabilità dello 0,4% di perdere qualche bug. durante un'esecuzione del programma.

Requisiti

Le versioni recenti (4.14+) di supporto del kernel Android comune HWASan pronto all'uso. I rami specifici 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 cursori con tag in degli argomenti delle chiamate di sistema. Il supporto è stato implementato nei seguenti set di patch upstream:

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

Usa HWASan

Usa i comandi seguenti 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 l'operazione due volte.
  • Le build incrementali sono pronte all'uso.
  • 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 cancellare i dati del dispositivo.

Per saltare la sanificazione di un modulo, utilizza LOCAL_NOSANITIZE := hwaddress (Android.mk) o sanitize: { hwaddress: false } (Android.bp).

Pulisci i singoli target

HWASan può essere attivato in base al target in una build normale (non convalidata), a condizione che anche libc.so sia sterilizzato. Aggiungi hwaddress: true al blocco Sanitize in "libc_defaults" in bionic/libc/Android.bp. Ripeti la stessa operazione 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é controllo dei tag per verificare la presenza di operazioni di memoria in libc.so. Questo può 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.

Stazione flash

A scopo di sviluppo, puoi eseguire il flashing di una build di AOSP compatibile con HWASan su un dispositivo Pixel con bootloader sbloccato utilizzando Flashstation. Seleziona il target _hwasan, ad esempio aosp_flame_hwasan-userdebug. Consulta le Documentazione NDK per HWASan per gli sviluppatori di app.

Analisi dello stack migliori

HWASan utilizza un unwinder veloce basato su frame pointer per registrare uno stack per ogni evento di allocazione della memoria e di dealcazione . Android attiva i puntatori ai frame nel codice AArch64 per impostazione predefinita, quindi nella pratica funziona molto bene. Se hai bisogno di rilassarti durante codice gestito, imposta HWASAN_OPTIONS=fast_unwind_on_malloc=0 nell'ambiente dei processi. Nota che lo stack di accesso alla memoria non è valido le tracce usano l'espressione "lenta" unwinder per impostazione predefinita; questa impostazione influisce solo di allocazione e di allocazione. Questa opzione può essere molto che richiede molta 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 con HWASan le app su un dispositivo non HWASan non erano supportate.

Su un dispositivo HWASan, è possibile controllare le app con HWASan creando il proprio 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), un'impostazione del file wrap.sh È necessario aggiungere LD_HWASAN=1. Consulta le documentazione per gli sviluppatori di app per ulteriori dettagli.