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

Scudo

Ulysse adalah dinamis user-mode pengalokasi memori, atau pengalokasi tumpukan, dirancang untuk menjadi tahan terhadap kerentanan terkait tumpukan-(seperti berbasis tumpukan buffer overflow , digunakan setelah bebas , dan ganda bebas ) tetap menjaga kinerja. Ini memberikan standar alokasi C dan dealokasi primitif (seperti malloc dan bebas), serta C ++ primitif (seperti baru dan menghapus).

Ulysse lebih dari mitigasi dari detektor kesalahan memori sepenuhnya matang seperti AddressSanitizer (Asan) .

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

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

Ulysse adalah open source dan bagian dari proyek compiler-rt LLVM ini. Dokumentasi tersedia di https://llvm.org/docs/ScudoHardenedAllocator.html . The Scudo kapal runtime sebagai bagian dari toolchain Android dan dukungan telah ditambahkan ke Soong dan Membuat untuk memungkinkan mudah memungkinkan dari pengalokasi di biner.

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

Kustomisasi

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

  • Statis: Tentukan __scudo_default_options berfungsi dalam program yang mengembalikan opsi string untuk diurai. Fungsi ini harus memiliki prototipe berikut: extern "C" const char *__scudo_default_options() .
  • Dinamis: Gunakan variabel lingkungan SCUDO_OPTIONS yang berisi opsi string untuk diurai. Pilihan didefinisikan dengan cara ini menimpa definisi dilakukan melalui __scudo_default_options .

Opsi berikut tersedia.

Pilihan Standar 64-bit Standar 32-bit Keterangan
QuarantineSizeKb 256 64 Ukuran (dalam KB) karantina yang digunakan untuk menunda dealokasi sebenarnya dari potongan. Nilai yang lebih rendah dapat mengurangi penggunaan memori tetapi mengurangi efektivitas mitigasi; nilai negatif jatuh kembali ke default. Pengaturan kedua ini dan ThreadLocalQuarantineSizeKb ke nol menonaktifkan karantina seluruhnya.
QuarantineChunksUpToSize 2048 512 Ukuran (dalam byte) hingga potongan mana yang dapat dikarantina.
ThreadLocalQuarantineSizeKb 64 16 Ukuran (dalam KB) cache per-utas digunakan untuk membongkar karantina global. Nilai yang lebih rendah dapat mengurangi penggunaan memori tetapi dapat meningkatkan pertentangan di karantina global. Pengaturan kedua ini dan QuarantineSizeKb ke nol menonaktifkan karantina seluruhnya.
DeallocationTypeMismatch false false Mengaktifkan pelaporan kesalahan pada malloc/delete, new/free, new/delete[]
DeleteSizeMismatch true true Memungkinkan pelaporan kesalahan pada ketidakcocokan antara ukuran baru dan hapus.
ZeroContents false false Mengaktifkan konten potongan nol pada alokasi dan dealokasi.
allocator_may_return_null false false Menentukan bahwa pengalokasi dapat mengembalikan null saat terjadi kesalahan yang dapat dipulihkan, alih-alih menghentikan proses.
hard_rss_limit_mb 0 0 Saat proses RSS mencapai batas ini, proses akan dihentikan.
soft_rss_limit_mb 0 0 Ketika proses RSS mencapai batas ini, alokasi lanjut gagal atau kembali null (tergantung pada nilai allocator_may_return_null ), sampai RSS pergi kembali turun untuk memungkinkan alokasi baru.
allocator_release_to_os_interval_ms T/A 5000 Hanya mempengaruhi pengalokasi 64-bit. Jika disetel, coba lepaskan 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 set, panggilan alat abort() bukan _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 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. Output biasanya dimulai dengan Scudo ERROR: diikuti dengan ringkasan singkat dari masalah bersama dengan pointer.

Berikut adalah daftar pesan kesalahan saat ini dan kemungkinan penyebabnya:

  • corrupted chunk header : Verifikasi checksum dari header chunk telah gagal. Ini kemungkinan karena salah satu dari dua hal: header ditimpa (sebagian atau seluruhnya), atau pointer yang diteruskan ke fungsi bukan potongan.
  • race on chunk header : Dua benang yang berbeda sedang berusaha untuk memanipulasi header yang sama pada waktu yang sama. Ini biasanya merupakan gejala dari kondisi balapan atau kurangnya penguncian saat melakukan operasi pada potongan itu.
  • invalid chunk state : potongan ini tidak di negara yang diharapkan untuk suatu operasi tertentu, misalnya, itu tidak dialokasikan ketika mencoba untuk membebaskan, atau itu tidak dikarantina ketika mencoba untuk mendaur ulang itu. Gratis ganda adalah alasan umum untuk kesalahan ini.
  • misaligned pointer : Persyaratan keselarasan dasar yang kuat ditegakkan: 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 selaras.
  • allocation type mismatch : Bila opsi ini diaktifkan, fungsi dealokasi meminta sepotong harus sesuai dengan jenis fungsi yang dipanggil untuk mengalokasikan itu. Jenis ketidakcocokan ini dapat menimbulkan masalah keamanan.
  • invalid sized delete : Ketika C ++ 14 Operator delete berukuran digunakan, dan cek opsional diaktifkan, ada ketidakcocokan antara ukuran yang disahkan ketika deallocating sepotong dan ukuran yang diminta ketika mengalokasikan itu. Ini biasanya masalah compiler atau jenis kebingungan pada objek yang sedang deallocated.
  • RSS limit exhausted : maksimum RSS opsional yang ditentukan telah terlampaui.

Jika Anda debugging kecelakaan di OS sendiri, Anda dapat menggunakan HWASan OS membangun . Jika Anda debugging kecelakaan dalam sebuah aplikasi, itu mungkin untuk menggunakan HWASan aplikasi membangun juga.