OWASP 카테고리: MASVS-CODE: 코드 품질
개요
WebView는 Android 애플리케이션에 삽입된 브라우저 구성요소로, 앱 내에서 웹 콘텐츠의 표시를 용이하게 합니다. 앱의 사용자 인터페이스 내에서 HTML, CSS, JavaScript를 렌더링합니다.
교차 앱 스크립팅은 피해자 애플리케이션 컨텍스트에서 악성 코드 실행과 광범위하게 관련되어 있습니다. 이 문서에서는 주제가 취약한 WebView에 악성 JavaScript 코드를 삽입하는 것으로 구체적으로 제한됩니다.
앱이 충분한 유효성 검사나 정리 없이 WebView에서 악성 JavaScript를 허용하면 애플리케이션이 교차 앱 스크립팅에 취약해집니다.
영향
교차 앱 스크립팅 취약점은 공격자가 제어하는 JavaScript 콘텐츠가 검증되거나 정리되지 않은 상태로 취약한 앱의 WebView에 전달될 때 악용될 수 있습니다. 따라서 공격자가 제공한 JavaScript 코드가 피해자 애플리케이션의 WebView 컨텍스트에서 실행됩니다. 그러면 악성 JavaScript 코드가 피해자 앱과 동일한 권한을 사용할 수 있으므로 민감한 사용자 데이터가 도용되고 계정이 도용될 수 있습니다.
완화 조치
자바스크립트 사용 중지
애플리케이션에 JavaScript가 필요하지 않은 경우 JavaScript를 사용 중지하면 위협이 되지 않습니다.
Kotlin
// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings
// Disable JavaScript
webSettings.javaScriptEnabled = false
자바
// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);
애플리케이션에 JavaScript가 필요한 경우 WebView에 전달된 JavaScript를 소유하거나 제어해야 합니다. WebView가 임의의 JavaScript를 실행하도록 허용하지 마세요. 다음 섹션의 안내를 참고하세요.
예상된 콘텐츠만 WebView에 로드되도록 확인
shouldOverrideUrlLoading(), loadUrl() 또는 evaluateJavascript(),과 같은 메서드를 사용하는 경우 메서드에 전달된 URL이 확인되었는지 확인하세요. 앞서 언급했듯이 WebView에 전달되는 JavaScript는 예상 도메인에서만 제공되어야 하므로 로드되는 항목을 확인하는 것이 중요합니다.
OWASP의 입력 유효성 검사 문서와 이 Android 보안 WebView 체크리스트에서 유용한 조언과 예시를 확인하세요.
WebView의 보안 파일 액세스 설정
파일에 액세스할 수 없도록 하면 WebView 내에서 임의의 JavaScript가 실행되지 않도록 할 수 있습니다. 파일 액세스를 보호할 때는 다음 WebSettings를 고려해야 합니다.
- 파일 액세스를 사용 중지합니다. 기본적으로
setAllowFileAccess은 API 수준 29 이하에서True로 설정되어 로컬 파일에 대한 액세스를 허용합니다. API 수준 30 이상에서는 기본값이False입니다. 파일 액세스가 허용되지 않도록 하려면setAllowFileAccess을False로 명시적으로 설정하세요. 콘텐츠 액세스를 사용 중지합니다.
setAllowContentAccess의 기본 설정은True입니다. 콘텐츠 URL 액세스를 통해 WebView는 시스템에 설치된 콘텐츠 제공업체에서 콘텐츠를 로드할 수 있습니다. 앱에 콘텐츠 액세스가 필요하지 않은 경우setAllowContentAccess을False로 설정하여 교차 앱 스크립팅 공격 시 잠재적인 오용을 방지하세요.kotlin
kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = falsejava
java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);
세이프 브라우징 사용
AndroidManifest.xml에서 세이프 브라우징을 사용 설정하여 WebView에 전달된 URL에서 피싱 또는 악성 도메인을 검사합니다.
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
리소스
- 세이프 브라우징 문서
- WebView 개발자 참조
- WebView 개발자 참조용 WebSettings
- setAllowFileAccess 개발자 문서
- setAllowContentAccess 개발자 참조