Semua artikel
// Artikel

Review Permission Mobile dan Privacy Manifest

Dipublikasikan 14 Juli 2026

Permission, entitlement, dan deklarasi privasi adalah klaim yang dapat dieksekusi. Ketiganya menyatakan kemampuan perangkat yang dapat diminta aplikasi, kemampuan bertanda tangan yang dimiliki, serta pengumpulan data atau penggunaan API yang dideklarasikan. Review harus melihat ketiganya bersama. Prompt runtime yang baik tidak memperbaiki manifest Android terlalu luas; manifest yang benar tidak memperbaiki privacy manifest iOS yang menghilangkan pengumpulan oleh SDK.

OWASP MASVS-PRIVACY menganggap pengelolaan permission dan deklarasi pengumpulan yang tidak memadai sebagai masalah keamanan. Mulai dari tujuan fitur, bukan daftar API yang tersedia. Bila tidak ada fitur saat ini yang memerlukan kemampuan, hilangkan dari input build.

Jadikan pemetaan tujuan sebagai bukti rilis

Buat register kemampuan sebelum rilis. Setiap baris membutuhkan satu owner dan hasil yang dapat diuji.

KemampuanTindakan pengguna dan tujuanDeklarasi platformOwnerLulus / gagal
Kamerapengguna menekan “scan dokumen”android.permission.CAMERA; usage text kamera iOSowner scanlulus: prompt setelah tap; gagal: diminta saat launch
Lokasi perkiraanpengguna memilih hasil terdekatpermission lokasi Android; usage text lokasi iOSowner discoverylulus: opsi kasar bekerja; gagal: lokasi presisi dipaksa tanpa kebutuhan
Notifikasipengguna mengaktifkan alertpermission notifikasi runtime Android bila berlaku; entitlement APNsowner messaginglulus: aplikasi berjalan setelah ditolak; gagal: prompt menghalangi penggunaan awal
Kontakpengguna memilih impordeklarasi hanya pada build dengan fitur imporowner identitaslulus: tidak ada request sebelum impor; gagal: SDK menambahnya diam-diam

Petakan aliran data juga: sumber, penggunaan di perangkat, penerima server, owner retensi, dan disclosure publik. “SDK membutuhkannya” adalah bukti untuk diperiksa, bukan persetujuan permission.

Android: minimalkan deklarasi dan minta saat runtime

Android membedakan permission normal dan dangerous; permission dangerous perlu penanganan runtime pada versi Android yang didukung. Deklarasi pada AndroidManifest.xml tidak memberikan izin. Minta hanya saat pengguna memulai fitur, jelaskan manfaat pada UI bila konteks diperlukan, dan perlakukan penolakan sebagai state yang didukung.

<!-- AndroidManifest.xml: kamera hanya ada untuk scan dokumen -->
<uses-permission android:name="android.permission.CAMERA" />
if (hasCameraPermission()) openScanner()
else requestCameraPermission() // dipanggil dari tombol scan, bukan startup

Jaga variant tetap jujur. Flavor tanpa scan tidak boleh mewarisi permission kamera lewat manifest merge. Inspeksi merged manifest dan APK/AAB final, bukan hanya source manifest. Hapus permission dari library yang tidak dipakai, atau konfigurasi/ganti library setelah dampak fitur diverifikasi. Jangan meminta background location, storage luas, kontak, mikrofon, atau accessibility hanya karena mungkin berguna nanti.

Uji grant, deny, deny permanen, cabut dari pengaturan sistem, pemilihan media parsial bila relevan, restart proses, dan upgrade. Lulus bila fitur menurun dengan jelas dan aman. Gagal bila penolakan menyebabkan crash, prompt berulang, UI tak terkait terblokir, atau pengumpulan data tetap berjalan.

Apple: usage string, entitlement, privacy manifest

