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]'