Bounds Sanitizer

BoundsSanitizer (BoundSan) menambahkan instrumentasi ke binari untuk menyisipkan pemeriksaan batas di sekitar akses array. Pemeriksaan ini ditambahkan jika kompiler tidak dapat membuktikan pada waktu kompilasi bahwa akses akan aman dan jika ukuran array akan diketahui saat runtime, sehingga dapat diperiksa. Android 10 menyebarkan BoundSan di Bluetooth dan codec. BoundSan disediakan oleh kompiler dan diaktifkan secara default di berbagai komponen di seluruh platform.

Penerapan

BoundSan menggunakan pembersih batas UBSan . Mitigasi ini diaktifkan pada tingkat per-modul. Ini membantu menjaga komponen penting Android tetap aman dan tidak boleh dinonaktifkan.

Kami sangat menganjurkan Anda untuk mengaktifkan BoundSan untuk komponen tambahan. Kandidat yang ideal adalah kode asli yang diistimewakan atau kode asli kompleks yang mem-parsing input pengguna yang tidak tepercaya. Overhead kinerja yang terkait dengan pengaktifan BoundSan bergantung pada jumlah akses larik yang tidak dapat dibuktikan aman. Harapkan persentase overhead kecil rata-rata dan uji apakah kinerja menjadi perhatian.

Mengaktifkan BoundSan dalam file cetak biru

BoundSan dapat diaktifkan dalam file cetak biru dengan menambahkan "bounds" ke properti misc_undefined sanitize untuk modul biner dan pustaka:

sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",

diag

Properti diag mengaktifkan mode diagnostik untuk pembersih. Gunakan mode diagnostik hanya selama pengujian. Mode diagnostik tidak dibatalkan pada overflow, yang meniadakan keuntungan keamanan dari mitigasi dan membawa overhead kinerja yang lebih tinggi, sehingga tidak direkomendasikan untuk build produksi.

daftar hitam

Properti blacklist memungkinkan spesifikasi file daftar hitam yang dapat digunakan pengembang untuk mencegah fungsi dan file sumber disanitasi. Gunakan properti ini hanya jika kinerja menjadi perhatian dan file/fungsi yang ditargetkan berkontribusi besar. Audit file/fungsi ini secara manual untuk memastikan bahwa akses array aman. Lihat Pemecahan Masalah untuk detail tambahan.

Mengaktifkan BoundSan di makefiles

BoundSan dapat diaktifkan di makefile dengan menambahkan "bounds" ke variabel LOCAL_SANITIZE untuk modul biner dan pustaka:

LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt

LOCAL_SANITIZE menerima daftar pembersih yang dipisahkan dengan koma.

LOCAL_SANITIZE_DIAG mengaktifkan mode diagnostik. Gunakan mode diagnostik hanya selama pengujian. Mode diagnostik tidak dibatalkan pada overflow, yang meniadakan keuntungan keamanan dari mitigasi dan membawa overhead kinerja yang lebih tinggi, sehingga tidak direkomendasikan untuk build produksi.

LOCAL_SANITIZE_BLACKLIST memungkinkan spesifikasi file daftar hitam yang memungkinkan pengembang untuk mencegah fungsi dan file sumber disanitasi. Gunakan properti ini hanya jika kinerja menjadi perhatian dan file/fungsi yang ditargetkan berkontribusi besar. Audit file/fungsi ini secara manual untuk memastikan bahwa akses array aman. Lihat Pemecahan Masalah untuk detail tambahan.

Menonaktifkan BoundSan

Anda dapat menonaktifkan BoundSan dalam fungsi dan file sumber dengan daftar hitam atau atribut fungsi. Yang terbaik adalah tetap mengaktifkan BoundSan, jadi nonaktifkan hanya jika fungsi atau file membuat overhead kinerja dalam jumlah besar dan sumbernya telah ditinjau secara manual.

Untuk Informasi selengkapnya tentang menonaktifkan BoundSan dengan atribut fungsi dan pemformatan file daftar hitam , lihat dokumentasi Dentang LLVM. Cakupan daftar hitam ke pembersih tertentu dengan menggunakan nama bagian yang menentukan pembersih target untuk menghindari memengaruhi pembersih lain.

Validasi

Tidak ada tes CTS khusus untuk BoundSan. Sebagai gantinya, pastikan tes CTS lulus dengan atau tanpa BoundSan diaktifkan untuk memverifikasi bahwa itu tidak memengaruhi perangkat.

Penyelesaian masalah

Uji komponen secara menyeluruh setelah mengaktifkan BoundSan untuk memastikan bahwa akses keluar batas yang sebelumnya tidak terdeteksi ditangani.

Kesalahan BoundSan dapat dengan mudah diidentifikasi karena menyertakan pesan pembatalan batu nisan berikut:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'

Saat dijalankan dalam mode diagnostik, file sumber, nomor baris, dan nilai indeks dicetak ke logcat . Secara default, mode ini tidak menampilkan pesan pembatalan. Tinjau logcat untuk memeriksa kesalahan apa pun.

external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'