HWAAddressSanitizer

AddressSanitizer berbantuan perangkat keras (HWASan) adalah alat pendeteksi 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 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 mem-flash gambar HWASan bawaan ke perangkat Pixel yang didukung dari ci.android.com ( petunjuk penyiapan terperinci ).

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 penggunaan 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 pendekatan penandaan memori , di mana nilai tag acak kecil dikaitkan baik dengan pointer maupun dengan rentang alamat memori. Agar akses memori valid, penunjuk dan tag memori harus cocok. HWASan mengandalkan fitur ARMv8 top byte mengabaikan (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 kapasitas terbatas ASan untuk mendeteksi penggunaan setelah gratis. Untuk alasan ini, HWASan dapat mendeteksi bug tidak peduli seberapa besar overflow atau berapa lama memori telah dibatalkan alokasinya. Ini memberi HWASan keuntungan besar dibandingkan ASan.

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

Persyaratan

HWASan membutuhkan kernel Linux untuk menerima pointer yang ditandai dalam argumen panggilan sistem. Dukungan untuk ini diterapkan di patchset 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 ruang pengguna untuk HWASan tersedia mulai dari Android 11 .

Jika Anda membuat dengan rantai alat khusus, pastikan bahwa itu mencakup 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. Pembuatan inkremental hanya berfungsi, tidak ada instruksi flashing khusus atau persyaratan penghapusan, executable statis didukung, dan tidak apa-apa untuk melewati sanitasi perpustakaan apa pun selain libc . Juga tidak ada persyaratan bahwa jika perpustakaan disanitasi, executable apa pun yang tertaut ke perpustakaan itu juga harus disanitasi.

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

Modul individu dapat disanitasi dengan HWASan, dengan peringatan bahwa libc juga tersertifikasi HWASan. Ini dapat dilakukan dengan menambahkan sanitize: { hwaddress: true } ke definisi modul Android.bp masing-masing. Seluruh platform Android dibangun 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 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 bersantai melalui kode terkelola, setel HWASAN_OPTIONS=fast_unwind_on_malloc=0 di 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, menjalankan aplikasi HWASan pada perangkat non-HWASan tidak didukung.

Pada perangkat HWASan, aplikasi dapat diperiksa dengan HWASan dengan membuat kodenya dengan SANITIZE_TARGET:=hwaddress di Make, atau -fsanitize=hwaddress di flag compiler. Lihat dokumentasi pengembang aplikasi untuk detail selengkapnya.