교차 앱 스크립팅

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입니다. 파일 액세스가 허용되지 않도록 하려면 명시적으로 setAllowFileAccessFalse로 설정
  • 콘텐츠 액세스를 사용 중지합니다. setAllowContentAccess의 기본 설정은 True입니다. 콘텐츠 URL 액세스를 사용하면 WebView가 시스템에 설치된 콘텐츠 제공업체에서 콘텐츠를 로드할 수 있습니다. 앱에 콘텐츠 액세스가 필요하지 않은 경우 장애 발생 시 잠재적인 오용을 방지하기 위해 setAllowContentAccessFalse로 교차 앱 스크립팅 공격

  • 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" />

리소스