Komponen Android Exported: Worksheet Review Keamanan
android:exported menentukan apakah aplikasi lain dapat menjangkau activity, service, broadcast receiver, atau content provider. Ini adalah kontrol keterjangkauan, bukan otorisasi. Review merged manifest release, perilaku package terpasang, deklarasi permission, dan setiap operasi sensitif yang dicapai setelah input IPC. Nama komponen tersembunyi serta action tanpa dokumentasi bukan batas keamanan.
Petakan entry point
Mulai dari merged manifest release, bukan fragmen source manifest. Daftarkan jenis komponen, nama, nilai exported, intent filter, android:permission, authority provider, URI grant, dan action yang dapat dicapai. Komponen tanpa kontrak eksternal harus android:exported="false". Untuk aplikasi target Android 12 atau API level 31 ke atas, activity, service, dan receiver dengan intent filter wajib menyatakan android:exported; build gagal bila deklarasi tidak ada.
<activity android:name=".DeepLinkActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<provider android:name=".RecordsProvider"
android:authorities="com.example.app.records"
android:exported="false" />
Activity bisa perlu diexport untuk routing browser. Ini tidak membuat setiap extra, URI, ClipData, atau tujuan aman. Perlakukan input sebagai hostile, buat sesi, lalu tegakkan otorisasi pada level aksi dan objek.
Lindungi exposure yang diperlukan
Saat pemanggil eksternal memang ada, tentukan kontrak sempit dan platform permission. Proteksi signature sesuai untuk akses yang dibatasi pada aplikasi bertanda tangan sertifikat sama. Permission komponen mengurangi panggilan tidak diminta, tetapi tidak membuktikan record yang diminta milik pemanggil atau pengguna saat ini.
<permission android:name="com.example.app.ACCESS_ADMIN"
android:protectionLevel="signature" />
<service android:name=".AdminService" android:exported="true"
android:permission="com.example.app.ACCESS_ADMIN" />
Jangan andalkan satu permission aplikasi luas saat baca dan tulis memerlukan otoritas berbeda. Provider memerlukan readPermission dan writePermission terpisah bila kebijakannya beda. URI grant harus membagikan konten spesifik dalam durasi terbatas, bukan seluruh authority tanpa sengaja.
Validasi akses provider
Provider bernilai tinggi karena pemanggil dapat query, insert, update, atau delete lewat URI content://. Verifikasi android:exported, keunikan authority, permission baca/tulis, grantUriPermissions, path permission, dan cakupan URI matcher. Validasi path URI, projection, selection arguments, sort order, serta values. Jangan pernah menggabungkan selection dari pemanggil ke SQL.
adb shell content query \
--uri content://com.example.app.records/private
adb shell am start -n com.example.app/.AdminActivity \
--es operation "reset" --ei user_id 42
Jalankan command dari konteks shell tidak tepercaya atau test app terpisah. Catat versi package, API perangkat, command, respons, logcat, dan efek server. Query provider yang ditolak permission lulus hanya bila akses sah tetap berfungsi. Data sensitif kembali, write diterima, crash, atau bypass otorisasi adalah gagal.
Catatan review
| Artefak | Bukti | Pemilik | Hasil | Pengecualian | Remediasi |
|---|---|---|---|---|---|
| Manifest release | merged APK manifest | pemilik Android | lulus/gagal | handler publik terdokumentasi | nilai eksplisit |
| Komponen exported | hasil adb shell am | pemilik aplikasi | lulus/gagal | integrasi disetujui | permission dan auth |
| Provider | uji query/write content | pemilik data | lulus/gagal | sharing terbatas | default deny |
| Permission | review entitlement signed | pemilik keamanan | lulus/gagal | kontrak partner | scope signature-level |
Aturan keputusan: default komponen adalah non-exported. Export hanya entry point lintas aplikasi terdokumentasi, lindungi dengan least privilege, lalu otorisasi setiap request sensitif di komponen dan backend.
Remediasi dan uji ulang
Hapus filter serta alias tidak terpakai. Buat state exported eksplisit. Tambahkan permission sempit saat pemanggil platform memerlukan akses, lalu validasi input dan kepemilikan server tanpa bergantung pada hasil permission. Uji seluruh versi Android yang didukung karena perilaku dan penegakan saat instalasi berbeda menurut target SDK. Pengujian mobile dapat membandingkan manifest APK, permukaan IPC, akses provider, dan bukti runtime.
Disiplin bukti
Simpan bukti review: merged manifest, target SDK, nomor build, nama komponen, nilai exported, definisi permission, command pemanggil, API perangkat, respons yang diamati, referensi logcat, pemilik, hasil, pengecualian, dan tenggat remediasi. Ulangi pengujian setelah perubahan manifest merge karena manifest library dapat menambah filter atau provider. Integrasi eksternal terdokumentasi tetap gagal sampai permission, pemeriksaan input, otorisasi objek, dan uji negatif semuanya lulus.
Matriks negatif adb dan penutupan
Inventaris activity, service, receiver, dan provider exported dari merged manifest release. Uji tiap entry dari pemanggil tanpa permission aplikasi. Untuk activity gunakan adb shell am start -W -n com.example.shop/.AdminActivity; hasil diharapkan security denial atau layar publik aman, bukan data administratif. Untuk service gunakan adb shell am startservice -n com.example.shop/.SyncService; hasil diharapkan penolakan jika service bukan publik. Untuk provider gunakan adb shell content query --uri content://com.example.shop.provider/private; hasil diharapkan permission denial atau tidak ada row dapat diakses. Simpan command, teks keluar, build, dan API perangkat per baris.
Kasus tepi: component exported mungkin untuk integrasi sistem atau partner. Batasi dengan signature-level permission, action intent sempit, identitas caller tervalidasi, dan kontrak data eksplisit; perbandingan package name saja bukan batas otorisasi andal. Component non-exported masih dapat terjangkau tidak langsung lewat relay exported, sehingga trace intent forwarding dan URI grant.
Tutup matriks saat setiap component memiliki bukti manifest, hasil negatif, pemilik pengecualian, dan pemicu retest. Jalankan ulang setelah update library, perubahan manifest merge, provider baru, atau target SDK berubah. Catat juga apakah pengujian memakai shell, aplikasi uji, atau akun sistem, karena konteks pemanggil dapat mengubah hasil.
Sources
- Android 12: exported components
- Android: provider manifest element
- OWASP MASTG: Restrict Android App Components
Validasi penutupan komponen Android
Untuk receiver Android yang diekspor, uji pemanggilan dari aplikasi tanpa izin dan dari aplikasi yang memegang izin yang benar. Rekam deklarasi manifest, identitas pemanggil, izin yang dievaluasi, hasil komponen, dan versi APK. Jika izin, exported, atau filter intent berubah, ulangi pengujian terhadap activity, service, receiver, atau provider terkait agar jalur antaraplikasi tidak terbuka kembali.