K0D3IN/arc-browser-xss
GitHub: K0D3IN/arc-browser-xss
针对 Arc Browser for Android 的 intent:// browser_fallback_url XSS 漏洞 PoC,利用 WebView 未校验 fallback URL scheme 的缺陷实现零点击或一次点击触发 JavaScript 执行。
Stars: 0 | Forks: 0
# Arc for Android — `intent://` `browser_fallback_url` XSS
**太长不看** 点击一个链接,点击 Deny,就被黑了。或者甚至都不用点击——对话框会在页面加载时自动弹出。
Arc for Android v1.12.7。CVSS 8.8 高危。The Browser Company。
## 漏洞是什么
Arc 会打开 `intent://` 链接。如果你在“在应用中打开”对话框中点击 Deny,它会从 intent 中提取 `browser_fallback_url` 并将其塞入 `webView.loadUrl()`,而不检查它是什么 scheme。因此,你可以把 `javascript:` 放在那里,它就会执行。
这归咎于三个文件:
```
// n2.java — lets intent:// through because it's not http/https
if (scheme != null && !scheme.equals("https") && !scheme.equals("http")
&& C0560s.f1571a.b(scheme)) {
x0Var.invoke(str, string2); // → S1.java
}
// S1.java — no validation whatsoever
Intent uri = Intent.parseUri(p12, 2);
String stringExtra = uri.getStringExtra("browser_fallback_url");
if (stringExtra != null) {
p02.f(stringExtra); // webView.loadUrl("javascript:...")
}
// C0560s.java — any valid URI scheme passes
public static final x8.e f1571a = new x8.e("^[a-zA-Z][a-zA-Z0-9+.-]*");
```
`S.` 前缀很重要——`S.browser_fallback_url=...` 告诉 Android 这是一个 String extra。没有它,`Intent.parseUri` 会抛出错误,什么也不会发生。
## 如何运行它
然后在 Arc for Android 中打开以下任意一个:
### 点击变体(1 次点击 + Deny)
```
click me then hit Deny
```
### 零点击变体(无需点击链接——只需 Deny)
```
```
对话框会自动弹出。点击 Deny。JS 执行。
## 证据
| 文件 | 内容 |
|---|---|
| `evidence/01_open_in_app_dialog.png` | 本不该有危险的对话框 |
| `evidence/02_visual_proof_lime.png` | 作为纯文本的 `lime` = JS 确实执行了 |
| `evidence/03_http_callback_xss_ok.png` | 服务器直接在 Arc 的 WebView 中返回 XSS_OK |
| `evidence/04_server_log.txt` | 显示 Arc 的 Chrome UA 访问回调的服务器日志 |
| `evidence/05_poc8.html` | PoC 本身 |
| `evidence/06_poc9_zeroclick_dialog.png` | 同样的对话框,无需点击链接 |
| `evidence/07_poc9_zeroclick_xssok.png` | 没错,依然执行 |
| `evidence/08_arc_xss_proof.mp4` | 手机和服务器日志并排实时录制 |
| `evidence/09_poc9_zeroclick.html` | 零点击 PoC |
## 为什么会发布在这里
我尝试将此提交给 HackerOne。显然我的账户有 30 天的限制之类,等限制解除时,这东西可能已经被修补了。所以这里是完整的漏洞分析——比我更聪明的人可以找出修复方法或者接手继续研究。
## 攻击者可以做什么
- 窃取 cookies (`document.cookie`)
- 转储页面 DOM
- 使用覆盖层进行网络钓鱼获取凭据
- 重定向到恶意网站
- `javascript:` 在 WebView 中能做的任何事情
## 修复方案(如果 The Browser Company 的人看到了这个)
```
if (stringExtra != null
&& (stringExtra.startsWith("https://") || stringExtra.startsWith("http://"))) {
p02.f(stringExtra);
}
```
另外,也许不要让所有随机的 URI scheme 都绕过 `shouldOverrideUrlLoading`,但这由你们决定。
## 相关参考
- [Android Intent.parseUri 文档](https://developer.android.com/reference/android/content/Intent#parseUri(java.lang.String,%20int))
- CVE-2014-8910 — Chrome 曾有同样的问题
- `u6/S1.java`, `u6/n2.java`, `D6/C0560s.java`
*由 Yusuf Akhan (k0d3inon) 发现。这不算负责任的披露,因为我真的无法提交它。不客气。*
标签:JS文件枚举, 后端开发, 数据可视化