Review Android Network Security Configuration
Android Network Security Configuration adalah kebijakan XML yang digunakan network stack Android yang didukung bila manifest aplikasi merujuknya melalui android:networkSecurityConfig. Konfigurasi ini dapat menetapkan perilaku cleartext, trust anchor, aturan per domain, certificate pinning, dan trust anchor khusus debug. Ini tidak memperbaiki TrustManager kustom, perilaku WebView di luar cakupan, atau otorisasi sisi server. Validasi harus dilakukan pada APK rilis terpasang karena manifest merging dan pemilihan resource dapat berbeda dari review source.
Mulai catatan dengan package name, version code, digest signing, flavor, min dan target SDK, API level perangkat, hostname uji, penguji, serta tanggal. Ekstrak manifest dan XML efektif dari APK atau output app bundle. Inventaris seluruh HTTP client, SDK pihak ketiga, WebView, dan native library karena cakupan kebijakan dapat berbeda menurut implementasi.
Tutup secara default, buka secara sempit
Baseline rilis dapat menolak cleartext dan memakai trust anchor sistem. Konfigurasi khusus domain hanya boleh menyatakan host pengecualian. Contoh ringkas ini tidak memberi pengecualian HTTP umum:
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config>
<domain includeSubdomains="true">api.example.test</domain>
</domain-config>
</network-security-config>
Penguji harus mencoba http:// untuk tiap hostname dalam ruang lingkup dan membuktikan koneksi gagal pada rilis. usesCleartextTraffic juga relevan, tetapi perilaku efektif bergantung pada versi Android, target SDK, client stack, dan Network Security Configuration. Atribut source saja bukan bukti lengkap.
Trust anchor perlu diuji eksplisit. Set <certificates src="system" /> memakai CA sistem platform. Penambahan src="user" mengubah apakah sertifikat yang dipasang pengguna dipercaya untuk koneksi yang tercakup. Jangan menambahkannya hanya agar proxy test mudah. Bila CA private enterprise diperlukan, batasi pada domain persis, dokumentasikan pemilik dan expiry, uji hostname serta validasi chain, lalu hapus saat tidak diperlukan. Penerimaan adalah perilaku koneksi yang teramati pada build rilis, bukan tampilan XML.
Pisahkan kepercayaan debug
<debug-overrides> mengizinkan trust anchor tambahan hanya ketika android:debuggable bernilai true. Fitur ini membantu intersepsi lokal tanpa membawa trust pengujian ke produksi. Contoh:
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Periksa manifest APK debug dan rilis. Pada rilis, coba koneksi melalui proxy dengan test CA yang dipasang pengguna; hasil yang diharapkan mengikuti kebijakan trust rilis yang disetujui, tetapi debug override tidak boleh efektif karena resource debug ikut ter-merge. Simpan fingerprint sertifikat proxy, setup perangkat, hostname request, serta hasil. Gagal mengintersep bukan bukti validasi aman tanpa menguji chain kedaluwarsa, host salah, dan CA tak tepercaya bila diizinkan.
Pinning adalah komitmen ketersediaan
pin-set dapat membatasi domain ke public-key pin yang terdaftar dan mendukung expiration. Sertakan minimal satu backup pin untuk rotasi key yang direncanakan, lindungi source dan proses rilis pin, lalu lakukan latihan rotasi sebelum deploy. Nilai berikut hanya placeholder:
<domain-config>
<domain>api.example.test</domain>
<pin-set expiration="2027-01-01">
<pin digest="SHA-256">PRIMARY_BASE64_PIN</pin>
<pin digest="SHA-256">BACKUP_BASE64_PIN</pin>
</pin-set>
</domain-config>
Pinning dapat menyebabkan outage ketika sertifikat atau key berubah tak terduga; expiry juga mengubah perilaku. Maka MASVS-NETWORK-2 harus dinilai terhadap model ancaman, kepemilikan operasional, dan kemampuan pulih, bukan dipakai sebagai XML dekoratif. Uji pin utama, backup pin, pin salah, kebijakan kedaluwarsa, dan rotasi pada client representatif. Jangan memasukkan nilai pin dari artikel ini ke aplikasi.
Penerimaan rilis dan bukti
| Pemeriksaan | Artefak selesai | Pemilik | Penerimaan lulus |
|---|---|---|---|
| Keterhubungan manifest | Manifest rilis dan digest XML hasil ekstraksi. | Pemilik build | Rilis merujuk konfigurasi yang direview. |
| Cleartext | Transkrip uji HTTP untuk setiap hostname. | Pemilik jaringan | Koneksi HTTP yang tidak disetujui gagal. |
| Trust anchor | Matriks uji CA sistem, pengguna, dan private. | Pemilik Android | Hanya anchor yang disetujui dapat validasi. |
| Kebijakan debug | Perbandingan APK debug/rilis serta hasil proxy. | Pemilik rilis | Debug override tidak efektif pada rilis. |
| Pinning | Inventaris pin, latihan rotasi, kalender expiry. | Pemilik layanan | Pin wajib punya backup dan pemulihan diuji. |
| Cakupan runtime | Inventaris client/SDK dan catatan cakupan. | Pemilik engineering | Client di luar kebijakan diperbaiki atau dicatat sebagai pengecualian. |
Status lulus hanya bila artefak dan penerimaan tersedia. Gagal mencakup cleartext diterima, user/debug CA dipercaya tanpa maksud, validasi hostname dapat dilewati, atau outage pin tidak direncanakan. Belum terverifikasi bukan lulus. Pengecualian memuat host dan build terdampak, alasan, risiko data, kontrol kompensasi, pemilik, persetujuan, tanggal berakhir, serta tanggal remediasi. Perbaiki dengan menghapus trust luas, memisahkan resource per varian, mempersempit domain, membetulkan kode client, atau merencanakan rotasi pin. Build ulang dan jalankan matriks sama sebelum penutupan.
OWASP MASVS dan dokumentasi Android adalah rujukan teknis, bukan sertifikasi. Pengujian aplikasi mobile dapat memvalidasi ruang lingkup rilis yang disepakati.
Verifikasi kebijakan release efektif
Ekstrak manifest serta resource konfigurasi dari release terpasang, lalu uji endpoint HTTPS disetujui dan endpoint cleartext sengaja dari build sama. Hasil HTTPS yang diharapkan berhasil dengan sertifikat tepercaya; hasil HTTP yang diharapkan gagal karena cleartext tidak diizinkan. Ulangi dengan CA yang dipasang pengguna hanya jika kebijakan uji mengizinkan, sertifikat kedaluwarsa, dan hostname mismatch. Catat kelas URL, API level perangkat, state jaringan, kelas error, digest build, pemilik, lulus/gagal, dan expiry pengecualian. Debug override pada artefak release adalah gagal, bukan kemudahan pengujian.
Uji transport dan penutupan
Periksa merged manifest release serta networkSecurityConfig efektif, lalu uji domain diizinkan dengan sertifikat tepercaya dan tidak tepercaya. Perintah adb shell dumpsys package com.example.shop membantu menyimpan konteks package terpasang; hasil diharapkan build release merujuk kebijakan dimaksud dan cleartext tidak tersedia kecuali scope development terdokumentasi. Gunakan request sintetis, bukan kredensial produksi.
Uji HTTP, hostname mismatch, sertifikat kedaluwarsa, CA dipasang pengguna, dan redirect ke host tidak terdaftar. Hasil diharapkan adalah penolakan koneksi atau error aplikasi terkendali sebelum data sensitif dikirim. Pinning perlu rotasi: pin lama tunggal dapat membuat pembaruan sertifikat menjadi outage. Kebijakan jaringan tidak mengganti pemeriksaan identitas server atau otorisasi.
Tutup dengan hash merged manifest, XML kebijakan, perangkat/API, host diuji, output penolakan, expiry pengecualian, dan pemilik release. Buka ulang saat domain, SDK networking, target SDK, CA, atau build variant berubah.