Petunjuk yang Ditandai

Mulai Android 11, untuk proses 64-bit, semua alokasi heap memiliki tag yang ditentukan implementasi yang ditetapkan dalam byte atas pointer pada perangkat dengan dukungan kernel untuk ARM Top-byte Ignore (TBI). Aplikasi apa pun yang mengubah tag ini dihentikan ketika tag diperiksa selama dealokasi. Hal ini diperlukan untuk perangkat keras masa depan dengan dukungan ARM Memory Tagging Extension (MTE).

Abaikan byte teratas

Fitur Abaikan Top-byte ARM tersedia untuk kode 64-bit di semua perangkat keras Armv8 AArch64. Fitur ini berarti bahwa perangkat keras mengabaikan byte teratas dari sebuah pointer ketika mengakses memori.

TBI memerlukan kernel yang kompatibel yang menangani dengan benar pointer yang diberi tag yang diteruskan dari ruang pengguna. Kernel Umum Android versi 4.14 (Pixel 4) dan lebih tinggi dilengkapi patch TBI yang diperlukan.

Perangkat dengan dukungan TBI di kernel terdeteksi secara dinamis pada waktu mulai proses dan tag yang bergantung pada implementasi dimasukkan ke byte atas penunjuk untuk semua alokasi heap. Setelah ini, pemeriksaan dijalankan untuk memastikan tag belum terpotong saat membatalkan alokasi memori.

Kesiapan Ekstensi Penandaan Memori

Ekstensi Penandaan Memori (MTE) ARM membantu mengatasi masalah keamanan memori. MTE bekerja dengan menandai bit alamat 56-59 dari setiap alokasi memori pada stack, heap, dan global. Perangkat keras dan set instruksi secara otomatis memeriksa apakah tag yang benar digunakan pada setiap akses memori.

Aplikasi Android yang salah menyimpan informasi di byte atas penunjuk dijamin akan rusak pada perangkat yang mendukung MTE . Pointer yang diberi tag memudahkan untuk mendeteksi dan menolak penggunaan byte atas pointer yang salah sebelum perangkat MTE tersedia.

Dukungan pengembang

Jika aplikasi Anda mogok dan Anda diminta memberikan tautan ini, hal ini mungkin berarti salah satu hal berikut:

  1. Aplikasi mencoba membebaskan penunjuk yang tidak dialokasikan oleh pengalokasi heap sistem.
  2. Sesuatu di aplikasi Anda mengubah byte teratas sebuah pointer. Byte atas penunjuk tidak dapat diubah dan kode Anda perlu diubah untuk memperbaiki masalah ini.

Contoh penunjuk byte teratas yang salah digunakan atau dimodifikasi.

  • Pointer ke tipe tertentu memiliki metadata khusus aplikasi yang disimpan di 16 bit alamat teratas.
  • Sebuah pointer dilemparkan ke dua kali lipat dan kemudian kembali, kehilangan bit alamat yang lebih rendah.
  • Kode menghitung perbedaan antara alamat variabel lokal dari frame tumpukan yang berbeda sebagai cara untuk mengukur kedalaman rekursi.

Beberapa aplikasi mungkin bergantung pada perpustakaan yang berperilaku tidak benar ketika byte atas penunjuk disetel. Kami menyadari bahwa mungkin tidak mudah untuk memperbaiki masalah mendasar ini di perpustakaan dengan cepat. Oleh karena itu, aplikasi yang menggunakan targetSdkLevel < 30 tidak akan mengaktifkan penandaan penunjuk secara default. Kami juga menyediakan jalan keluar untuk aplikasi yang dibangun dengan targetSdkLevel >= 30 untuk memudahkan masa transisi.

Escape hatch digunakan dengan menambahkan kode berikut ke file AndroidManifest.xml Anda:

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

Ini akan menonaktifkan fitur Penandaan Penunjuk untuk aplikasi Anda. Harap dicatat bahwa ini tidak mengatasi masalah kesehatan kode yang mendasarinya. Escape hatch ini akan hilang di versi Android mendatang, karena masalah seperti ini tidak akan kompatibel dengan MTE .