Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

HWAddressSanitizer

AddressSanitizer yang dibantu perangkat keras (HWASan) adalah alat deteksi kesalahan memori yang mirip dengan AddressSanitizer . HWASan menggunakan RAM jauh lebih sedikit dibandingkan dengan ASan, yang membuatnya cocok untuk sanitasi sistem secara keseluruhan. HWASan hanya tersedia di Android 10 dan lebih tinggi, dan di perangkat keras AArch64. Anda dapat mem-flash gambar HWASan prebuilt 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 kumpulan bug yang sama dengan ASan:

  • Stack dan heap buffer overflow / underflow
  • Penggunaan heap setelah gratis
  • Stack digunakan di luar ruang lingkup
  • Bebas ganda / bebas liar

Selain itu, HWASan mendeteksi penggunaan tumpukan setelah pengembalian.

Detail dan batasan implementasi

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

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

Secara desain, HWASan tidak memiliki zona merah ukuran terbatas ASan untuk mendeteksi luapan atau karantina berkapasitas terbatas ASan untuk mendeteksi penggunaan setelah gratis. Untuk alasan ini, HWASan dapat mendeteksi bug tidak peduli seberapa besar overflow atau berapa lama memori tersebut dibatalkan alokasinya. Ini memberi HWASan keuntungan besar atas ASan.

Namun, HWASan memiliki sejumlah kemungkinan nilai tag (256), yang berarti ada kemungkinan 0,4% kehilangan bug selama satu eksekusi program.

Persyaratan

HWASan membutuhkan kernel Linux untuk menerima penunjuk yang diberi tag dalam argumen panggilan sistem. Dukungan untuk ini diimplementasikan di patchsets upstream berikut:

Patch ini tersedia sebagai backport di kernel Android umum di android-4.14 dan cabang yang lebih tinggi, tetapi tidak di cabang khusus Android 10 seperti android-4.14-q .

Dukungan userspace untuk HWASan tersedia mulai dengan Android 11 .

Jika Anda membangun dengan toolchain kustom, pastikan toolchain tersebut menyertakan semuanya hingga LLVM commit c336557f .

Menggunakan HWASan

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 .

Tidak seperti ASan, dengan HWASan tidak perlu membangun dua kali. Build inkremental hanya berfungsi, tidak ada instruksi flashing khusus atau persyaratan penghapusan, executable statis didukung, dan tidak apa-apa untuk melewati pembersihan pustaka apa pun selain libc . Juga tidak ada persyaratan bahwa jika perpustakaan dibersihkan, semua file yang dapat dieksekusi yang menautkannya juga harus dibersihkan.

Untuk melewati sanitasi modul, gunakan LOCAL_NOSANITIZE := hwaddress atau sanitize: { hwaddress: false } .

Modul individu dapat disterilkan dengan HWASan, dengan peringatan bahwa libc juga di-HWASan. Ini bisa dilakukan dengan menambahkan sanitize: { hwaddress: true } ke definisi modul Android.bp masing-masing. Seluruh platform Android dibuat dengan HWASan saat menggunakan _hwasan -suffixed build (termasuk libc ), dan dengan demikian membersihkan libc secara manual tidak diperlukan untuk build HWASan.

Jejak tumpukan yang lebih baik

HWASan menggunakan unwinder berbasis frame-pointer yang cepat untuk merekam pelacakan tumpukan untuk setiap alokasi memori dan peristiwa deallocation 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 yang dikelola, setel HWASAN_OPTIONS=fast_unwind_on_malloc=0 di lingkungan proses. Perhatikan bahwa jejak tumpukan akses memori yang buruk menggunakan "lambat" unwinder secara default; pengaturan ini hanya mempengaruhi alokasi dan deallocation traces. Opsi ini bisa sangat intensif CPU, tergantung pada bebannya.

Simbolisasi

Lihat Simbolisasi dalam dokumentasi ASan.

HWASan dalam aplikasi

Mirip dengan AddressSanitizer, HWASan tidak dapat melihat kode Java, tetapi dapat mendeteksi bug di perpustakaan JNI. Tidak seperti ASan, menjalankan aplikasi HWASan di perangkat non-HWASan tidak didukung.

Di perangkat HWASan, aplikasi bisa diperiksa dengan HWASan dengan membuat kodenya dengan SANITIZE_TARGET:=hwaddress di Make, atau -fsanitize=hwaddress di flag compiler. Lihat dokumentasi pengembang aplikasi untuk lebih jelasnya.