Scudo adalah pengalokasi memori mode pengguna dinamis, atau pengalokasi heap, yang didesain agar tangguh terhadap kerentanan terkait heap (seperti buffer overflow berbasis heap, use after free, dan double free) sekaligus mempertahankan performa. Library ini menyediakan alokasi C standar dan primitive dealokasi (seperti malloc dan free), serta primitive C++ (seperti new dan delete).
Scudo lebih merupakan mitigasi daripada detektor error memori yang lengkap seperti AddressSanitizer (ASan).
Sejak rilis Android 11, scudo digunakan untuk semua kode native (kecuali pada perangkat dengan memori rendah, yang masih menggunakan jemalloc). Saat runtime, semua alokasi dan dealokasi heap native dilayani oleh Scudo untuk semua file yang dapat dieksekusi dan dependensi library-nya, dan proses akan dibatalkan jika kerusakan atau perilaku mencurigakan terdeteksi di heap.
Scudo bersifat open source dan merupakan bagian dari project compiler-rt LLVM. Dokumentasi tersedia di https://llvm.org/docs/ScudoHardenedAllocator.html. Runtime Scudo dikirim sebagai bagian dari toolchain Android dan dukungan telah ditambahkan ke Soong dan Make untuk memungkinkan pengaktifan alokator yang mudah dalam biner.
Anda dapat mengaktifkan atau menonaktifkan mitigasi tambahan dalam alokator menggunakan opsi yang dijelaskan di bawah.
Penyesuaian
Beberapa parameter pengalokasi dapat ditentukan berdasarkan per proses melalui beberapa cara:
- Secara statis: Tentukan fungsi
__scudo_default_options
dalam program yang menampilkan 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 menggantikan definisi apa pun yang dibuat melalui__scudo_default_options
.
Opsi berikut tersedia.
Opsi | Default 64-bit | Default 32-bit | Deskripsi |
---|---|---|---|
QuarantineSizeKb |
256 |
64 |
Ukuran (dalam KB) karantina yang digunakan untuk menunda dealokasi sebenarnya dari
chunk. Nilai yang lebih rendah dapat mengurangi penggunaan memori, tetapi mengurangi efektivitas
mitigasi; nilai negatif akan kembali ke nilai default. Menyetel
keduanya, yaitu ThreadLocalQuarantineSizeKb dan ThreadLocalQuarantineSizeKb , ke nol akan menonaktifkan
karantina sepenuhnya. |
QuarantineChunksUpToSize |
2048 |
512 |
Ukuran (dalam byte) hingga potongan dapat dikarantina. |
ThreadLocalQuarantineSizeKb |
64 |
16 |
Ukuran (dalam KB) penggunaan cache per thread untuk memindahkan karantina global.
Nilai yang lebih rendah dapat mengurangi penggunaan memori, tetapi dapat meningkatkan pertentangan pada karantina global. Menyetel ini dan QuarantineSizeKb ke nol akan
menonaktifkan karantina sepenuhnya. |
DeallocationTypeMismatch |
false |
false |
Mengaktifkan pelaporan error pada malloc/delete, new/free, new/delete[] |
DeleteSizeMismatch |
true |
true |
Mengaktifkan pelaporan error pada ketidakcocokan antara ukuran item baru dan yang dihapus. |
ZeroContents |
false |
false |
Mengaktifkan konten chunk nol pada alokasi dan dealokasi. |
allocator_may_return_null |
false |
false |
Menentukan bahwa pengalokasi dapat menampilkan null saat terjadi error yang dapat dipulihkan, bukan menghentikan proses. |
hard_rss_limit_mb |
0 |
0 |
Jika RSS proses mencapai batas ini, proses akan berakhir. |
soft_rss_limit_mb |
0 |
0 |
Jika RSS proses mencapai batas ini, alokasi lebih lanjut akan gagal atau menampilkan null (bergantung pada nilai allocator_may_return_null ), hingga RSS turun kembali untuk memungkinkan alokasi baru. |
allocator_release_to_os_interval_ms |
5000 |
T/A | Hanya memengaruhi pengalokasi 64-bit. Jika disetel, mencoba melepaskan memori yang tidak digunakan ke OS, tetapi tidak lebih sering dari interval ini (dalam milidetik). Jika nilainya negatif, memori tidak dilepaskan ke OS. |
abort_on_error |
true |
true |
Jika ditetapkan, alat akan memanggil abort() , bukan _exit()
setelah mencetak pesan error. |
Validasi
Saat ini, tidak ada pengujian CTS khusus untuk Scudo. Sebagai gantinya, pastikan bahwa pengujian CTS lulus dengan atau tanpa Scudo yang diaktifkan untuk biner tertentu guna memverifikasi bahwa Scudo tidak memengaruhi perangkat.
Pemecahan masalah
Jika masalah yang tidak dapat dipulihkan terdeteksi, alokator akan menampilkan pesan error ke deskriptor error standar, lalu menghentikan proses.
Stack trace yang menyebabkan penghentian ditambahkan dalam log sistem.
Output biasanya dimulai dengan Scudo ERROR:
, diikuti dengan
ringkasan singkat masalah beserta petunjuk apa pun.
Berikut adalah daftar pesan error saat ini dan kemungkinan penyebabnya:
corrupted chunk header
: Verifikasi checksum header chunk gagal. Hal ini kemungkinan disebabkan oleh salah satu dari dua hal: header ditimpa (sebagian atau seluruhnya), atau pointer yang diteruskan ke fungsi bukan chunk.race on chunk header
: Dua thread yang berbeda mencoba memanipulasi header yang sama secara bersamaan. Hal ini biasanya merupakan gejala kondisi persaingan atau kurangnya penguncian umum saat melakukan operasi pada potongan tersebut.invalid chunk state
: Chunk tidak dalam status yang diharapkan untuk operasi tertentu, misalnya, tidak dialokasikan saat mencoba membebaskannya, atau tidak dikarantina saat mencoba mendaur ulangnya. Double free adalah alasan umum terjadinya error ini.misaligned pointer
: Persyaratan perataan dasar sangat diterapkan: 8 byte pada platform 32-bit dan 16 byte pada platform 64-bit. Jika pointer yang diteruskan ke fungsi kami tidak sesuai dengan pointer tersebut, pointer yang diteruskan ke salah satu fungsi tidak selaras.allocation type mismatch
: Jika opsi ini diaktifkan, fungsi pelepasan yang dipanggil pada chunk harus cocok dengan jenis fungsi yang dipanggil untuk mengalokasikannya. Jenis ketidakcocokan ini dapat menimbulkan masalah keamanan.invalid sized delete
: Saat operator penghapusan berukuran C++14 digunakan, dan pemeriksaan opsional diaktifkan, ada ketidakcocokan antara ukuran yang diteruskan saat mendealokasikan chunk dan ukuran yang diminta saat mengalokasikannya. Hal ini biasanya merupakan masalah compiler atau kebingungan jenis pada objek yang dibatalkan alokasinya.RSS limit exhausted
: RSS maksimum yang ditentukan secara opsional telah terlampaui.
Jika Anda men-debug error di OS itu sendiri, Anda dapat menggunakan build OS HWASan. Jika Anda men-debug error di aplikasi, Anda juga dapat menggunakan build aplikasi HWASan.