Lihat Memahami HWASan laporan untuk mengetahui informasi tentang cara membaca error HWASan.
Hardware-assisted AddressSanitizer (HWASan) adalah alat deteksi error memori yang mirip dengan AddressSanitizer. HWASan menggunakan RAM yang jauh lebih sedikit dibandingkan ASan, sehingga cocok untuk sanitasi seluruh sistem. HWASan hanya tersedia di Android 10 dan yang lebih tinggi, serta hanya pada hardware AArch64.
Meskipun terutama berguna untuk kode C/C++, HWASan juga dapat membantu men-debug kode Java yang menyebabkan error di C/C++ yang digunakan untuk menerapkan antarmuka Java. HWASan berguna karena menangkap error memori saat terjadi, sehingga Anda dapat langsung melihat kode yang bertanggung jawab.
Dibandingkan dengan versi klasik ASan, HWASan memiliki:
- Overhead CPU yang serupa (~2x)
- Overhead ukuran kode yang serupa (40 – 50%)
- Overhead RAM yang jauh lebih kecil (10% – 35%)
HWASan dapat mendeteksi rangkaian bug yang sama seperti ASan:
- Stack dan luapan/underflow buffer heap
- Penggunaan heap setelah tersedia
- Penggunaan stack di luar cakupan
- Double free/wild free
Selain itu, HWASan mendeteksi penggunaan stack setelah ditampilkan.
HWASan (sama seperti ASan) kompatibel dengan UBSan, dan keduanya dapat diaktifkan pada target secara bersamaan.
Detail dan batasan implementasi
HWASan didasarkan pada pendekatan pemberian tag memori, dengan nilai tag acak kecil yang dikaitkan dengan pointer dan rentang alamat memori. Agar akses memori valid, pointer dan tag memori harus cocok. HWASan mengandalkan fitur ARMv8 top byte ignore (TBI), yang juga disebut virtual address tagging, untuk menyimpan tag pointer di bit tertinggi alamat.
Anda dapat membaca lebih lanjut tentang desain HWASan di situs dokumentasi Clang.
Menurut desainnya, HWASan tidak memiliki redzone ukuran terbatas ASan untuk mendeteksi luapan atau karantina kapasitas terbatas ASan untuk mendeteksi penggunaan setelah tersedia. Oleh karena itu, HWASan dapat mendeteksi bug berapa pun ukuran luapannya atau berapa lama memori di-dealokasikan. Hal ini memberi HWASan keunggulan besar dibandingkan ASan.
Namun, HWASan memiliki jumlah nilai tag yang mungkin terbatas (256), yang berarti ada kemungkinan 0,4% untuk tidak menemukan bug selama satu eksekusi program.
Persyaratan
Versi terbaru (4.14+) kernel Android umum mendukung HWASan secara langsung. Cabang khusus Android 10 tidak memiliki dukungan untuk HWASan.
Dukungan ruang pengguna untuk HWASan tersedia mulai Android 11.
Jika Anda menggunakan kernel yang berbeda, HWASan memerlukan kernel Linux untuk menerima pointer yang diberi tag dalam argumen panggilan sistem. Dukungan untuk hal ini diimplementasikan dalam patchset upstream berikut:
- arm64 tagged address ABI
- arm64: untag user pointers passed to the kernel
- mm: Avoid creating virtual address aliases in brk()/mmap()/mremap()
- arm64: Validate tagged addresses in access_ok() called from kernel threads
Jika Anda membuat dengan toolchain kustom, pastikan toolchain tersebut menyertakan semua hal hingga commit LLVM c336557f.
Menggunakan HWASan
Gunakan perintah berikut untuk membuat seluruh platform menggunakan HWASan:
lunch aosp_walleye-userdebug # (or any other product)export SANITIZE_TARGET=hwaddressm -j
Untuk memudahkan, Anda dapat menambahkan setelan SANITIZE_TARGET ke definisi produk, mirip dengan aosp_coral_hwasan.
Bagi pengguna yang sudah familiar dengan AddressSanitizer, banyak kompleksitas build yang hilang:
- Tidak perlu menjalankan make dua kali.
- Build inkremental berfungsi secara langsung.
- Tidak perlu mem-flash userdata.
Beberapa batasan AddressSanitizer juga hilang:
- Executable statis didukung.
- Anda dapat melewati sanitasi target selain libc. Tidak seperti ASan, tidak ada persyaratan bahwa jika library disanitasi, executable apa pun yang menautkannya juga harus disanitasi.
Anda dapat beralih antara HWASan dan image reguler dengan nomor build yang sama (atau lebih tinggi) dapat dilakukan secara bebas. Anda tidak perlu menghapus data perangkat.
Untuk melewati sanitasi modul, gunakan
LOCAL_NOSANITIZE := hwaddress (Android.mk) atau
sanitize: { hwaddress: false } (Android.bp).
Menyucikan target individual
HWASan dapat diaktifkan per target dalam build reguler (tidak disucikan), selama libc.so juga
disucikan. Tambahkan hwaddress: true ke blok sanitize di "libc_defaults"
di bionic/libc/Android.bp. Kemudian, lakukan hal yang sama di target yang sedang Anda kerjakan.
Perhatikan bahwa sanitasi libc memungkinkan pemberian tag pada alokasi memori heap di seluruh sistem, serta
pemeriksaan tag untuk operasi memori di dalam libc.so. Hal ini dapat menangkap bug bahkan dalam biner
yang HWASan-nya tidak diaktifkan jika akses memori yang buruk ada di libc.so
(mis. pthread_mutex_unlock() pada mutex yang delete()ed).
Anda tidak perlu mengubah file build apa pun jika seluruh platform dibuat menggunakan HWASan.
Stack trace yang lebih baik
HWASan menggunakan unwinder berbasis frame pointer yang cepat untuk merekam stack
trace untuk setiap peristiwa alokasi dan dealokasi memori dalam
program. Android mengaktifkan frame pointer dalam kode AArch64 secara default,
sehingga hal ini berfungsi dengan baik dalam praktiknya. Jika Anda perlu mengurai melalui
kode terkelola, tetapkan HWASAN_OPTIONS=fast_unwind_on_malloc=0
di lingkungan proses. Perhatikan bahwa stack trace akses memori yang buruk menggunakan unwinder "lambat" secara default; setelan ini hanya memengaruhi alokasi dan dealokasi trace. Opsi ini dapat sangat
intensif CPU, bergantung pada beban.
Simbolisasi
Lihat Simbolisasi di "Memahami laporan HWASan".
HWASan dalam aplikasi
Mirip dengan AddressSanitizer, HWASan tidak dapat melihat kode Java, tetapi dapat mendeteksi bug di library JNI. Hingga Android 14, menjalankan aplikasi HWASan di perangkat non-HWASan tidak didukung.
Di perangkat HWASan, aplikasi dapat diperiksa dengan HWASan dengan membuat kode mereka
menggunakan SANITIZE_TARGET:=hwaddress di
Make, atau -fsanitize=hwaddress di flag pengompilasi.
Di perangkat non-HWASan (yang menjalankan Android 14 atau yang lebih baru), file wrap.sh yang menetapkan
LD_HWASAN=1 harus ditambahkan.
Lihat
dokumentasi developer aplikasi
untuk mengetahui detail selengkapnya.