flawopen.com/Keamanan Android WebView/addJavascriptInterface
Android addJavascriptInterface: risiko dan penggunaan aman
Anggap WebView dengan addJavascriptInterface sebagai batas berhak istimewa. Android menyuntikkan objek ke setiap frame dan aplikasi tidak dapat mengetahui frame mana yang memanggil metode. Jika JavaScript yang dikendalikan penyerang mencapai frame mana pun, JavaScript itu dapat memanggil metode yang diekspos dengan izin aplikasi. Gunakan WebView ber-bridge hanya untuk konten yang dikendalikan aplikasi, lalu muat halaman tak tepercaya di WebView terpisah tanpa bridge.
Mengapa bridge mengubah dampak XSS
Bridge memberi JavaScript titik masuk yang dapat memanggil aplikasi host. Android mengekspos objek ke semua frame, termasuk iframe, dan addJavascriptInterface tidak memeriksa origin frame pemanggil. Skrip yang disuntikkan karena itu dapat mencapai metode bridge beranotasi; kemampuannya dibatasi oleh metode tersebut dan pemeriksaan otorisasi aplikasi. Untuk aplikasi dengan target API 16 atau lebih lama, Android mendokumentasikan perilaku lama yang lebih berbahaya: semua metode publik mungkin terekspos. Mulai API 17, @JavascriptInterface diwajibkan, tetapi anotasi itu tidak membuat konten tak tepercaya menjadi aman.
Jauhkan bridge dari halaman tak tepercaya
webView.addJavascriptInterface( NativeBridge(), "Android" ) webView.loadUrl(untrustedUrl)
// WebView ini khusus untuk UI paket yang dikendalikan aplikasi. trustedWebView.settings.javaScriptEnabled = true trustedWebView.addJavascriptInterface( NativeBridge(), "Android" ) trustedWebView.loadUrl("file:///android_asset/index.html") // WebView lain menangani halaman jarak jauh atau yang dikendalikan pengguna. untrustedWebView.removeJavascriptInterface("Android") untrustedWebView.settings.javaScriptEnabled = false // Validasi HTTPS dan allowlist host yang eksplisit. untrustedWebView.loadUrl(validatedHttpsUrl)
Batas terkuat berasal dari arsitektur: jangan arahkan WebView ber-bridge ke halaman jarak jauh, buatan pengguna, atau yang dipengaruhi penyerang. Jika konten tak tepercaya harus dimuat, hapus interface sebelum pemuatan dan gunakan WebView terpisah dengan JavaScript dinonaktifkan kecuali diperlukan. Android menyatakan objek yang disuntikkan tersedia bagi semua frame dan penghapusan baru berlaku setelah pemuatan halaman berikutnya. HTTPS melindungi transport; ini tidak menjadikan host atau kontennya tepercaya. Validasi skema dan host URL, lalu buka tautan di luar allowlist melalui browser sistem. Batasi metode bridge, validasi setiap argumen, dan terapkan otorisasi di kode native alih-alih memercayai halaman pemanggil.
FAQ keamanan bridge Android WebView
Tidak. API 17+ membatasi eksposur pada metode publik beranotasi @JavascriptInterface; fitur ini tidak memeriksa origin frame pemanggil atau membuat konten yang dikendalikan penyerang menjadi tepercaya. Batasi bridge pada WebView yang hanya memuat konten kendalian aplikasi.
Referensi
- Android Developers — risiko dan mitigasi bridge native WebView
- Android Developers — referensi API WebView.addJavascriptInterface
- Android Developers — referensi API JavascriptInterface