Quando lo strumento HWASan rileva un bug di memoria, il processo viene terminato con abort()
.
viene stampato un report in stderr e logcat. Come per tutti gli arresti anomali nativi su Android, gli errori HWASan possono essere
trovato in /data/tombstones
.
Rispetto ai normali arresti anomali nativi, HWASan trasporta informazioni aggiuntive nel campo "Interrompi messaggio" vicino alla parte superiore della lapide. Guarda un esempio di arresto anomalo basato su heap riportato di seguito (per gli stack bug, consulta la nota seguente per le sezioni specifiche dello stack).
Report di esempio
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/flame_hwasan/flame:Tiramisu/MASTER/7956676:userdebug/dev-keys' Revision: 'DVT1.0' ABI: 'arm64' Timestamp: 2019-04-24 01:13:22+0000 pid: 11154, tid: 11154, name: sensors@1.0-ser >>> /vendor/bin/hw/android.hardware.sensors@1.0-service <<< signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- Abort message: '==9569==ERROR: HWAddressSanitizer: tag-mismatch on address 0x00433ae20045 at pc 0x00623ae2a9cc READ of size 1 at 0x00433ae20045 tags: 5b/83 (ptr/mem) in thread T0 #0 0x7240450c68 (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) #1 0x723dffd490 (/vendor/lib64/sensors.ssc.so+0x34490) #2 0x723e0126e0 (/vendor/lib64/sensors.ssc.so+0x496e0) [...] [0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5 Cause: use-after-free 0x00433ae20045 is located 5 bytes inside of 10-byte region [0x00433ae20040,0x00433ae2004a) freed by thread T0 here: #0 0x72404d1b18 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0x10b18) #1 0x723af23040 (/vendor/lib64/libgralloccore.so+0x5040) #2 0x723af23fa4 (/vendor/lib64/libgralloccore.so+0x5fa4) [...] previously allocated here: #0 0x72404ce554 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0xd554) #1 0x7240115654 (/apex/com.android.runtime/lib64/bionic/libc.so+0x43654) #2 0x7240450ac8 (/system/lib64/vndk-sp-R/libcutils.so+0x8ac8) [...] hwasan_dev_note_heap_rb_distance: 1 1023 hwasan_dev_note_num_matching_addrs: 0 hwasan_dev_note_num_matching_addrs_4b: 0 Thread: T0 0x006a00002000 stack: [0x007fc1064000,0x007fc1864000) sz: 8388608 tls: [0x00737702ffc0,0x007377033000) Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x006f33ae2000: 08 00 08 00 [83] 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: 72 .. d0 .. [..] .. .. .. .. .. .. .. .. .. .. .. 0x006f33ae2010: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. See https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#short-granules for a description of short granule tags Registers where the failure occurred (pc 0x00623ae2a9cc): x0 0000007fc18623ec x1 5b0000433ae20045 x2 0000000000000013 x3 ffffffffffffffff x4 ffffffffffffffff x5 0000007fc1861da3 x6 6f7420676e696f47 x7 45522061206f6420 x8 0000000000000000 x9 0200006b00000000 x10 00000007fc18623f x11 5b0000433ae20040 x12 6f64206f7420676e x13 0a44414552206120 x14 0000000000000010 x15 ffffffffffffffff x16 000000737169ac94 x17 0000000000000007 x18 0000007377bd8000 x19 0000007fc1862498 x20 0200006b00000000 x21 0000007fc18624a8 x22 0000000000000001 x23 0000000000000000 x24 0000000000000000 x25 0000000000000000 x26 0000000000000000 x27 0000000000000000 x28 0000000000000000 x29 0000007fc1862410 x30 000000623ae2a9d0 sp 0000007fc18623d0 SUMMARY: HWAddressSanitizer: tag-mismatch (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) [ … regular crash dump follows …]
Questo risultato è molto simile a quello di un report AddressSanitizer. A differenza di questi, quasi tutti i bug HWASan sono "tag-mismatch", ovvero un accesso alla memoria in cui un tag puntatore non corrisponde al tag di memoria corrispondente. Potrebbe essere uno di
- accesso fuori dai limiti su stack o heap
- usare dopo senza costi su heap
- da utilizzare dopo il ritorno sullo stack
Sezioni
Di seguito è riportata la spiegazione di ciascuna delle sezioni del report HWASan:
Errore di accesso
Contiene informazioni sull'accesso errato alla memoria, tra cui:
- Tipo di accesso ("READ" e "WRITE")
- Dimensioni di accesso (quanti byte è stato tentato di accedere)
- Numero di thread dell'accesso
- Tag puntatore e di memoria (per il debug avanzato)
Accedi all'analisi dello stack
Analisi dello stack dell'accesso alla memoria non valido. Consulta la sezione sulla simbolizzazione per simbolizzare.
Causa
La potenziale causa dell'accesso non valido. Se ci sono più candidati, sono elencate in ordine decrescente di probabilità. Precede le informazioni dettagliate sul causa potenziale. HWASan può diagnosticare le seguenti cause:
- uso-dopo-senza costi
- stack tag-mismatch: può essere stack use-after-return / use after-scope oppure fuori intervallo
- overflow del buffer
- overflow-globale
Informazioni sulla memoria
Descrive cosa sa HWASan della memoria a cui si accede e può differire in base alla tipo di bug.
Tipo di insetto | Causa | Formato del report |
---|---|---|
mancata corrispondenza dei tag | uso-dopo-senza costi |
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
overflow del buffer | Tieni presente che può trattarsi anche di un flusso insufficiente.
<address> is located N bytes to the right of M-byte region [<start>, <end>) allocated here: |
|
mancata corrispondenza del tag stack | I report sullo stack non fanno distinzione tra overflow/underflow e e i bug use-after-return. Nella Inoltre, per trovare l'allocazione dello stack che ha dato origine all'errore, offline il passaggio di simbolizzazione è obbligatorio. Consulta la sezione Informazioni sui report sullo stack. di seguito. | |
non valido-libero | uso-dopo-senza costi | Questo è un doppio bug senza costi. Se ciò si verifica alla chiusura del processo, potrebbe significare
Violazione ODR.
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
impossibile descrivere l'indirizzo | O Wild Free (privo di memoria che non era mai stata allocata in precedenza) o doppio senza costi dopo che la memoria allocata è stata rimossa dal buffer libero di HWASan. | |
0x... è la memoria d'ombra di HWAsan. | Si tratta sicuramente di un'offerta totalmente senza costi, perché l'app stava tentando che è a HWASan. |
Analisi dello stack di deallocation
Analisi dello stack della posizione in cui è stata collocata la memoria. Presenti solo dopo l'uso o bug non validi. Consulta la sezione Simbolizzazione per simbolizzare.
Analisi dello stack di allocazione
Analisi dello stack di dove è stata allocata la memoria. Consulta la sezione Simbolizzazione per simbolizzare.
Debug avanzato Informazioni
Il report HWASan presenta anche alcune informazioni di debug avanzate, tra cui: (in ordine):
- L'elenco di thread nel processo
- L'elenco di thread nel processo
- Il valore dei tag di memoria vicini alla memoria con errori
- Il dump dei registri nel punto di accesso alla memoria
Dump dei tag di memoria
Il dump della memoria dei tag può essere utilizzato per cercare allocazioni di memoria nelle vicinanze con lo stesso tag come il puntatore del tag. Potrebbero puntare a un accesso fuori dai limiti con un offset elevato. Un tag corrisponde a 16 byte di memoria; il tag puntatore è i primi 8 bit dell'indirizzo. Il dump della memoria dei tag può dai suggerimenti, della ad esempio un overflow del buffer a destra:
tags: ad/5c (ptr/mem) [...] Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: 0e 0e 0e 57 20 20 20 20 20 2e 5e 5e 5e 5e 5e b5 =>0x006f33ae2000: f6 f6 f6 f6 f6 4c ad ad ad ad ad ad [5c] 5c 5c 5c 0x006f33ae2010: 5c 04 2e 2e 2e 2e 2e 2f 66 66 66 66 66 80 6a 6a Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: ab 52 eb .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: .. .. .. .. .. .. .. .. .. .. .. .. [..] .. .. .. 0x006f33ae2010: .. 5c .. .. .. .. .. .. .. .. .. .. .. .. .. ..(nota l'esecuzione di 6 × 16 = 96 byte di tag "ad" sulla sinistra che corrispondono al tag puntatore).
Se la dimensione di un'allocazione non è un multiplo di 16, il resto della dimensione sarà archiviato come il di memoria e il tag verrà archiviato come short dei granuli. Nell'esempio precedente, subito dopo l'allocazione in grassetto dell'annuncio, noi hai un 5 × 16 + 4 = allocazione di 84 byte del tag 5c.
Un tag di memoria zero (ad es. tags: ad/00 (ptr/mem)
) di solito indica una
bug stack-use-after-return.
Registra dump
Il dump del registro nei report HWASan corrisponde all'istruzione effettiva che ha eseguito non valido memoria l'accesso. È seguito da un altro dump del registro dal normale gestore di segnali Android - ignora il la seconda, viene presa quando HWASan chiama abort() e non è pertinente il bug.
Simbolizzazione
Per ottenere nomi di funzioni e numeri di riga nelle analisi dello stack (e ottenere nomi di variabili per use-after-scope ), è necessario un passaggio di simbolizzazione offline.
Configurazione iniziale: installa llvm-symbolizer
Per simbolizzare, nel sistema deve essere installato llvm-symbolizer e accessibile da $PATH. In Debian puoi
installarlo utilizzando sudo apt install llvm
.
Ottenere i file di simboli
Per la simbolizzazione, sono necessari file binari non sottoposti a striping contenenti simboli. La posizione in cui è possibile trovarli dipende sul tipo di build:
Per le build locali, i file di simboli sono disponibili in
out/target/product/<product>/symbols/
.
Per le build AOSP (ad esempio eseguite in flash da Flashstation), la classe
sono disponibili in CI per Android. Nella sezione "Artefatti" per
creare,
ci sarà un file ${PRODUCT}-symbols-${BUILDID}.zip
.
Per le build interne della tua organizzazione, consulta la documentazione dell'organizzazione per ricevere assistenza recuperare i file di simboli.
Simboleggia
hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash
Informazioni sui report sullo stack
Per i bug che si verificano con le variabili stack, il report HWASan conterrà dettagli come questo:
Cause: stack tag-mismatch Address 0x007d4d251e80 is located in stack of thread T64 Thread: T64 0x0074000b2000 stack: [0x007d4d14c000,0x007d4d255cb0) sz: 1088688 tls: [0x007d4d255fc0,0x007d4d259000) Previously allocated frames: record_addr:0x7df7300c98 record:0x51ef007df3f70fb0 (/apex/com.android.art/lib64/libart.so+0x570fb0) record_addr:0x7df7300c90 record:0x5200007df3cdab74 (/apex/com.android.art/lib64/libart.so+0x2dab74) [...]
Per consentire la comprensione degli stack bug, HWASan tiene traccia degli stack frame che si sono verificati in passato. Attualmente, HWASan non trasforma questi contenuti in contenuti comprensibili per l'utente nella segnalazione di bug. richiede un ulteriore passaggio di simbolizzazione.
Violazioni ODR
Alcuni bug segnalati dopo l'uso e segnalati da HWASan possono anche indicare una violazione delle regole ODR (One Definition Rules). Una violazione ODR si verifica quando la stessa variabile viene definita più volte nello stesso programma. Ciò significa anche che la variabile viene distrutta più volte, il che potrebbe portare alla errore use-after-free.
Dopo la simbolizzazione, le violazioni ODR mostrano un uso-after-free con __cxa_finalize
,
sia sullo stack di accesso non valido sia su "libero qui" stack. Il campo "In precedenza allocato
qui" lo stack contiene __dl__ZN6soinfo17call_constructorsEv
e dovrebbe
puntare alla posizione del programma che definisce la variabile più in alto nell'elenco.
Un motivo per cui l'ODR può essere violato è l'utilizzo di librerie statiche. Se una libreria statica che definisce un C++ globale è collegata a più librerie condivise oppure eseguibili, più definizioni dello stesso simbolo potrebbero essere già presenti nello stesso indirizzo spazio di archiviazione, il che provocherà un errore ODR.
Risoluzione dei problemi
HWAddressSanitizer non può descrivere l'indirizzo in modo più dettagliato
A volte HWASan può esaurire lo spazio per le informazioni sulle allocazioni di memoria passate. In questo caso, il report conterrà solo un'analisi dello stack per l'accesso immediato alla memoria, seguita da una nota:
HWAddressSanitizer can not describe address in more detail.
In alcuni casi, il problema può essere risolto eseguendo il test più volte. Un'altra opzione è aumentare HWASan
dimensioni della cronologia. Ciò può essere fatto a livello globale
build/soong/cc/sanitize.go
(cerca
hwasanGlobalOptions
) o nel tuo ambiente di processo (prova
adb shell echo $HWASAN_OPTIONS
per visualizzare le impostazioni correnti).
Questo può accadere anche se la memoria a cui si accede non è mappata o allocata da un utente non consapevole di HWASan
allocatore. In questo caso, il tag mem
elencato nell'intestazione dell'arresto anomalo di solito sarà
00
. Se hai accesso alla lapide completa, potrebbe essere utile consultare il
il dump delle mappe di memoria per scoprire a quale mappatura (se presente) appartiene l'indirizzo.
Bug nidificato nello stesso thread
Ciò significa che si è verificato un bug durante la generazione del report sugli arresti anomali di HWASan. Questo è solitamente dovuto a un bug del runtime HWASan, segnala un bug e fornisci istruzioni su come riprodurre il problema, se possibile.