HWAddressSanitizer

Lihat Memahami laporan HWASan untuk informasi tentang cara membaca HWASan mogok!

AddressSanitizer berbantuan perangkat keras (HWASan) adalah alat pendeteksi kesalahan memori yang mirip dengan AddressSanitizer . HWASan menggunakan lebih sedikit RAM dibandingkan ASan, sehingga cocok untuk sanitasi sistem secara keseluruhan. HWASan hanya tersedia di Android 10 dan lebih tinggi, dan hanya pada perangkat keras AArch64.

Meskipun terutama berguna untuk kode C/C++, HWASan juga dapat membantu men-debug kode Java yang menyebabkan crash pada C/C++ yang digunakan untuk mengimplementasikan antarmuka Java. Ini berguna karena menangkap kesalahan memori ketika terjadi, mengarahkan Anda langsung ke kode yang bertanggung jawab.

Anda dapat mem-flash gambar HWASan bawaan ke perangkat Pixel yang didukung dari ci.android.com ( petunjuk penyiapan mendetail ).

Dibandingkan dengan ASan klasik, HWASan memiliki:

  • Overhead CPU serupa (~2x)
  • Overhead ukuran kode serupa (40 – 50%)
  • Overhead RAM jauh lebih kecil (10% – 35%)

HWASan mendeteksi serangkaian bug yang sama dengan ASan:

  • Tumpukan dan tumpukan buffer overflow/underflow
  • Tumpukan penggunaan setelah gratis
  • Tumpukan digunakan di luar lingkup
  • Bebas ganda/bebas liar

Selain itu, HWASan mendeteksi penggunaan tumpukan setelah pengembalian.

HWASan (sama seperti ASan) kompatibel dengan UBSan , keduanya dapat diaktifkan pada target secara bersamaan.

Detail dan batasan implementasi

HWASan didasarkan pada pendekatan penandaan memori , di mana nilai tag acak kecil dikaitkan dengan penunjuk dan rentang alamat memori. Agar akses memori valid, penunjuk dan tag memori harus cocok. HWASan mengandalkan fitur top byte mengabaikan (TBI) ARMv8, juga disebut penandaan alamat virtual , untuk menyimpan tag penunjuk di bit tertinggi alamat.

Anda dapat membaca lebih lanjut tentang desain HWASan di situs dokumentasi Clang.

Secara desain, HWASan tidak memiliki zona merah ASan yang berukuran terbatas untuk mendeteksi luapan atau karantina berkapasitas terbatas ASan untuk mendeteksi penggunaan setelah waktu senggang. Karena alasan ini, HWASan dapat mendeteksi bug tidak peduli seberapa besar overflow atau berapa lama memori telah dibatalkan alokasinya. Hal ini memberikan HWASan keuntungan besar dibandingkan ASan.

Namun, HWASan memiliki jumlah kemungkinan nilai tag yang terbatas (256), yang berarti ada kemungkinan 0,4% hilangnya bug apa pun selama satu eksekusi program.

Persyaratan

Versi terbaru (4.14+) dari 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 bekerja dengan kernel yang berbeda, HWASan memerlukan kernel Linux untuk menerima pointer yang diberi tag dalam argumen panggilan sistem. Dukungan untuk hal ini diterapkan pada patchset upstream berikut:

Jika Anda membuat dengan rantai alat khusus, pastikan rantai tersebut menyertakan semuanya hingga LLVM commit c336557f .

Menggunakan HWA San

Gunakan perintah berikut untuk membangun seluruh platform menggunakan HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Untuk kenyamanan, Anda dapat menambahkan pengaturan SANITIZE_TARGET ke definisi produk, mirip dengan aosp_coral_hwasan .

Bagi pengguna yang familiar dengan AddressSanitizer, banyak kerumitan build yang hilang:

  • Tidak perlu menjalankan make dua kali.
  • Pembangunan tambahan dapat dilakukan secara langsung.
  • Tidak perlu mem-flash data pengguna.

Beberapa batasan AddressSanitizer juga hilang:

  • Eksekusi statis didukung.
  • Tidak apa-apa untuk melewatkan sanitasi target apa pun selain libc. Berbeda dengan ASan, tidak ada persyaratan bahwa jika perpustakaan disanitasi, maka semua executable yang menghubungkannya juga harus demikian.

Peralihan antara gambar HWASan dan gambar biasa pada nomor build yang sama (atau lebih tinggi) dapat dilakukan secara bebas. Menghapus perangkat tidak diperlukan.

Untuk melewati sanitasi modul, gunakan LOCAL_NOSANITIZE := hwaddress (Android.mk) atau sanitize: { hwaddress: false } (Android.bp).

Sanitasi target individu

HWASan dapat diaktifkan per target dalam build reguler (tidak disanitasi), selama libc.so juga disanitasi. Tambahkan hwaddress: true ke blok sanitasi di "libc_defaults" di bionic/libc/Android.bp. Kemudian lakukan hal yang sama pada target yang sedang Anda kerjakan.

Perhatikan bahwa sanitasi libc memungkinkan penandaan alokasi memori heap di seluruh sistem, serta pemeriksaan tag untuk operasi memori di dalam libc.so . Ini mungkin menangkap bug bahkan dalam biner di mana HWASan tidak diaktifkan jika akses memori yang buruk ada di libc.so (mis. pthread_mutex_unlock() pada delete() dan mutex).

Tidak perlu mengubah file build apa pun jika seluruh platform dibangun menggunakan HWASan.

stasiun flash

Untuk tujuan pengembangan, Anda dapat mem-flash build AOSP berkemampuan HWASan ke perangkat Pixel dengan bootloader tidak terkunci menggunakan Flashstation . Pilih target _hwasan, misal aosp_flame_hwasan-userdebug. Lihat dokumentasi NDK untuk HWASan bagi pengembang aplikasi untuk detail selengkapnya.

Pelacakan tumpukan yang lebih baik

HWASan menggunakan unwinder berbasis frame-pointer yang cepat untuk mencatat jejak tumpukan untuk setiap peristiwa alokasi memori dan dealokasi dalam program. Android mengaktifkan penunjuk bingkai dalam kode AArch64 secara default, jadi ini berfungsi dengan baik dalam praktiknya. Jika Anda perlu melepas lelah melalui kode terkelola, setel HWASAN_OPTIONS=fast_unwind_on_malloc=0 di lingkungan proses. Perhatikan bahwa jejak tumpukan akses memori yang buruk menggunakan pengurai "lambat" secara default; pengaturan ini hanya memengaruhi jejak alokasi dan dealokasi. Opsi ini bisa sangat memakan CPU, tergantung pada bebannya.

Simbolisasi

Lihat Simbolisasi di "Memahami laporan HWASan".

HWASan di aplikasi

Mirip dengan AddressSanitizer, HWASan tidak dapat melihat kode Java, tetapi dapat mendeteksi bug di perpustakaan JNI. Hingga Android 14, menjalankan aplikasi HWASan di perangkat non-HWASan tidak didukung.

Pada perangkat HWASan, aplikasi dapat diperiksa dengan HWASan dengan membuat kodenya menggunakan SANITIZE_TARGET:=hwaddress di Make, atau -fsanitize=hwaddress di flag compiler. Pada perangkat non-HWASAN (menjalankan Android 14 atau lebih baru), pengaturan file wrap.sh LD_HWASAN=1 harus ditambahkan. Lihat dokumentasi pengembang aplikasi untuk detail selengkapnya.