Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Scudo

Scudo adalah pengalokasi memori mode pengguna dinamis, atau pengalokasi heap , yang dirancang agar tahan terhadap kerentanan terkait heap (seperti buffer overflow berbasis heap , digunakan setelah kosong , dan bebas ganda ) sambil mempertahankan performa. Ini menyediakan primitif alokasi C standar dan deallocation (seperti malloc dan gratis), serta primitif C ++ (seperti baru dan hapus).

Scudo lebih merupakan mitigasi daripada detektor kesalahan memori yang lengkap seperti AddressSanitizer (ASan) .

Mulai rilis Android 11, scudo digunakan untuk semua kode native (kecuali pada perangkat dengan memori rendah, tempat jemalloc masih digunakan). Saat runtime, semua alokasi heap native dan deallocations dilayani oleh Scudo untuk semua executable dan dependensi library mereka, dan proses dibatalkan jika korupsi atau perilaku mencurigakan terdeteksi di heap.

Di Android 10, scudo harus diaktifkan per biner dengan menyetel opsi LOCAL_SANITIZE := scudo di file .mk atau sanitize: { scudo: true, } di file .bp.

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 ekstra dalam pengalokasi menggunakan opsi yang dijelaskan di bawah ini.

Kustomisasi

Beberapa parameter pengalokasi dapat ditentukan per proses melalui beberapa cara:

  • Secara statis: Definisikan fungsi __scudo_default_options dalam program yang mengembalikan string opsi untuk diurai. Fungsi ini harus memiliki prototipe berikut: extern "C" const char *__scudo_default_options() .
  • Secara dinamis: Gunakan variabel lingkungan SCUDO_OPTIONS berisi string opsi untuk diurai. Opsi yang ditentukan dengan cara ini mengesampingkan definisi apa pun yang dibuat melalui __scudo_default_options .

Pilihan berikut tersedia.

Pilihan 64-bit default 32-bit default Deskripsi
QuarantineSizeKb 256 64 Ukuran (dalam KB) karantina yang digunakan untuk menunda realokasi potongan yang sebenarnya. Nilai yang lebih rendah dapat mengurangi penggunaan memori tetapi menurunkan efektivitas mitigasi; nilai negatif kembali ke default. Menyetel ini dan ThreadLocalQuarantineSizeKb ke nol akan menonaktifkan karantina sepenuhnya.
QuarantineChunksUpToSize 2048 512 Ukuran (dalam byte) di mana bongkahan dapat dikarantina.
ThreadLocalQuarantineSizeKb 64 16 Ukuran (dalam KB) dari cache per-utas yang digunakan untuk menghapus karantina global. Nilai yang lebih rendah dapat mengurangi penggunaan memori, tetapi dapat meningkatkan perselisihan di karantina global. Menyetel ini dan QuarantineSizeKb ke nol akan menonaktifkan karantina sepenuhnya.
DeallocationTypeMismatch false false Mengaktifkan pelaporan kesalahan pada malloc / delete, new / free, new / delete []
DeleteSizeMismatch true true Mengaktifkan pelaporan kesalahan pada ketidakcocokan antara ukuran baru dan hapus.
ZeroContents false false Mengaktifkan konten potongan nol pada alokasi dan deallocation.
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 proses RSS mencapai batas ini, proses akan dihentikan.
soft_rss_limit_mb 0 0 Ketika proses RSS mencapai batas ini, alokasi lebih lanjut gagal atau mengembalikan 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 mempengaruhi 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 disetel, alat akan memanggil abort() alih-alih _exit() setelah mencetak pesan kesalahan.

Validasi

Saat ini belum ada tes CTS khusus untuk Scudo. Sebagai gantinya, pastikan bahwa tes CTS lulus dengan atau tanpa Scudo diaktifkan untuk biner tertentu untuk memverifikasi bahwa itu tidak memengaruhi 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 ke penghentian ditambahkan di log sistem. Keluarannya 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. Ini mungkin karena salah satu dari dua hal: tajuk telah ditimpa (sebagian atau seluruhnya), atau penunjuk yang diteruskan ke fungsi bukan bagian.
  • race on chunk header : Dua utas berbeda mencoba memanipulasi header yang sama pada waktu yang sama. Ini biasanya merupakan gejala dari kondisi balapan atau kurangnya penguncian secara umum saat melakukan operasi pada bagian 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 khas untuk kesalahan ini.
  • misaligned pointer : Persyaratan penyelarasan dasar sangat diberlakukan: 8 byte pada platform 32-bit dan 16 byte pada platform 64-bit. Jika penunjuk yang diteruskan ke fungsi kita tidak cocok dengan itu, penunjuk yang diteruskan ke salah satu fungsi tidak sejajar.
  • allocation type mismatch : Ketika opsi ini diaktifkan, fungsi deallocation yang dipanggil pada chunk harus cocok dengan jenis fungsi yang dipanggil untuk mengalokasikannya. Jenis ketidakcocokan ini dapat menyebabkan masalah keamanan.
  • invalid sized delete : Saat operator hapus 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 di OS itu sendiri, Anda dapat menggunakan versi OS HWASan . Jika Anda men -debug kerusakan dalam suatu aplikasi, Anda juga dapat menggunakan build aplikasi HWASan .