Webview Attacks

Reading time: 5 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기

Guide on WebView Configurations and Security

Overview of WebView Vulnerabilities

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

WebView Example

File Access in WebViews

기본적으로 WebViews는 파일 접근을 허용합니다. 이 기능은 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을 로드하는 데 사용되는 일반적인 함수입니다:

java
webview.loadUrl("<url here>")

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

JavaScript 및 Intent 스킴 처리

  • JavaScript: WebViews에서 기본적으로 비활성화되어 있으며, setJavaScriptEnabled()를 통해 활성화할 수 있습니다. 적절한 안전 장치 없이 JavaScript를 활성화하면 보안 취약점이 발생할 수 있으므로 주의가 필요합니다.
  • Intent 스킴: WebViews는 intent 스킴을 처리할 수 있으며, 신중하게 관리하지 않으면 악용될 수 있습니다. 한 예로, "support_url"이라는 노출된 WebView 매개변수가 XSS 공격을 실행하는 데 악용될 수 있는 취약점이 있었습니다.

Vulnerable WebView

adb를 사용한 악용 예:

bash
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 객체에 접근할 수 있도록 하므로, 이러한 인터페이스를 통해 민감한 정보가 노출될 경우 보안 위험이 발생할 수 있으므로 주의가 필요합니다.

  • Extreme caution is required for apps targeting Android versions below 4.2 due to a vulnerability allowing remote code execution through malicious JavaScript, exploiting reflection.

Implementing a JavaScript Bridge

  • JavaScript interfaces can interact with native code, as shown in the examples where a class method is exposed to JavaScript:
javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Bridge는 WebView에 인터페이스를 추가하여 활성화됩니다:
javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
  • JavaScript를 통한 잠재적 악용, 예를 들어 XSS 공격을 통해 노출된 Java 메서드를 호출할 수 있습니다:
html
<script>
alert(javascriptBridge.getSecret())
</script>
  • 위험을 완화하기 위해, JavaScript 브리지 사용을 APK와 함께 제공된 코드로 제한하고 원격 소스에서 JavaScript 로딩을 방지하십시오. 구형 장치의 경우 최소 API 수준을 17로 설정하십시오.

반사 기반 원격 코드 실행 (RCE)

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

원격 디버깅

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

원격 디버깅 활성화

  • 원격 디버깅은 애플리케이션 내의 모든 WebView에 대해 활성화할 수 있습니다:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
  • 애플리케이션의 디버깅 가능 상태에 따라 조건부로 디버깅을 활성화하려면:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

임의 파일 유출

  • XMLHttpRequest를 사용하여 임의 파일의 유출을 시연합니다:
javascript
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)

참고문헌

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기