Webview Attacks

Support HackTricks

Guide on WebView Configurations and Security

Overview of WebView Vulnerabilities

안드로이드 개발의 중요한 측면은 WebView의 올바른 처리입니다. 이 가이드는 WebView 사용과 관련된 위험을 완화하기 위한 주요 구성 및 보안 관행을 강조합니다.

File Access in WebViews

기본적으로 WebView는 파일 접근을 허용합니다. 이 기능은 Android API 레벨 3(Cupcake 1.5)부터 사용할 수 있는 setAllowFileAccess() 메서드로 제어됩니다. android.permission.READ_EXTERNAL_STORAGE 권한이 있는 애플리케이션은 파일 URL 스킴(file://path/to/file)을 사용하여 외부 저장소에서 파일을 읽을 수 있습니다.

Deprecated Features: Universal and File Access From URLs

  • Universal Access From File URLs: 이 사용 중단된 기능은 파일 URL에서 교차 출처 요청을 허용하여 잠재적인 XSS 공격으로 인한 상당한 보안 위험을 초래했습니다. 기본 설정은 Android Jelly Bean 및 이후 버전을 대상으로 하는 앱에 대해 비활성화(false)되어 있습니다.

  • 이 설정을 확인하려면 getAllowUniversalAccessFromFileURLs()를 사용하십시오.

  • 이 설정을 수정하려면 setAllowUniversalAccessFromFileURLs(boolean)를 사용하십시오.

  • File Access From File URLs: 이 기능도 사용 중단되었으며, 다른 파일 스킴 URL에서 콘텐츠에 대한 접근을 제어했습니다. 유니버설 접근과 마찬가지로 기본값은 보안을 강화하기 위해 비활성화되어 있습니다.

  • 확인하려면 getAllowFileAccessFromFileURLs()를 사용하고 설정하려면 setAllowFileAccessFromFileURLs(boolean)를 사용하십시오.

Secure File Loading

자산 및 리소스에 접근하면서 파일 시스템 접근을 비활성화하려면 setAllowFileAccess() 메서드를 사용합니다. Android R 이상에서는 기본 설정이 false입니다.

  • getAllowFileAccess()로 확인하십시오.

  • setAllowFileAccess(boolean)로 활성화 또는 비활성화하십시오.

WebViewAssetLoader

WebViewAssetLoader 클래스는 로컬 파일을 로드하기 위한 현대적인 접근 방식입니다. 이는 로컬 자산 및 리소스에 접근하기 위해 http(s) URL을 사용하며, 동일 출처 정책에 맞춰 CORS 관리를 용이하게 합니다.

loadUrl

이것은 웹뷰에서 임의의 URL을 로드하는 데 사용되는 일반적인 함수입니다:

webview.loadUrl("<url here>")

물론, 잠재적인 공격자는 애플리케이션이 로드할 URL을 절대 제어할 수 없어야 합니다.

JavaScript 및 Intent Scheme 처리

  • JavaScript: WebViews에서 기본적으로 비활성화되어 있으며, setJavaScriptEnabled()를 통해 활성화할 수 있습니다. 적절한 안전 장치 없이 JavaScript를 활성화하면 보안 취약점이 발생할 수 있으므로 주의가 필요합니다.

  • Intent Scheme: WebViews는 intent 스킴을 처리할 수 있으며, 신중하게 관리하지 않으면 악용될 수 있습니다. 예를 들어, 노출된 WebView 매개변수 "support_url"이 XSS 공격을 실행하는 데 악용될 수 있는 취약점이 있었습니다.

adb를 사용한 악용 예시:

adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

Android는 JavaScript가 WebView에서 네이티브 Android 앱 기능을 호출할 수 있도록 하는 기능을 제공합니다. 이는 addJavascriptInterface 메서드를 활용하여 JavaScript와 네이티브 Android 기능을 통합함으로써 이루어지며, 이를 _WebView JavaScript bridge_라고 합니다. 이 메서드는 WebView 내의 모든 페이지가 등록된 JavaScript Interface 객체에 접근할 수 있도록 하므로, 이러한 인터페이스를 통해 민감한 정보가 노출될 경우 보안 위험이 발생할 수 있으므로 주의가 필요합니다.

  • Android 4.2 이하 버전을 타겟으로 하는 앱은 극도의 주의가 필요합니다. 이는 악성 JavaScript를 통해 원격 코드 실행을 허용하는 취약점이 존재하기 때문입니다.

JavaScript Bridge 구현하기

  • JavaScript 인터페이스는 네이티브 코드와 상호작용할 수 있으며, 클래스 메서드가 JavaScript에 노출되는 예시에서 볼 수 있습니다:

@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge는 WebView에 인터페이스를 추가하여 활성화됩니다:

webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • JavaScript를 통한 잠재적 악용, 예를 들어 XSS 공격을 통해 노출된 Java 메서드를 호출할 수 있습니다:

<script>alert(javascriptBridge.getSecret());</script>
  • 위험을 완화하기 위해, JavaScript 브리지 사용을 APK와 함께 제공된 코드로 제한하고 원격 소스에서 JavaScript 로딩을 방지하십시오. 구형 장치의 경우 최소 API 수준을 17로 설정하십시오.

리플렉션 기반 원격 코드 실행 (RCE)

  • 문서화된 방법을 통해 특정 페이로드를 실행하여 RCE를 달성할 수 있습니다. 그러나 @JavascriptInterface 주석은 무단 메서드 접근을 방지하여 공격 표면을 제한합니다.

원격 디버깅

  • 원격 디버깅Chrome 개발자 도구를 사용하여 가능하며, WebView 콘텐츠 내에서 상호작용 및 임의의 JavaScript 실행을 가능하게 합니다.

원격 디버깅 활성화

  • 원격 디버깅은 다음을 통해 애플리케이션 내 모든 WebView에 대해 활성화할 수 있습니다:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • 애플리케이션의 디버깅 가능 상태에 따라 디버깅을 조건부로 활성화하려면:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

임의 파일 추출

  • XMLHttpRequest를 사용하여 임의 파일의 추출을 시연합니다:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);

References

HackTricks 지원하기

Last updated