Usage description iOS menjelaskan alasan data terlindungi diminta; kalimat harus sesuai fitur sebenarnya. Entitlement adalah kemampuan bertanda tangan dan perlu review terpisah. Hapus app group, associated domain, background mode, push, Keychain sharing, atau capability lain yang tidak dipakai; jangan mengandalkan runtime code yang kebetulan tidak memanggilnya.

Apple mendokumentasikan PrivacyInfo.xcprivacy sebagai property-list untuk data yang dikumpulkan, tracking domain bila tracking berlaku, dan required-reason API. Masukkan ke target resources. Review manifest aplikasi dan SDK pihak ketiga; cocokkan dengan kode, perilaku jaringan, dan App Store privacy disclosure. Jangan mengarang kode alasan: pilih nilai alasan yang didokumentasikan Apple dan berlaku bagi penggunaan nyata.

<!-- PrivacyInfo.xcprivacy: root key minimal sebagai ilustrasi -->
<dict>
  <key>NSPrivacyTracking</key><false/>
  <key>NSPrivacyCollectedDataTypes</key><array/>
  <key>NSPrivacyAccessedAPITypes</key><array/>
</dict>

Array kosong benar hanya bila audit memastikan tidak ada data collection atau required-reason API. Snippet ini menunjukkan struktur, bukan konten universal. Tambahkan deklarasi dari perilaku aplikasi dan SDK, lalu pastikan file masuk target rilis.

Gate, pengecualian, perbaikan

Owner fitur menulis tujuan; owner Android/iOS membuktikan konfigurasi package; owner privasi mencocokkan deklarasi data; owner rilis menerima bukti. Bukti: register tujuan, merged Android manifest, entitlement iOS bertanda tangan, PrivacyInfo.xcprivacy, inventaris SDK, capture runtime dengan data sintetis, serta hasil uji jalur penolakan.

Lulus bila setiap deklarasi memetakan fitur saat ini, waktu request menjelaskan tujuan, opsi least privilege bekerja, penolakan aman, dan deklarasi iOS cocok dengan bukti build. Gagal bila permission/entitlement tak terpakai masih ada, perilaku SDK tanpa owner, privacy manifest hilang atau tidak terbawa bundle, atau disclosure publik bertentangan dengan alur teruji. Pengecualian membutuhkan fitur bernama, build terdampak, owner risiko, masa berlaku, kontrol kompensasi, dan tanggal penghapusan. Perbaiki dengan menghapus deklarasi, mempersempit cakupan atau presisi, memindahkan request ke tindakan pengguna, memperbaiki penanganan penolakan, memperbarui manifest/disclosure, lalu build ulang dan retest artefak final.

Pengujian aplikasi mobile dapat membandingkan package rilis dengan bukti ini.

Kasus kerja: izin lokasi ditolak

Pasang build baru, tolak izin lokasi presisi dan perkiraan, lalu jalankan semua layar yang menawarkan hasil terdekat. Output yang diharapkan adalah layar tetap dapat dipakai dengan penjelasan jelas, tanpa loop request latar belakang, crash, atau fallback diam-diam ke koordinat cache lama. Periksa trace jaringan sebelum dan sesudah penolakan; request harus menghilangkan nilai yang tidak tersedia, bukan menggantinya dengan default buatan. Beri izin perkiraan, ulangi, dan pastikan UI tidak menyebut hasil sebagai presisi. Bukti penutupan memasangkan screenshot state izin dengan capture skema request serta keputusan produk tentang perilaku degradasi.

Uji tepi sebelum penutupan

Cabut izin saat aplikasi di foreground, upgrade dari versi lama, dan pilih “jangan tanya lagi” bila platform menyediakannya. Pastikan alasan runtime menunjuk fitur saat ini, bukan bahasa pengumpulan generik. Jalankan alur sama melalui salinan Indonesia; penjelasan native wajib menjaga pilihan serta akibatnya. Tutup setelah owner uji mencatat hash build, OS perangkat, state izin, output teramati, dan owner perbaikan untuk layar yang berbeda.

Sources

Punya sistem yang perlu diuji?