Mulai Android 11, untuk proses 64-bit, semua alokasi heap memiliki tag yang ditentukan penerapan yang ditetapkan di byte atas pointer pada perangkat dengan dukungan kernel untuk ARM Top-byte Ignore (TBI). Setiap aplikasi yang mengubah tag ini akan dihentikan saat tag diperiksa selama pengalokasian ulang. Hal ini diperlukan untuk hardware mendatang dengan dukungan ARM Memory Tagging Extension (MTE).
Abaikan byte teratas
Fitur Top-byte Ignore ARM tersedia untuk kode 64-bit di semua hardware Armv8 AArch64. Fitur ini berarti bahwa hardware mengabaikan byte atas pointer saat mengakses memori.
TBI memerlukan kernel yang kompatibel yang menangani pointer bertag dengan benar yang diteruskan dari ruang pengguna. Kernel Umum Android dari 4.14 (Pixel 4) dan yang 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 disisipkan ke dalam byte teratas pointer untuk semua alokasi heap. Setelah itu, pemeriksaan dijalankan untuk memastikan tag belum terpotong saat mengalokasikan ulang memori.
Kesiapan Memory Tagging Extension
Memory Tagging Extension (MTE) ARM membantu mengatasi masalah keamanan memori. MTE berfungsi dengan memberi tag bit alamat ke-56 hingga ke-59 dari setiap alokasi memori di stack, heap, dan global. Hardware dan set instruksi otomatis memeriksa apakah tag yang benar digunakan pada setiap akses memori.
Aplikasi Android yang salah menyimpan informasi di byte atas pointer dijamin akan rusak di perangkat yang mengaktifkan MTE. Pointer bertag mempermudah deteksi dan penolakan penggunaan byte teratas pointer yang salah sebelum perangkat MTE tersedia.
Dukungan developer
Jika aplikasi Anda mengalami error dan Anda diminta untuk membuka link ini, hal ini dapat berarti salah satu hal berikut:
- Aplikasi mencoba mengosongkan pointer yang tidak dialokasikan oleh allocator heap sistem.
- Ada sesuatu di aplikasi Anda yang mengubah byte teratas pointer. Byte atas pointer tidak dapat diubah dan kode Anda perlu diubah untuk memperbaiki masalah ini.
Contoh pointer byte teratas yang salah digunakan atau diubah.
- Pointer ke jenis tertentu memiliki metadata khusus aplikasi yang disimpan di 16 bit alamat teratas.
- Pointer yang ditransmisikan ke ganda, lalu kembali, sehingga kehilangan bit alamat yang lebih rendah.
- Kode yang menghitung perbedaan antara alamat variabel lokal dari frame stack yang berbeda sebagai cara untuk mengukur kedalaman rekursi.
Beberapa aplikasi mungkin bergantung pada library yang berperilaku tidak benar saat
byte atas pointer ditetapkan. Kami menyadari bahwa mungkin
tidak mudah untuk memperbaiki masalah mendasar ini di library dengan cepat. Dengan demikian,
aplikasi yang menggunakan targetSdkLevel < 30
tidak akan mengaktifkan pemberian tag pointer secara default. Kami juga menyediakan pintu
darurat untuk aplikasi yang dibuat dengan targetSdkLevel >= 30
guna memudahkan periode transisi.
Escape hatch digunakan dengan menambahkan kode berikut ke
file AndroidManifest.xml
Anda:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
Tindakan ini akan menonaktifkan fitur Pemberian Tag Pointer untuk aplikasi Anda. Tindakan 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.