HWAddressSanitizer

Assistita da hardware AddressSanitizer (HWASan) è uno strumento di rilevamento errore 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, indicandoti direttamente il codice responsabile.

Si può lampeggiare predefiniti immagini HWASan ai dispositivi supportati da Pixel ci.android.com ( istruzioni dettagliate ).

Rispetto al classico ASan, HWASan ha:

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

HWASan rileva lo stesso insieme di bug di Asan:

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

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

Dettagli di implementazione e limitazioni

HWASan è basato sulla codifica memoria approccio, dove un piccolo valore variabile casuale è associata sia con puntatori e con 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 caratteristica cima byte ignorare (TBI), chiamato anche il tagging indirizzo virtuale, per memorizzare il tag puntatore nelle più alte bit dell'indirizzo.

Si può leggere di più il design della HWASan sul sito della documentazione Clang.

In base alla progettazione, HWASan non ha le zone rosse di dimensioni limitate di Asan per il rilevamento degli overflow o la 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 dalla dimensione dell'overflow o da quanto tempo è stata deallocata la memoria. Questo dà 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 qualsiasi bug durante un'esecuzione del programma.

Requisiti

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:

Queste patch sono disponibili come backports nel comune Android kernel in android-4.14 e rami superiori, ma non in Android 10-specifici settori, quali quelli android-4.14-q .

Supporto userspace per HWASan è disponibile a partire con Android 11.

Se si sta costruendo con un toolchain personalizzato, assicurarsi che include tutto ciò che fino a LLVM impegnarsi 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à, è possibile aggiungere l'impostazione SANITIZE_TARGET a una definizione del prodotto, simile a aosp_coral_hwasan .

A differenza di Asan, con HWASan non è necessario creare due volte. Incrementale costruisce solo il lavoro, non ci sono indicazioni lampeggianti istruzioni o pulendo requisito, eseguibili statici sono supportati, e va bene per saltare sanificazione di qualsiasi altra libreria di libc . Inoltre, non è necessario che se una libreria viene disinfettata, anche qualsiasi eseguibile che si collega ad essa deve essere disinfettato.

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

I singoli moduli possono essere sterilizzate con HWASan, con l'avvertenza che libc è anche HWASan-ified. Questo può essere fatto con l'aggiunta di sanitize: { hwaddress: true } al rispettivo Android.bp definizione del modulo. L'intera piattaforma Android è costruito con HWASan quando si utilizza un _hwasan accumulo -suffixed (compresi libc ), e come tale sanificazione manualmente libc non è necessario per costruisce HWASan.

Migliori tracce dello stack

HWASan utilizza uno svolgitore veloce 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 ai frame nel codice AArch64 per impostazione predefinita, quindi funziona alla grande nella pratica. Se avete bisogno di rilassarvi con codice gestito, impostare HWASAN_OPTIONS=fast_unwind_on_malloc=0 in ambiente di processo. Si noti che le tracce dello stack di accesso alla memoria non valide utilizzano lo svolgitore "lento" per impostazione predefinita; questa impostazione ha effetto solo sulle tracce di allocazione e deallocazione. Questa opzione può essere molto impegnativa per la CPU, a seconda del carico.

simbolizzazione

Vedere simbolizzazione nella documentazione Asan.

HWASan nelle app

Simile a AddressSanitizer, HWASan non può vedere nel codice Java, ma può rilevare bug nelle librerie JNI. Diversamente Asan, correndo HWASan applicazioni su un dispositivo non HWASan non è supportato.

Su un dispositivo HWASan, le applicazioni possono essere controllati con HWASan costruendo il loro codice con SANITIZE_TARGET:=hwaddress Make, o -fsanitize=hwaddress in bandiere del compilatore. Vedere la documentazione di sviluppatore di applicazioni per maggiori dettagli.