Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Pointer Tagged

Mulai Android 11, untuk proses 64-bit, semua alokasi heap memiliki implementasi yang ditetapkan tag yang ditetapkan di byte atas pointer pada perangkat dengan dukungan kernel untuk ARM Top-byte Ignore (TBI). Setiap aplikasi yang memodifikasi tag ini dihentikan ketika tag tersebut diperiksa selama deallocation. Ini diperlukan untuk perangkat keras masa depan dengan dukungan ARM Memory Tagging Extension (MTE).

Abaikan byte atas

Fitur Top-byte Ignore 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 membutuhkankernel kompatibel yang menangani dengan benar penunjuk yang diberi tag yang diteruskan dari ruang pengguna. Android Common Kernels dari 4.14 (Pixel 4) dan lebih tinggi menampilkan patch TBI yang diperlukan.

Perangkat dengan dukungan TBI di kernel secara dinamis terdeteksi pada waktu mulai proses dan tag yang bergantung pada implementasi dimasukkan ke dalam byte teratas dari 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 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 byte atas penunjuk dijamin akan rusak pada perangkat yang mendukung MTE . Penunjuk yang diberi tag memudahkan untuk mendeteksi dan menolak penggunaan yang salah dari byte atas penunjuk sebelum perangkat MTE tersedia.

Dukungan pengembang

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

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

Contoh pointer byte atas yang digunakan atau dimodifikasi dengan tidak benar.

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

Beberapa aplikasi mungkin bergantung pada pustaka yang berperilaku tidak benar saat 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 pointer secara default. Kami juga menyediakan jalan keluar untuk aplikasi yang dibangun dengan targetSdkLevel >= 30 untuk memudahkan periode transisi.

Escape hatch digunakan dengan menambahkan 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. Pintu keluar ini akan hilang di versi Android mendatang, karena masalah seperti ini tidak akan kompatibel dengan MTE .