Tim Keamanan Android secara rutin menerima permintaan informasi tentang cara mencegah potensi masalah keamanan di perangkat Android. Kami juga sesekali melakukan pemeriksaan mendadak pada perangkat dan memberi tahu produsen perangkat serta partner yang terpengaruh tentang potensi masalah.
Halaman ini memberikan praktik terbaik keamanan berdasarkan pengalaman kami, yang memperluas dokumentasi Mendesain untuk Keamanan yang telah kami berikan kepada developer dan menyertakan detail unik untuk mem-build atau menginstal software tingkat sistem di perangkat.
Untuk memfasilitasi penerapan praktik terbaik ini, jika memungkinkan, Tim
Keamanan Android akan menggabungkan pengujian ke dalam
Android Compatibility Test Suite (CTS) dan
Android Lint. Sebaiknya
penerapkan perangkat berkontribusi pada pengujian yang dapat membantu pengguna Android lainnya (lihat
pengujian terkait keamanan di
root/cts/tests/tests/security/src/android/security/cts
).
Proses pengembangan
Gunakan praktik terbaik berikut dalam proses dan lingkungan pengembangan Anda.
Meninjau kode sumber
Peninjauan kode sumber dapat mendeteksi berbagai masalah keamanan, termasuk masalah yang diidentifikasi dalam dokumen ini. Android sangat mendorong peninjauan kode sumber manual dan otomatis. Praktik terbaik:
- Jalankan Android Lint di semua kode aplikasi menggunakan Android SDK dan perbaiki masalah yang teridentifikasi.
- Kode native harus dianalisis menggunakan alat otomatis yang dapat mendeteksi masalah pengelolaan memori seperti buffer overflow dan error off-by-one.
- Sistem build Android memiliki dukungan untuk banyak sanitizer LLVM, seperti AddressSanitizer dan UndefinedBehaviorSanitizer yang dapat digunakan untuk tujuan ini.
Menggunakan pengujian otomatis
Pengujian otomatis dapat mendeteksi berbagai masalah keamanan, termasuk beberapa masalah yang dibahas di bawah. Praktik terbaik:
- CTS diperbarui secara rutin dengan pengujian keamanan; jalankan CTS versi terbaru untuk memverifikasi kompatibilitas.
- Jalankan CTS secara rutin selama proses pengembangan untuk mendeteksi masalah lebih awal dan mengurangi waktu untuk koreksi. Android menggunakan CTS sebagai bagian dari continuous integration dalam proses build otomatis kami, yang melakukan build beberapa kali per hari.
- Produsen perangkat harus mengotomatiskan pengujian keamanan antarmuka, termasuk pengujian dengan input yang salah format (pengujian fuzz).
Gambar sistem tanda tangan
Tanda tangan image sistem sangat penting untuk menentukan integritas perangkat. Praktik terbaik:
- Perangkat tidak boleh ditandatangani dengan kunci yang diketahui secara publik.
- Kunci yang digunakan untuk menandatangani perangkat harus dikelola dengan cara yang konsisten dengan praktik standar industri untuk menangani kunci sensitif, termasuk hardware security module (HSM) yang memberikan akses terbatas dan dapat diaudit.
Menandatangani aplikasi (APK)
Tanda tangan aplikasi berperan penting dalam keamanan perangkat dan digunakan untuk pemeriksaan izin serta update software. Saat memilih kunci yang akan digunakan untuk menandatangani aplikasi, penting untuk mempertimbangkan apakah aplikasi hanya akan tersedia di satu perangkat atau umum di beberapa perangkat. Praktik terbaik:
- Aplikasi tidak boleh ditandatangani dengan kunci yang diketahui secara publik.
- Kunci yang digunakan untuk menandatangani aplikasi harus dikelola dengan cara yang konsisten dengan praktik standar industri untuk menangani kunci sensitif, termasuk HSM yang memberikan akses terbatas dan dapat diaudit.
- Aplikasi tidak boleh ditandatangani dengan kunci platform.
- Aplikasi dengan nama paket yang sama tidak boleh ditandatangani dengan kunci yang berbeda. Hal ini sering terjadi saat membuat aplikasi untuk perangkat yang berbeda, terutama saat menggunakan kunci platform. Jika aplikasi tidak bergantung pada perangkat, gunakan kunci yang sama di seluruh perangkat. Jika aplikasi khusus perangkat, buat nama paket unik per perangkat dan kunci.
Memublikasikan aplikasi
Google Play memberi produsen perangkat kemampuan untuk mengupdate aplikasi tanpa melakukan update sistem lengkap. Hal ini dapat mempercepat respons terhadap masalah keamanan dan pengiriman fitur baru, serta memberikan cara untuk memastikan aplikasi Anda memiliki nama paket yang unik. Praktik terbaik:
- Upload aplikasi Anda ke Google Play untuk mengizinkan update otomatis tanpa memerlukan update over the air (OTA) penuh. Aplikasi yang diupload tetapi tidak dipublikasikan tidak dapat didownload langsung oleh pengguna, tetapi aplikasi tetap diupdate. Pengguna yang sebelumnya telah menginstal aplikasi dapat menginstal ulang dan/atau menginstal di perangkat lain.
- Buat nama paket aplikasi yang secara jelas dikaitkan dengan perusahaan Anda, seperti dengan menggunakan merek dagang perusahaan.
- Aplikasi yang dipublikasikan oleh produsen perangkat harus diupload di Google Play Store untuk menghindari peniruan identitas nama paket oleh pengguna pihak ketiga. Jika produsen perangkat menginstal aplikasi di perangkat tanpa memublikasikan aplikasi di Play Store, developer lain dapat mengupload aplikasi yang sama, menggunakan nama paket yang sama, dan mengubah metadata untuk aplikasi. Saat aplikasi ditampilkan kepada pengguna, metadata yang tidak terkait ini dapat menimbulkan kebingungan.
Merespons insiden
Pihak eksternal harus memiliki kemampuan untuk menghubungi produsen perangkat terkait masalah keamanan khusus perangkat. Sebaiknya buat alamat email yang dapat diakses secara publik untuk mengelola insiden keamanan. Praktik terbaik:
- Buat alamat security@perusahaan-anda.com atau alamat serupa dan publikasikan.
- Jika mengetahui masalah keamanan yang memengaruhi Android OS atau perangkat Android dari beberapa produsen perangkat, Anda harus menghubungi Tim Android Security dengan mengajukan Laporan bug keamanan.
Menerapkan produk
Gunakan praktik terbaik berikut saat menerapkan produk.
Mengisolasi proses root
Proses root adalah target serangan eskalasi akses yang paling sering terjadi, sehingga mengurangi jumlah proses root akan mengurangi risiko eskalasi akses. CTS menyertakan pengujian informasi yang mencantumkan proses root. Praktik terbaik:
- Perangkat harus menjalankan kode minimum yang diperlukan sebagai root. Jika memungkinkan, gunakan proses Android reguler, bukan proses root. ICS Galaxy Nexus hanya memiliki enam proses root: vold, inetd, zygote, tf_daemon, ueventd, dan init. Jika proses harus berjalan sebagai root di perangkat, dokumentasikan proses tersebut dalam permintaan fitur AOSP agar dapat ditinjau secara publik.
- Jika memungkinkan, kode root harus diisolasi dari data yang tidak tepercaya dan diakses melalui IPC. Misalnya, kurangi fungsi root ke Layanan kecil yang dapat diakses melalui Binder dan tampilkan Layanan dengan izin tanda tangan ke aplikasi dengan hak istimewa rendah atau tidak ada untuk menangani traffic jaringan.
- Proses root tidak boleh memproses soket jaringan.
- Proses root tidak boleh menyediakan runtime tujuan umum untuk aplikasi (misalnya, VM Java).
Mengisolasi aplikasi sistem
Secara umum, aplikasi bawaan tidak boleh berjalan dengan UID sistem bersama. Namun, jika perlu, agar aplikasi dapat menggunakan UID bersama sistem atau layanan dengan hak istimewa lainnya, aplikasi tidak boleh mengekspor layanan, penerima siaran, atau penyedia konten apa pun yang dapat diakses oleh aplikasi pihak ketiga yang diinstal oleh pengguna. Praktik terbaik:
- Perangkat harus menjalankan kode minimum yang diperlukan sebagai sistem. Jika memungkinkan, gunakan proses Android dengan UID-nya sendiri, bukan menggunakan kembali UID sistem.
- Jika memungkinkan, kode sistem harus diisolasi dari data yang tidak tepercaya dan mengekspos IPC hanya ke proses tepercaya lainnya.
- Proses sistem tidak boleh memproses soket jaringan.
Mengisolasi proses
Sandbox Aplikasi Android memberi aplikasi ekspektasi isolasi dari proses lain di sistem, termasuk proses root dan debugger. Kecuali jika proses debug diaktifkan secara khusus oleh aplikasi dan pengguna, tidak ada aplikasi yang boleh melanggar ekspektasi tersebut. Praktik terbaik:
- Proses root tidak boleh mengakses data dalam setiap folder data aplikasi, kecuali jika menggunakan metode proses debug Android yang didokumentasikan.
- Proses root tidak boleh mengakses memori aplikasi, kecuali jika menggunakan metode proses debug Android yang didokumentasikan.
- Perangkat tidak boleh menyertakan aplikasi apa pun yang mengakses data atau memori aplikasi atau proses lainnya.
Mengamankan file SUID
Program setuid baru tidak boleh diakses oleh program yang tidak tepercaya. Program setuid sering kali menjadi lokasi kerentanan yang dapat digunakan untuk mendapatkan akses root, jadi usahakan untuk meminimalkan ketersediaan program setuid ke aplikasi yang tidak tepercaya. Praktik terbaik:
- Proses SUID tidak boleh menyediakan shell atau backdoor yang dapat digunakan untuk mengakali model keamanan Android.
- Program SUID tidak boleh ditulis oleh pengguna mana pun.
- Program SUID tidak boleh dapat dibaca atau dieksekusi oleh semua orang. Buat grup, batasi akses ke biner SUID untuk anggota grup tersebut, dan tempatkan aplikasi apa pun yang seharusnya dapat menjalankan program SUID ke dalam grup tersebut.
- Program SUID adalah sumber umum dari rooting perangkat oleh pengguna. Untuk mengurangi risiko ini, program SUID tidak boleh dieksekusi oleh pengguna shell.
Pengverifikasi CTS menyertakan pengujian informasi yang mencantumkan file SUID; beberapa file setuid tidak diizinkan per pengujian CTS.
Soket pemrosesan permintaan aman
Pengujian CTS gagal saat perangkat memproses di port mana pun, di antarmuka mana pun. Jika terjadi kegagalan, Android akan memverifikasi bahwa praktik terbaik berikut sedang digunakan:
- Tidak boleh ada port pemrosesan di perangkat.
- Port yang sedang dalam proses harus dapat dinonaktifkan tanpa OTA. Hal ini dapat berupa perubahan konfigurasi server atau perangkat pengguna.
- Proses root tidak boleh memproses port apa pun.
- Proses yang dimiliki oleh UID sistem tidak boleh memproses port apa pun.
- Untuk IPC lokal yang menggunakan soket, aplikasi harus menggunakan Soket Domain UNIX dengan akses yang dibatasi untuk grup. Buat deskripsi file untuk IPC dan buat +RW untuk grup UNIX tertentu. Setiap aplikasi klien harus berada dalam grup UNIX tersebut.
- Beberapa perangkat dengan beberapa prosesor (misalnya, radio/modem yang terpisah dari
prosesor aplikasi) menggunakan soket jaringan untuk berkomunikasi antar
prosesor. Dalam kasus tersebut, soket jaringan yang digunakan untuk komunikasi antar-prosesor
harus menggunakan antarmuka jaringan terisolasi untuk mencegah akses oleh
aplikasi yang tidak sah di perangkat (yaitu, gunakan
iptables
untuk mencegah akses oleh aplikasi lain di perangkat). - Daemon yang menangani port pemrosesan harus tahan terhadap data yang salah format. Google dapat melakukan pengujian fuzz terhadap port menggunakan klien yang tidak sah, dan, jika memungkinkan, klien yang sah. Setiap error akan diajukan sebagai bug dengan tingkat keparahan yang sesuai.
Mencatat data ke dalam log
Mencatat data meningkatkan risiko eksposur data tersebut dan mengurangi performa sistem. Beberapa insiden keamanan publik telah terjadi sebagai akibat dari pencatatan data pengguna sensitif oleh aplikasi yang diinstal secara default di perangkat Android. Praktik terbaik:
- Aplikasi atau layanan sistem tidak boleh mencatat data yang diberikan dari aplikasi pihak ketiga yang mungkin menyertakan informasi sensitif.
- Aplikasi tidak boleh mencatat informasi identitas pribadi (PII) apa pun sebagai bagian dari operasi normal.
CTS menyertakan pengujian yang memeriksa keberadaan informasi sensitif yang berpotensi dalam log sistem.
Membatasi akses direktori
Direktori yang dapat ditulis publik dapat menyebabkan kelemahan keamanan dan memungkinkan aplikasi mengganti nama file tepercaya, mengganti file, atau melakukan serangan berbasis symlink (penyerang dapat menggunakan symlink ke file untuk mengelabui program tepercaya agar melakukan tindakan yang tidak seharusnya). Direktori yang dapat ditulis juga dapat mencegah penguninstalan aplikasi untuk membersihkan semua file yang terkait dengan aplikasi dengan benar.
Sebagai praktik terbaik, direktori yang dibuat oleh sistem atau pengguna root tidak boleh dapat ditulis oleh semua orang. Pengujian CTS membantu menerapkan praktik terbaik ini dengan menguji direktori yang diketahui.
File konfigurasi aman
Banyak driver dan layanan mengandalkan file konfigurasi dan data yang disimpan di
direktori seperti /system/etc
dan /data
. Jika file
ini diproses oleh proses dengan hak istimewa dan dapat ditulis oleh semua orang, aplikasi
dapat mengeksploitasi kerentanan dalam proses tersebut dengan membuat
konten berbahaya dalam file yang dapat ditulis oleh semua orang. Praktik terbaik:
- File konfigurasi yang digunakan oleh proses dengan hak istimewa tidak boleh dibaca oleh semua orang.
- File konfigurasi yang digunakan oleh proses dengan hak istimewa tidak boleh dapat ditulis oleh semua orang.
Menyimpan library kode native
Setiap kode yang digunakan oleh proses produsen perangkat dengan hak istimewa harus berada di
/vendor
atau /system
; sistem file ini dipasang
hanya baca saat booting. Sebagai praktik terbaik, library yang digunakan oleh sistem atau
aplikasi lain dengan hak istimewa tinggi yang diinstal di perangkat juga harus berada dalam
sistem file ini. Hal ini dapat mencegah kerentanan keamanan yang dapat memungkinkan
penyerang mengontrol kode yang dieksekusi oleh proses dengan hak istimewa.
Membatasi akses driver perangkat
Hanya kode tepercaya yang boleh memiliki akses langsung ke driver. Jika memungkinkan, arsitektur yang lebih disukai adalah menyediakan daemon tujuan tunggal yang melakukan proxy panggilan ke driver dan membatasi akses driver ke daemon tersebut. Sebagai praktik terbaik, node perangkat driver tidak boleh dapat dibaca atau ditulis oleh semua orang. Pengujian CTS membantu menerapkan praktik terbaik ini dengan memeriksa instance driver yang terekspos yang diketahui.
Menonaktifkan ADB
Android Debug Bridge (adb) adalah alat pengembangan dan proses debug yang berharga, tetapi dirancang untuk digunakan di lingkungan yang terkontrol dan aman serta tidak boleh diaktifkan untuk penggunaan umum. Praktik terbaik:
- ADB harus dinonaktifkan secara default.
- ADB harus mewajibkan pengguna untuk mengaktifkannya sebelum menerima koneksi.
Membuka kunci bootloader
Banyak perangkat Android mendukung fitur buka kunci, yang memungkinkan pemilik perangkat mengubah
partisi sistem dan/atau menginstal sistem operasi kustom. Kasus penggunaan
umum mencakup penginstalan ROM pihak ketiga dan melakukan pengembangan
tingkat sistem di perangkat. Misalnya, pemilik perangkat Google Nexus dapat menjalankan
fastboot oem unlock
untuk memulai proses membuka kunci, yang menampilkan
pesan berikut kepada pengguna:
Buka kunci bootloader?
Jika membuka kunci bootloader, Anda akan dapat menginstal software sistem operasi kustom di perangkat ini.
OS kustom tidak dikenai pengujian yang sama dengan OS asli, dan dapat menyebabkan perangkat dan aplikasi yang diinstal berhenti berfungsi dengan baik.
Untuk mencegah akses tidak sah ke data pribadi Anda, membuka kunci bootloader juga akan menghapus semua data pribadi dari perangkat Anda ("reset data pabrik").
Tekan tombol Volume Naik/Turun untuk memilih Ya atau Tidak. Kemudian tekan tombol Daya untuk melanjutkan.
Ya: Membuka kunci bootloader (dapat membatalkan garansi)
Tidak: Jangan buka kunci bootloader dan mulai ulang perangkat.
Sebagai praktik terbaik, perangkat Android yang dapat dibuka kuncinya harus menghapus semua data pengguna dengan aman sebelum dibuka kuncinya. Kegagalan untuk menghapus semua data dengan benar saat membuka kunci dapat memungkinkan penyerang yang berada di dekat secara fisik untuk mendapatkan akses tidak sah ke data pengguna Android yang bersifat rahasia. Untuk mencegah pengungkapan data pengguna, perangkat yang mendukung fitur buka kunci harus menerapkannya dengan benar (kami telah melihat banyak kasus saat produsen perangkat menerapkan fitur buka kunci dengan tidak benar). Proses pembukaan kunci yang diterapkan dengan benar memiliki properti berikut:
- Saat perintah membuka kunci dikonfirmasi oleh pengguna, perangkat harus memulai
pembersihan total data secara langsung. Flag
unlocked
tidak boleh ditetapkan hingga penghapusan aman selesai. - Jika penghapusan aman tidak dapat diselesaikan, perangkat harus tetap dalam keadaan terkunci.
- Jika didukung oleh perangkat blok yang mendasarinya,
ioctl(BLKSECDISCARD)
atau yang setara harus digunakan. Untuk perangkat eMMC, hal ini berarti menggunakan perintah Secure Erase atau Secure Trim. Untuk eMMC 4.5 dan yang lebih baru, ini berarti menggunakan Penghapusan atau Pemangkasan normal, diikuti dengan operasi Pembersihan. - Jika
BLKSECDISCARD
tidak didukung oleh perangkat blok pokok,ioctl(BLKDISCARD)
harus digunakan sebagai gantinya. Pada perangkat eMMC, ini adalah operasi Trim normal. - Jika
BLKDISCARD
tidak didukung, menimpa perangkat blok dengan semua nol dapat diterima. - Pengguna akhir harus memiliki opsi untuk mewajibkan data pengguna dihapus sebelum
mem-flash partisi. Misalnya, di perangkat Nexus, hal ini dilakukan melalui perintah
fastboot oem lock
. - Perangkat dapat merekam, melalui efuse atau mekanisme serupa, apakah perangkat telah dibuka kuncinya dan/atau dikunci kembali.
Persyaratan ini memastikan bahwa semua data dihancurkan setelah selesai operasi buka kunci. Kegagalan dalam menerapkan perlindungan ini dianggap sebagai kerentanan keamanan tingkat sedang.
Perangkat yang dibuka kuncinya dapat dikunci kembali menggunakan
perintah fastboot oem lock
. Mengunci bootloader memberikan perlindungan
data pengguna yang sama dengan OS kustom baru seperti yang tersedia dengan
OS produsen perangkat asli (misalnya, data pengguna akan dihapus jika perangkat
dibuka kuncinya lagi).