Semua artikel
// Artikel

Komponen Android Exported: Worksheet Review Keamanan

Dipublikasikan 9 Juli 2026

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

ArtefakBuktiPemilikHasilPengecualianRemediasi
Manifest releasemerged APK manifestpemilik Androidlulus/gagalhandler publik terdokumentasinilai eksplisit
Komponen exportedhasil adb shell ampemilik aplikasilulus/gagalintegrasi disetujuipermission dan auth
Provideruji query/write contentpemilik datalulus/gagalsharing terbatasdefault deny
Permissionreview entitlement signedpemilik keamananlulus/gagalkontrak partnerscope 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

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.

Punya sistem yang perlu diuji?