Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Scudo

Scudo adalah pengalokasi memori mode pengguna yang dinamis, atau pengalokasian heap , yang dirancang untuk tangguh terhadap kerentanan terkait heap (seperti buffer overflow berbasis heap , digunakan setelah bebas , dan bebas ganda ) dengan tetap mempertahankan kinerja. Ini memberikan standar C alokasi dan deallokasi primitif (seperti malloc dan gratis), serta primitif C ++ (seperti baru dan hapus).

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

Android saat ini menggunakan scudo untuk semua kode asli (kecuali pada perangkat dengan memori rendah, di mana jemalloc masih digunakan). Saat runtime, semua alokasi heap asli dan deallokasi dilayani oleh Scudo untuk semua executable dan dependensi pustaka mereka, dan proses dibatalkan jika korupsi atau perilaku mencurigakan terdeteksi di heap.

Di Android 10, scudo harus diaktifkan pada basis per-biner dengan mengatur LOCAL_SANITIZE := scudo opsi LOCAL_SANITIZE := scudo dalam file .mk atau sanitize: { scudo: true, } dalam file .bp.

Scudo adalah open source dan bagian dari proyek compiler-rt LLVM. Dokumentasi tersedia di https://llvm.org/docs/ScudoHardenedAllocator.html . Scudo runtime dikirimkan sebagai bagian dari rantai alat Android dan dukungan ditambahkan ke Soong dan Make untuk memungkinkan pengalokasian pengalokasi dalam biner dengan mudah.

Anda dapat mengaktifkan atau menonaktifkan mitigasi tambahan dalam pengalokasi menggunakan opsi yang dijelaskan di bawah ini.

Kustomisasi

Beberapa parameter pengalokasi dapat didefinisikan berdasarkan per proses melalui beberapa cara:

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

Opsi berikut tersedia.

Pilihan 64-bit default Default 32-bit Deskripsi
QuarantineSizeKb 256 64 Ukuran (dalam KB) karantina digunakan untuk menunda realokasi potongan. Nilai yang lebih rendah dapat mengurangi penggunaan memori tetapi mengurangi efektivitas mitigasi; nilai negatif turun kembali ke default. Mengatur ini dan ThreadLocalQuarantineSizeKb ke nol menonaktifkan karantina sepenuhnya.
QuarantineChunksUpToSize 2048 512 Ukuran (dalam byte) hingga potongan yang dapat dikarantina.
ThreadLocalQuarantineSizeKb 64 16 Ukuran (dalam KB) dari cache per-utas digunakan untuk melepas karantina global. Nilai yang lebih rendah dapat mengurangi penggunaan memori tetapi dapat meningkatkan pertikaian tentang karantina global. Mengatur ini dan QuarantineSizeKb ke nol 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 hapus.
ZeroContents false false Mengaktifkan konten chunk nol pada alokasi dan deallokasi.
allocator_may_return_null false false Menentukan bahwa pengalokasi dapat mengembalikan nol saat terjadi kesalahan yang dapat dipulihkan, alih-alih menghentikan proses.
hard_rss_limit_mb 0 0 Ketika RSS proses mencapai batas ini, proses berakhir.
soft_rss_limit_mb 0 0 Ketika RSS proses 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 memengaruhi pengalokasi 64-bit. Jika diatur, cobalah untuk melepaskan memori yang tidak digunakan ke OS, tetapi tidak lebih sering daripada interval ini (dalam milidetik). Jika nilainya negatif, memori tidak dirilis ke OS.
abort_on_error true true Jika diatur, alat ini memanggil abort() alih-alih _exit() setelah mencetak pesan kesalahan.

Validasi

Saat ini, tidak ada tes CTS khusus untuk Scudo. Sebagai gantinya, pastikan bahwa tes CTS lulus dengan atau tanpa Scudo diaktifkan untuk biner yang diberikan untuk memverifikasi bahwa itu 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 ke penghentian ditambahkan dalam log sistem. Output biasanya dimulai dengan Scudo ERROR: diikuti oleh ringkasan singkat dari masalah bersama dengan pointer apa pun.

Berikut adalah daftar pesan kesalahan saat ini dan kemungkinan penyebabnya:

  • corrupted chunk header : Verifikasi checksum dari chunk header gagal. Ini kemungkinan disebabkan oleh salah satu dari dua hal: header ditimpa (sebagian atau seluruhnya), atau pointer yang diteruskan ke fungsi tersebut bukan bongkahan.
  • race on chunk header : Dua utas berbeda mencoba memanipulasi tajuk yang sama secara bersamaan. Ini biasanya merupakan gejala dari kondisi ras atau kurangnya penguncian saat melakukan operasi pada bongkahan itu.
  • invalid chunk state : chunk tidak dalam kondisi yang diharapkan untuk operasi tertentu, misalnya, itu tidak dialokasikan ketika mencoba untuk membebaskannya, atau itu tidak dikarantina ketika mencoba untuk mendaur ulang itu. Gratis ganda adalah alasan umum untuk kesalahan ini.
  • misaligned pointer : Persyaratan penyelarasan dasar sangat ditegakkan: 8 byte pada platform 32-bit dan 16 byte pada platform 64-bit. Jika sebuah pointer yang diteruskan ke fungsi kami tidak sesuai dengan itu, pointer yang diteruskan ke salah satu fungsi tidak selaras.
  • allocation type mismatch : Ketika opsi ini diaktifkan, fungsi deallokasi yang dipanggil pada chunk harus cocok dengan jenis fungsi yang dipanggil untuk mengalokasikannya. Jenis ketidakcocokan ini dapat menyebabkan masalah keamanan.
  • invalid sized delete : Ketika operator penghapusan ukuran C ++ 14 digunakan, dan pemeriksaan opsional diaktifkan, ada ketidaksesuaian antara ukuran yang dilewati saat mendeallokasi chunk dan ukuran yang diminta saat mengalokasikannya. Ini biasanya merupakan masalah kompilator atau jenis kebingungan pada objek yang sedang dialokasikan.
  • RSS limit exhausted : RSS maksimum yang ditentukan secara opsional telah terlampaui.

Jika Anda sedang men -debug crash di OS itu sendiri, Anda dapat menggunakan build OS HWASan . Jika Anda mendebug aplikasi macet di suatu aplikasi, Anda juga dapat menggunakan build aplikasi HWASan .