Igienizzante per indirizzi HW

Android NDK supporta HWAddress Sanitizer, noto anche come HWASan, a partire da NDK r21 e Android 10 (livello API 29). HWASan è disponibile solo sui dispositivi Arm a 64 bit.

HWASan è uno strumento di rilevamento degli errori di memoria simile ad ASan. Rispetto alla classica ASan, HWASan ha:

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

HWASan rileva lo stesso insieme di bug di ASan:

  • Stack e heap buffer overflow o underflow
  • Utilizzo dell'heap dopo il giorno
  • Utilizzo dello stack al di fuori dell'ambito
  • Double Free o Wild Free

Inoltre, HWASan rileva anche:

  • Utilizzo dello stack dopo il reso

App di esempio

Un'app di esempio mostra come configurare una variante di build per Hwasan.

Android 13 o versioni precedenti: configurazione

Se sul tuo dispositivo è installato Android 14 o una versione successiva, puoi saltare questo passaggio e seguire le istruzioni per utilizzare wrap.sh nella sezione Build riportata di seguito. Puoi anche scegliere di seguire questa sezione e ignorare le istruzioni per l'utilizzo di wrap.sh di seguito.

Prima di Android 14, le applicazioni HWASan devono avere una build HWASan di Android. Puoi eseguire il flashing di immagini HWASan predefinite sui dispositivi Pixel supportati. Le build sono disponibili su ci.android.com, dove puoi fare clic sul quadrato per la build esatta che vuoi ottenere con un link Flash Build. Devi conoscere il nome in codice per il telefono.

Eseguire il flashing di una build di un dispositivo

Potrebbe essere più semplice visitare direttamente il sito flash.android.com, perché il flusso inizia a rilevare il tuo dispositivo e mostra solo le build che puoi utilizzare. Le seguenti immagini illustrano il flusso di configurazione in questo strumento.

Attiva la modalità sviluppatore sul dispositivo e collegala al computer utilizzando un cavo USB. Fai clic su Aggiungi nuovo dispositivo, seleziona il tuo dispositivo dalla finestra di dialogo e fai clic su Connetti.

Rileva un dispositivo per il flash Seleziona il dispositivo a cui connetterti

Fai clic sul dispositivo dopo averlo connesso per configurare la build. Nella casella Seleziona un ID build, seleziona il ramo aosp-master-with-phones-throttled per scegliere automaticamente l'immagine corretta per il dispositivo connesso.

Seleziona il dispositivo da usare per il flash Conferma le opzioni di Flash e il dispositivo

Fai clic su Installa per eseguire il flashing del dispositivo.

Puoi trovare ulteriori dettagli sulla configurazione necessaria nella documentazione dello strumento Flash per Android. In alternativa, puoi consultare la documentazione di AOSP per le istruzioni per la creazione di un'immagine HWASan dal codice sorgente.

Build

Per creare il codice nativo dell'app (JNI) con HWAddress Sanitizer, procedi nel seguente modo:

build-ndk

Nel file Application.mk:

APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress

C-Make

Nel file build.gradle del tuo modulo:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

Per ogni destinazione nel tuo file CMakeLists.txt:

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

Android 14 o versioni successive: aggiungi wrap.sh

Se utilizzi Android 14 o versioni successive, puoi utilizzare uno script wrap.sh per eseguire l'app debuggable su qualsiasi dispositivo Android. Puoi saltare questo passaggio se hai scelto di seguire i passaggi nella sezione Configurazione qui sopra.

Segui le istruzioni per pacchettizzare uno script wrap.sh per aggiungere il seguente script wrap.sh per arm64-v8a.

#!/system/bin/sh
LD_HWASAN=1 exec "$@"

Esegui

Esegui l'app come di consueto su un'immagine Android creata da HWASan. Quando viene rilevato un errore di memoria, un'app si arresta in modo anomalo con SIGABRT e stampa un messaggio dettagliato per logcat. La copia del messaggio è disponibile in un file in /data/tombstones e ha il seguente aspetto:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

Il messaggio può essere seguito da ulteriori informazioni di debug, tra cui l'elenco dei thread attivi nell'applicazione, i tag delle allocazioni di memoria vicine e i valori di registrazione della CPU.

Per ulteriori informazioni sui messaggi di errore HWASan, consulta Informazioni sui report HWASan.