Mitigasi dan proses debug error memori

Android mendukung beberapa alat untuk men-debug error memori. Ada beberapa konsekuensi bagi setiap alat, jadi baca dokumen di bawah ini guna memutuskan alat mana yang terbaik untuk kasus penggunaan Anda. Dokumen ini memberikan ringkasan tentang alat yang tersedia sehingga Anda dapat memutuskan alat mana yang akan diselidiki lebih lanjut. Karena ini adalah dokumen ringkasan, baca penjelasan masing-masing alat untuk mengetahui detailnya selengkapnya.

tl;dr

  • Gunakan bahasa yang aman untuk memori jika memungkinkan agar tidak terjadi error memori
  • Selalu gunakan PAC/BTI untuk memitigasi serangan ROP/JOP
  • Selalu gunakan GWP-ASan untuk mendeteksi error memori yang jarang terjadi dalam produksi
  • Gunakan HWASan untuk mendeteksi error memori selama pengujian
  • Perangkat yang mendukung MTE umumnya tidak tersedia pada tahun 2023, tetapi gunakan jika Anda dapat mendeteksi error dalam produksi
  • Gunakan ASan selama pengujian hanya sebagai opsi terakhir

Bahasa yang aman untuk memori

Bahasa yang aman untuk memori adalah satu-satunya cara untuk sepenuhnya menghindari dan mengurangi error memori. Alat lain di halaman ini dapat membantu Anda membuat kode memori yang tidak aman menjadi lebih aman dan lebih andal, tetapi menggunakan bahasa yang aman untuk memori akan menghilangkan seluruh jenis masalah.

Bahasa yang aman untuk memori serta didukung secara resmi untuk Android adalah Java dan Kotlin. Sebagian besar aplikasi Android lebih mudah dikembangkan dalam salah satu bahasa tersebut.

Meskipun demikian, ada kode pengiriman developer aplikasi yang ditulis dalam Rust, dan jika Anda membaca halaman ini, Anda mungkin memiliki alasan yang baik untuk menggunakan kode native (portabilitas, performa, atau keduanya). Rust adalah pilihan terbaik untuk kode native yang aman untuk memori di Android. Tim NDK tidak selalu dapat membantu mengatasi masalah yang Anda hadapi jika menggunakan metode tersebut, tetapi kami tertarik untuk mendengar masukan Anda.

PAC/BTI

Pointer Authentication dan Branch Target Identification, yang juga dikenal sebagai PAC/BTI, adalah alat mitigasi yang cocok digunakan dalam produksi. Meskipun dua teknologi ini berbeda, keduanya dikontrol oleh tanda compiler yang sama sehingga selalu digunakan bersama.

Fitur ini kompatibel dengan versi lama perangkat yang tidak mendukungnya karena petunjuk baru yang digunakan tidak beroperasi di perangkat sebelumnya. Anda juga harus memiliki kernel versi OS yang cukup baru. Mencari paca dan bti di /proc/cpuinfo akan menunjukkan apakah Anda memiliki hardware dan kernel yang cukup baru. Android 12 (API 31) memiliki dukungan userspace yang diperlukan.

Kelebihan:

  • Dapat diaktifkan di semua build tanpa menyebabkan masalah pada perangkat atau kernel yang lebih lama (tetapi pastikan Anda benar-benar melakukan pengujian pada kombinasi perangkat/kernel/OS yang mendukungnya)

Kekurangan:

  • Hanya tersedia untuk aplikasi 64-bit
  • Tidak memitigasi error di perangkat yang tidak mendukungnya
  • Overhead ukuran kode 1%

GWP-Asan

GWP-ASan dapat digunakan untuk mendeteksi error memori di lapangan, tetapi frekuensi sampling terlalu rendah untuk menjadi mitigasi yang efektif.

Kelebihan:

  • Tidak ada overhead memori atau CPU yang signifikan
  • Deployment sederhana: tidak perlu membangun ulang kode native
  • Berfungsi untuk aplikasi 32-bit

Kekurangan:

  • Frekuensi sampling rendah memerlukan banyak pengguna untuk menemukan bug secara efektif
  • Hanya mendeteksi error heap, bukan error stack

HWASan

Hardware address sanitizer, juga dikenal sebagai HWASan, paling cocok untuk menangkap error memori selama pengujian. Hal ini paling berguna saat digunakan dengan pengujian otomatis, terutama jika Anda menjalankan pengujian fuzz. Namun, bergantung pada kebutuhan performa aplikasi Anda, fitur ini mungkin juga dapat digunakan pada ponsel kelas atas di setelan dogfood.

Kelebihan:

  • Tidak ada positif palsu
  • Mendeteksi class error tambahan yang tidak dapat dilakukan ASan (penggunaan stack setelah ditampilkan)
  • Rasio negatif palsu lebih rendah daripada MTE (1 dari 256 vs 1 dari 16)
  • Overhead memori lebih rendah dari ASan, alternatif terdekatnya

Kekurangan:

  • Overhead CPU (100%), ukuran kode (~50%), dan memori (10% - 35%) yang signifikan
  • Hingga API 34 dan NDK r26, memerlukan flash image yang kompatibel dengan HWASan
  • Hanya berfungsi pada aplikasi 64-bit

MTE

Memory tagging extension, juga dikenal sebagai MTE, adalah alternatif lebih hemat biaya untuk HWASan, yang dimaksudkan untuk digunakan di lapangan. Jika Anda memiliki hardware untuk menguji build MTE, Anda harus mengaktifkannya.

Kelebihan:

  • Overhead yang cukup rendah sehingga dapat ditoleransi dalam produksi untuk banyak aplikasi
  • Tidak ada positif palsu
  • Tidak perlu membangun ulang kode untuk mendeteksi error heap (tetapi memerlukannya untuk mendeteksi error stack)

Kekurangan:

  • Tidak ada perangkat yang tersedia secara komersial yang mendukung MTE pada tahun 2023
  • Rasio negatif palsu 1 dari 16 vs HWASan 1 dari 256
  • Hanya tersedia untuk aplikasi 64-bit
  • Perlu membangun library terpisah untuk menargetkan perangkat yang mendukung MTE dan non-MTE

ASan

Address sanitizer, juga dikenal sebagai ASan, adalah alat tertua dan yang paling banyak tersedia. Alat ini berguna untuk menemukan error memori selama masalah pengujian dan proses debug yang hanya memengaruhi perangkat lama yang tidak didukung oleh alat lainnya. Jika memungkinkan, pilih HWASan.

Kelebihan:

  • Tersedia secara luas. Dapat berfungsi pada perangkat lama seperti KitKat
  • Tidak ada positif atau negatif palsu jika digunakan dengan benar

Kekurangan:

  • Sulit untuk dibangun dan dikemas dengan benar
  • Overhead tertinggi dari semua opsi: ~100% CPU, ~50% ukuran kode, ~100% penggunaan memori
  • Tidak didukung lagi
  • Memiliki bug umum yang tidak akan diperbaiki