Petunjuk yang Ditandai

Mulai di Android 11, untuk proses 64-bit, semua alokasi heap memiliki tag yang ditentukan implementasi yang ditetapkan di byte atas penunjuk pada perangkat dengan dukungan kernel untuk ARM Top-byte Ignore (TBI). Aplikasi apa pun yang memodifikasi tag ini dihentikan saat tag diperiksa selama deallocation. 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 atas penunjuk saat mengakses memori.

TBI memerlukankernel yang kompatibel yang menangani pointer yang ditandai dengan benar yang diteruskan dari ruang pengguna. Kernel Umum Android dari 4.14 (Pixel 4) dan lebih tinggi menampilkan 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 dalam byte teratas pointer untuk semua alokasi heap. Setelah ini, pemeriksaan dijalankan untuk memastikan tag tidak terpotong saat membatalkan alokasi memori.

Kesiapan Ekstensi Penandaan Memori

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

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

Dukungan pengembang

Jika aplikasi Anda mogok dan Anda dimintai tautan ini, itu bisa berarti salah satu dari berikut ini:

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

Contoh pointer byte atas yang salah digunakan atau dimodifikasi.

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

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

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

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

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