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

HWAAddressSanitizer

Hardware-dibantu AddressSanitizer (HWASan) adalah alat deteksi kesalahan memori 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 hanya di 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 membantu karena menangkap kesalahan memori ketika terjadi, mengarahkan Anda langsung ke kode yang bertanggung jawab.

Anda dapat flash prebuilt HWASan gambar ke perangkat Pixel didukung dari ci.android.com ( petunjuk rinci pengaturan ).

Dibandingkan dengan ASan klasik, HWASan memiliki:

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

HWASan mendeteksi kumpulan bug yang sama dengan ASan:

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

Selain itu, HWASan mendeteksi penggunaan tumpukan setelah kembali.

Detail dan batasan implementasi

HWASan didasarkan pada memori tagging pendekatan, di mana acak nilai tag kecil berhubungan baik dengan pointer dan dengan rentang alamat memori. Agar akses memori valid, penunjuk dan tag memori harus cocok. HWASan bergantung pada ARMv8 fitur atas byte mengabaikan (TBI), juga disebut alamat virtual tagging, untuk menyimpan tag pointer dalam bit tertinggi alamat.

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

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

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

Persyaratan

HWASan membutuhkan kernel Linux untuk menerima pointer yang ditandai dalam argumen panggilan sistem. Dukungan untuk ini diimplementasikan di patchset upstream berikut:

Patch ini tersedia sebagai backports di umum Android kernel di android-4.14 dan cabang yang lebih tinggi, tapi tidak di Android cabang 10-spesifik seperti android-4.14-q .

Dukungan userspace untuk HWASan tersedia awal dengan Android 11.

Jika Anda sedang membangun dengan toolchain kustom, pastikan bahwa itu meliputi segala sesuatu sampai LLVM melakukan 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 untuk definisi produk, mirip dengan aosp_coral_hwasan .

Tidak seperti ASan, dengan HWASan tidak perlu membangun dua kali. Incremental membangun hanya bekerja, tidak ada yang istimewa berkedip instruksi atau menyeka persyaratan, executables statis yang didukung, dan tidak apa-apa untuk melewati sanitasi dari setiap perpustakaan lainnya dari libc . Juga tidak ada persyaratan bahwa jika perpustakaan disanitasi, executable apa pun yang tertaut ke perpustakaan itu juga harus disanitasi.

Untuk melompat sanitasi dari modul, penggunaan LOCAL_NOSANITIZE := hwaddress atau sanitize: { hwaddress: false } .

Modul individu dapat dibersihkan dengan HWASan, dengan peringatan bahwa libc juga HWASan-ified. Hal ini dapat dilakukan dengan menambahkan sanitize: { hwaddress: true } untuk masing-masing Android.bp definisi modul. Seluruh platform Android dibangun dengan HWASan ketika menggunakan _hwasan -suffixed membangun (termasuk libc ), dan dengan demikian sanitasi secara manual libc tidak diperlukan untuk HWASan membangun.

Jejak tumpukan yang lebih baik

HWASan menggunakan unwinder berbasis frame-pointer yang cepat untuk merekam jejak tumpukan untuk setiap alokasi memori dan peristiwa deallokasi dalam program. Android mengaktifkan penunjuk bingkai dalam kode AArch64 secara default, jadi ini berfungsi dengan baik dalam praktiknya. Jika Anda perlu untuk bersantai melalui kode dikelola, mengatur HWASAN_OPTIONS=fast_unwind_on_malloc=0 dalam lingkungan proses. Perhatikan bahwa jejak tumpukan akses memori yang buruk menggunakan pelepasan "lambat" secara default; pengaturan ini hanya memengaruhi pelacakan alokasi dan dealokasi. Opsi ini bisa sangat intensif CPU, tergantung pada bebannya.

Simbolisasi

Lihat Simbolisasi dalam dokumentasi Asan.

HWASan di aplikasi

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

Pada perangkat HWASan, aplikasi dapat diperiksa dengan HWASan dengan membangun kode mereka dengan SANITIZE_TARGET:=hwaddress Make, atau -fsanitize=hwaddress di bendera compiler. Lihat dokumentasi pengembang aplikasi untuk lebih jelasnya.