Scudo adalah pengalokasi memori mode pengguna dinamis, atau pengalokasi heap , yang dirancang agar tahan terhadap kerentanan terkait heap (seperti buffer overflow berbasis heap , penggunaan setelah free , dan double free ) dengan tetap mempertahankan kinerja. Ini menyediakan alokasi C standar dan primitif deallokasi (seperti malloc dan gratis), serta primitif C (seperti baru dan hapus).
Scudo lebih merupakan mitigasi daripada pendeteksi kesalahan memori yang lengkap seperti AddressSanitizer (ASan) .
Sejak rilis Android 11, scudo digunakan untuk semua kode asli (kecuali pada perangkat dengan memori rendah, di mana jemalloc masih digunakan). Saat runtime, semua alokasi dan dealokasi heap asli dilayani oleh Scudo untuk semua executable dan dependensi perpustakaannya, dan proses dibatalkan jika kerusakan atau perilaku mencurigakan terdeteksi di heap.
Scudo adalah open source dan bagian dari proyek compiler-rt LLVM. Dokumentasi tersedia di https://llvm.org/docs/ScudoHardenedAllocator.html . Runtime Scudo dikirimkan sebagai bagian dari toolchain Android dan dukungan telah ditambahkan ke Soong dan Make untuk memudahkan pengaktifan pengalokasi dalam biner.
Anda dapat mengaktifkan atau menonaktifkan mitigasi tambahan dalam pengalokasi menggunakan opsi yang dijelaskan di bawah.
Kustomisasi
Beberapa parameter pengalokasi dapat ditentukan per proses melalui beberapa cara:
- Secara statis: Tentukan fungsi
__scudo_default_options
dalam program yang mengembalikan string opsi yang akan diuraikan. Fungsi ini harus memiliki prototipe berikut:extern "C" const char *__scudo_default_options()
. - Secara dinamis: Gunakan variabel lingkungan
SCUDO_OPTIONS
yang berisi string opsi yang akan diuraikan. Opsi yang ditentukan dengan cara ini mengesampingkan definisi apa pun yang dibuat melalui__scudo_default_options
.
Opsi berikut tersedia.
Pilihan | bawaan 64-bit | bawaan 32-bit | Keterangan |
---|---|---|---|
QuarantineSizeKb | 256 | 64 | Ukuran (dalam KB) karantina yang digunakan untuk menunda deallokasi bongkahan yang sebenarnya. Nilai yang lebih rendah dapat mengurangi penggunaan memori namun menurunkan efektivitas mitigasi; nilai negatif kembali ke default. Menyetel this dan ThreadLocalQuarantineSizeKb ke nol akan menonaktifkan karantina sepenuhnya. |
QuarantineChunksUpToSize | 2048 | 512 | Ukuran (dalam byte) hingga bongkahan mana yang dapat dikarantina. |
ThreadLocalQuarantineSizeKb | 64 | 16 | Ukuran (dalam KB) cache per thread yang digunakan untuk membongkar karantina global. Nilai yang lebih rendah dapat mengurangi penggunaan memori namun dapat meningkatkan perselisihan mengenai karantina global. Menyetel this dan QuarantineSizeKb ke nol akan menonaktifkan karantina sepenuhnya. |
DeallocationTypeMismatch | false | false | Mengaktifkan pelaporan kesalahan pada malloc/delete, baru/gratis, baru/hapus[] |
DeleteSizeMismatch | true | true | Mengaktifkan pelaporan kesalahan pada ketidakcocokan antara ukuran baru dan ukuran hapus. |
ZeroContents | false | false | Mengaktifkan konten nol potongan pada alokasi dan dealokasi. |
allocator_may_return_null | false | false | Menentukan bahwa pengalokasi dapat mengembalikan null ketika terjadi kesalahan yang dapat dipulihkan, alih-alih menghentikan proses. |
hard_rss_limit_mb | 0 | 0 | Ketika RSS proses mencapai batas ini, proses akan berhenti. |
soft_rss_limit_mb | 0 | 0 | Ketika RSS proses mencapai batas ini, alokasi selanjutnya akan gagal atau menghasilkan null (tergantung pada nilai allocator_may_return_null ), hingga RSS kembali turun untuk memungkinkan alokasi baru. |
allocator_release_to_os_interval_ms | T/A | 5000 | Hanya memengaruhi pengalokasi 64-bit. Jika disetel, mencoba melepaskan memori yang tidak terpakai ke OS, namun tidak lebih sering dari interval ini (dalam milidetik). Jika nilainya negatif, memori tidak dilepaskan ke OS. |
abort_on_error | true | true | Jika disetel, alat akan memanggil abort() alih-alih _exit() setelah mencetak pesan kesalahan. |
Validasi
Saat ini belum ada tes CTS khusus untuk Scudo. Sebaliknya, pastikan pengujian CTS lulus dengan atau tanpa Scudo diaktifkan untuk biner tertentu untuk memverifikasi bahwa pengujian tersebut tidak berdampak pada perangkat.
Penyelesaian masalah
Jika masalah yang tidak dapat dipulihkan terdeteksi, pengalokasi menampilkan pesan kesalahan ke deskriptor kesalahan standar dan kemudian menghentikan proses. Jejak tumpukan yang mengarah pada penghentian ditambahkan di log sistem. Outputnya biasanya dimulai dengan Scudo ERROR:
diikuti dengan ringkasan singkat masalah beserta petunjuknya.
Berikut adalah daftar pesan kesalahan saat ini dan kemungkinan penyebabnya:
-
corrupted chunk header
: Verifikasi checksum dari header potongan telah gagal. Hal ini mungkin disebabkan oleh salah satu dari dua hal: header ditimpa (sebagian atau seluruhnya), atau penunjuk yang diteruskan ke fungsi bukan berupa potongan. -
race on chunk header
: Dua thread berbeda mencoba memanipulasi header yang sama pada waktu yang sama. Hal ini biasanya merupakan gejala dari kondisi balapan atau kurangnya penguncian secara umum saat melakukan operasi pada bongkahan tersebut. -
invalid chunk state
: Potongan tidak dalam keadaan yang diharapkan untuk operasi tertentu, misalnya, tidak dialokasikan saat mencoba membebaskannya, atau tidak dikarantina saat mencoba mendaur ulangnya. Gratis ganda adalah alasan umum untuk kesalahan ini. -
misaligned pointer
: Persyaratan penyelarasan dasar sangat diberlakukan: 8 byte pada platform 32-bit dan 16 byte pada platform 64-bit. Jika pointer yang diteruskan ke fungsi kita tidak sesuai dengan fungsi tersebut, maka pointer yang diteruskan ke salah satu fungsi tidak sejajar. -
allocation type mismatch
: Jika opsi ini diaktifkan, fungsi deallokasi yang dipanggil pada suatu potongan harus cocok dengan tipe fungsi yang dipanggil untuk mengalokasikannya. Jenis ketidakcocokan ini dapat menimbulkan masalah keamanan. -
invalid sized delete
: Ketika operator penghapusan berukuran C 14 digunakan, dan pemeriksaan opsional diaktifkan, ada ketidakcocokan antara ukuran yang diteruskan saat membatalkan alokasi potongan dan ukuran yang diminta saat mengalokasikannya. Ini biasanya merupakan masalah kompiler atau kebingungan tipe pada objek yang dibatalkan alokasinya. -
RSS limit exhausted
: RSS maksimum yang ditentukan secara opsional telah terlampaui.
Jika Anda men-debug kerusakan pada OS itu sendiri, Anda dapat menggunakan build HWASan OS . Jika Anda men-debug error pada suatu aplikasi, Anda juga dapat menggunakan build aplikasi HWASan .