flawopen.com/Android WebView 보안/addJavascriptInterface
Android addJavascriptInterface: 위험과 안전한 사용법
addJavascriptInterface가 설정된 WebView는 권한 경계로 취급하세요. Android는 객체를 모든 frame에 주입하며 앱은 어떤 frame이 메서드를 호출했는지 확인할 수 없습니다. 공격자가 제어하는 JavaScript가 frame에 도달하면 앱 권한으로 노출된 메서드를 호출할 수 있습니다. 브리지가 있는 WebView에는 앱이 관리하는 콘텐츠만 로드하고, 신뢰할 수 없는 페이지는 브리지 없는 별도 WebView에서 여세요.
브리지가 XSS의 영향을 키우는 이유
브리지는 JavaScript에 호스트 앱을 호출할 진입점을 제공합니다. Android는 iframe을 포함한 모든 frame에 객체를 노출하며 addJavascriptInterface는 호출 frame의 출처를 확인하지 않습니다. 따라서 주입된 스크립트가 어노테이션이 붙은 메서드를 호출할 수 있습니다. 가능한 작업은 해당 메서드와 앱의 권한 검사에 달려 있습니다. target API 16 이하 앱에서는 모든 public 메서드가 노출될 수 있는 더 심각한 이전 동작을 Android가 설명합니다. API 17부터 @JavascriptInterface가 필요하지만, 이 어노테이션이 신뢰할 수 없는 콘텐츠를 안전하게 만들지는 않습니다.
신뢰할 수 없는 페이지와 브리지를 분리하세요
webView.addJavascriptInterface( NativeBridge(), "Android" ) webView.loadUrl(untrustedUrl)
// 이 WebView는 앱이 관리하는 패키지 UI 전용입니다. trustedWebView.settings.javaScriptEnabled = true trustedWebView.addJavascriptInterface( NativeBridge(), "Android" ) trustedWebView.loadUrl("file:///android_asset/index.html") // 별도 WebView가 원격 또는 사용자 제어 페이지를 처리합니다. untrustedWebView.removeJavascriptInterface("Android") untrustedWebView.settings.javaScriptEnabled = false // HTTPS와 명시적 호스트 allowlist를 검증하세요. untrustedWebView.loadUrl(validatedHttpsUrl)
가장 강력한 경계는 아키텍처입니다. 브리지가 있는 WebView를 원격, 사용자 생성 또는 공격자 영향을 받는 페이지로 이동시키지 마세요. 비신뢰 콘텐츠를 불가피하게 로드해야 한다면 로드 전에 인터페이스를 제거하고, 필요하지 않은 한 JavaScript가 비활성화된 별도 WebView를 사용하세요. Android에 따르면 주입 객체는 모든 frame에서 사용할 수 있고 제거는 다음 페이지 로드 후 적용됩니다. HTTPS는 전송을 보호할 뿐 호스트나 콘텐츠를 신뢰하게 만들지는 않습니다. URL의 scheme과 host를 확인하고 허용 목록 밖의 링크는 시스템 브라우저에서 여세요. 브리지 메서드를 최소화하고 모든 인수를 검증하며 호출 페이지를 신뢰하지 말고 네이티브 코드에서 권한을 검사하세요.
Android WebView 브리지 보안 FAQ
아니요. API 17+는 @JavascriptInterface가 붙은 public 메서드만 노출하지만 호출 frame의 출처를 확인하지 않으며 공격자 제어 콘텐츠를 신뢰할 수 있게 만들지도 않습니다. 앱이 관리하는 콘텐츠만 로드하는 WebView에 브리지를 한정하세요.