Pointer yang diberi tag

Mulai Android 11, untuk proses 64-bit, semua alokasi heap memiliki tag yang ditentukan penerapan yang diatur dalam byte teratas dari pointer di perangkat dengan dukungan kernel untuk ARM Top-byte Ignore (TBI). Aplikasi apa pun yang memodifikasinya dihentikan ketika tag diperiksa selama dealokasi. Ini diperlukan untuk hardware mendatang dengan dukungan ARM Memory Tagging Extension (MTE).

Pengabaian 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 pointer saat yang mengakses memori.

TBI memerlukan komputer kompatibel kernel yang menangani pointer yang diberi tag dengan benar yang diteruskan dari userspace. Kernel Umum Android dari 4.14 (Pixel 4) dan yang lebih tinggi memiliki TBI yang diperlukan patch.

Perangkat dengan dukungan TBI di kernel terdeteksi secara dinamis di waktu mulai proses dan tag yang bergantung pada penerapan disisipkan ke dalam byte pointer untuk semua alokasi heap. Setelah ini, pemeriksaan dijalankan untuk memastikan tag tidak terpotong saat mengalokasikan memori.

Kesiapan Ekstensi Pemberian Tag Memori

Memory Tagging Extension (MTE) ARM membantu mengatasi masalah keamanan memori. MTE bekerja dengan memberi tag pada bit alamat ke-56-59 dari setiap memori pada stack, heap, dan global. Set hardware dan instruksi secara otomatis memeriksa apakah tag yang benar digunakan pada setiap akses memori.

Aplikasi Android yang salah menyimpan informasi di byte teratas pointer dijamin rusak di perangkat yang mendukung MTE. Pointer yang diberi tag memudahkan Anda mendeteksi dan menolak penggunaan bagian atas yang salah byte pointer sebelum perangkat MTE tersedia.

Dukungan developer

Jika aplikasi Anda mengalami error dan Anda melihat pesan dengan link ini, artinya salah satu hal berikut:

  1. Aplikasi ini mencoba membebaskan pointer yang tidak dialokasikan oleh alokator heap sistem.
  2. Ada sesuatu di aplikasi Anda yang mengubah byte teratas pointer. byte teratas dari pointer tidak dapat diubah dan kode Anda perlu diubah untuk memperbaiki masalah ini masalah performa.

Contoh pointer byte teratas yang salah digunakan atau diubah.

  • Pointer ke jenis tertentu menyimpan metadata khusus aplikasi dalam 16 bit alamat.
  • Pointer yang ditransmisikan ke menggandakan dan kemudian kembali, kehilangan bit alamat yang lebih rendah.
  • Komputasi kode perbedaan antara alamat variabel lokal dari berbagai frame stack sebagai cara untuk mengukur kedalaman rekursi.

Beberapa aplikasi mungkin bergantung pada library yang berperilaku tidak benar saat byte teratas dari pointer diatur. Kami menyadari bahwa mungkin sulit untuk memperbaiki masalah mendasar di {i>library<i} dengan cepat. Dengan demikian, aplikasi yang menggunakan targetSdkLevel < 30 tidak akan mengaktifkan pemberian tag pointer secara default. Kami juga menyediakan escape rencana untuk aplikasi yang dibuat dengan targetSdkLevel >= 30 untuk memudahkan periode transisi.

Jalan keluar digunakan dengan menambahkan kode berikut ke File AndroidManifest.xml:

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

Tindakan ini akan menonaktifkan fitur Pemberian Tag Pointer untuk . Contoh ini tidak mengatasi masalah kesehatan kode yang mendasarinya. Jalan keluar ini akan hilang pada masa mendatang Android, karena masalah seperti ini tidak akan kompatibel dengan MTE.