Disinfettante per indirizzi HWA

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 in C/C++ utilizzato per implementare le interfacce Java. È utile perché rileva gli errori di memoria quando si verificano, indicandoti direttamente il codice responsabile.

È possibile 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 ha:

  • Simile sovraccarico della CPU (~2x)
  • Sovraccarico di dimensioni del codice simili (40 – 50%)
  • Sovraccarico RAM molto inferiore (10% - 35%)

HWASan rileva la stessa serie di bug di ASan:

  • Overflow/underflow del buffer di stack e heap
  • Heap usa dopo gratis
  • Stack utilizza al di fuori dell'ambito
  • Doppio libero/selvaggio libero

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

Dettagli e limitazioni di 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 basa su ARMv8 feature top byte ignore (TBI), chiamato anche virtual address tagging , per memorizzare il tag del puntatore nei bit più alti dell'indirizzo.

Puoi leggere di più sulla progettazione di HWASan sul sito della documentazione di Clang.

In base alla progettazione, HWASan non ha le zone rosse di dimensioni limitate di ASan per rilevare gli overflow o la quarantena a capacità limitata di ASan per rilevare l'uso gratuito. Per questo motivo, HWASan è in grado di rilevare un bug indipendentemente dall'entità dell'overflow o da quanto tempo è stata deallocata la memoria. Questo dà a HWASan un grande vantaggio su 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 qualsiasi bug durante un'esecuzione del programma.

Requisiti

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 a monte:

Queste patch sono disponibili come backport nel kernel Android comune nei rami Android-4.14 e versioni successive, ma non nei rami specifici di Android 10 come Android-4.14-q .

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

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

Utilizzando 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 .

A differenza di ASan, con HWASan non è necessario costruire due volte. Le build incrementali funzionano, non ci sono istruzioni speciali per il flashing o requisiti di cancellazione, sono supportati eseguibili statici e va bene saltare la sanificazione di qualsiasi libreria diversa da libc . Inoltre, non è necessario che se una libreria viene disinfettata, anche qualsiasi eseguibile che si collega ad essa debba essere disinfettato.

Per saltare la sanificazione di un modulo, utilizzare LOCAL_NOSANITIZE := hwaddress o sanitize: { hwaddress: false } .

I singoli moduli possono essere disinfettati con HWASan, con l'avvertenza che anche libc è HWASan-ificato. Questo può essere fatto aggiungendo sanitize: { hwaddress: true } alla rispettiva definizione del modulo Android.bp . L'intera piattaforma Android viene creata con HWASan quando si utilizza una build con _hwasan (inclusa libc ) e, pertanto, la sanificazione manuale di libc non è necessaria per le build HWASan.

Tracce di impilamento migliori

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 frame nel codice AArch64 per impostazione predefinita, quindi in pratica funziona alla grande. Se è necessario rilassarsi attraverso 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 non valide utilizzano lo svolgitore "lento" per impostazione predefinita; questa impostazione influisce solo sulle tracce di allocazione e deallocazione. Questa opzione può richiedere molto CPU, a seconda del carico.

Simbolizzazione

Vedere la simbolizzazione nella documentazione di ASan.

HWASan nelle app

Simile a AddressSanitizer, HWASan non può vedere nel codice Java, ma può rilevare bug nelle librerie JNI. A differenza di ASan, l'esecuzione di app HWASan su un dispositivo non HWASan non è supportata.

Su un dispositivo HWASan, le app possono essere controllate con HWASan creando il loro codice con SANITIZE_TARGET:=hwaddress in Make o -fsanitize=hwaddress nei flag del compilatore. Consulta la documentazione per gli sviluppatori di app per maggiori dettagli.