OWASP 카테고리: MASVS-CODE: 코드 품질
개요
WebView는 Android 애플리케이션에 내장된 브라우저 구성요소로, 앱 내에 웹 콘텐츠를 표시하도록 용이하게 합니다. HTML, CSS 및 JavaScript를 사용하여 상속할 수 있습니다.
교차 앱 스크립팅은 악성 코드의 실행과 광범위하게 관련되어 있습니다. 희생자 애플리케이션의 맥락에서 일어납니다 이 문서의 목적상 이 주제는 악성 JavaScript 코드를 취약한 WebView에 삽입하는 것으로 제한됩니다.
앱이 충분한 유효성 검사나 정리 없이 악성 JavaScript를 WebView에 허용하면 애플리케이션이 교차 앱 스크립팅에 취약해집니다.
영향
교차 앱 스크립팅 취약점은 공격자가 제어하는 JavaScript 콘텐츠가 검증 또는 정리되지 않고 취약한 앱의 WebView에 전달될 때 악용될 수 있습니다. 따라서 피해 애플리케이션의 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가 필요한 경우 JavaScript가 WebView에 전달됩니다. WebView에서 임의의 실행을 허용하지 않음 다음 섹션의 안내를 참고하세요.
예상 콘텐츠만 WebView에 로드되는지 확인
shouldOverrideUrlLoading()
, loadUrl()
또는 evaluateJavascript()
,
와 같은 메서드를 사용할 때는 전달된 URL이 확인되었는지 확인합니다. 앞서 언급했듯이 WebView에 전달되는 모든 JavaScript는
예상한 도메인에서 비롯되므로 로드 중인 것을 확인하는 것이 중요합니다.
OWASP의 입력 유효성 검사 문서 및 이 Android WebView의 보안 체크리스트를 참조하세요.
WebView의 보안 파일 액세스 설정 지정
파일에 액세스할 수 없게 하면 임의의 JavaScript에서
WebView 내에서 실행됩니다.다음 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 = false
자바
java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);
세이프 브라우징 사용
AndroidManifest.xml
에서 세이프 브라우징을 사용 설정하여 다음 주소로 전달된 URL을 스캔하세요.
피싱 또는 악성 도메인용 WebView:
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="true" />
리소스
- 세이프 브라우징 문서
- WebView 개발자 참조
- WebView 개발자 참조용 WebSettings
- setAllowFileAccess 개발자 문서
- setAllowContentAccess 개발자 참조