在混合应用架构中,H5页面和Native(原生代码,如Android的Java/Kotlin、iOS的Objective-C/Swift)之间的通信是实现丰富功能的基础。然而,这个通信桥梁也是安全风险的高发区。一次专业的安全测试,为了系统性地发现并评估由此产生的安全漏洞。
一、理解通信机制:攻击面分析
在进行测试前,我们必须先了解H5和Native是如何对话的。主要的通信机制构成了我们的重要测试攻击面:
JavaScriptBridge(JSBridge):这是最主流的方式。Native端向WebView注入一个全局的JavaScript对象或方法,H5页面可以通过调用这些对象/方法,来触发Native功能。
自定义URLScheme:H5通过触发一个特殊的URL(如myapp://command?param=value),Native端监听并解析这个URL,从而执行相应操作。
WebView通道和API:在现代Android和iOS中,提供了更安全的官方通信方案,如addJavascriptInterface(配合@JavascriptInterface注解)和WKScriptMessageHandler。
所有这些机制都打破了Web原有的同源方法保护,将强大的Native能力暴露给了前端上下文。测试的目的就是验证这些暴露的接口是否被安全地设计和实现。
二、构建测试方法:重要测试点详解
一个专业的测试过程应覆盖以下八个方面:
1.接口未授权访问测试
目的:验证调用Native功能是否需要身份认证或权限校验。
方法:
在用户未登录状态下,直接通过浏览器开发者工具(DevTools)控制台,尝试调用JSBridge方法。
构造自定义URLScheme链接,在未授权App内或外部浏览器中直接打开。
攻击者可以诱导用户在任意环境中(如钓鱼邮件、恶意网站)触发链接,从而未经授权地执行敏感操作(如发送短信、读取联系人、盗取文件)。
2.参数注入测试
目的:检查Native端在处理H5传递的参数前,是否进行了充分的校验、过滤和转义。
方法:
命令注入:如果接口用于执行系统命令或启动其他App,尝试传入分隔符和恶意命令(如&、|、;)。
SQL注入:如果参数用于拼接数据库查询,传入经典的SQL注入Payload(如'OR'1'='1)。
路径遍历:如果参数用于文件操作,尝试使用../跳出限制目录(如../../sdcard/secret.txt)。
导致远程代码执行、数据库信息泄露、任意文件读写等高危漏洞。
3.敏感功能滥用测试
目的:评估暴露的Native功能是否过于强大,可能被恶意H5页面滥用。
方法:
枚举所有可用的JSBridge方法或URLScheme。
重点测试:发送短信/邮件、拨打电话、访问地理位置、读取通讯录/相册、进行网络请求、写入剪贴板、启动其他应用等。
消耗用户资费、侵犯用户隐私、进行恶意传播、窃取剪贴板中的验证码等。
4.通信链路劫持测试
目的:验证通信过程是否可能被中间人攻击。
方法:
检查App是否正确地配置了网络安全(Android的NetworkSecurityConfig,iOS的ATS),是否在校验证书时接受了自签名或无效证书。
在不安全的Wi-Fi环境下,攻击者可以窃听或篡改H5和Native之间的数据交换。
5.WebView安全配置审计
这是前端安全的基础,但直接影响通信安全。
目的:检查承载H5的WebView是否被安全地配置。
方法:
file://协议访问:是否允许H5通过file协议访问本地文件,这可能被用来窃取App私有数据。
UniversalLink/AppLink校验:对于iOS/Android的深度链接,校验逻辑是否可被绕过。
证书校验绕过:检查是否存在允许忽略SSL证书错误的危险配置。
6.接口鉴权逻辑绕过测试
目的:对于有鉴权的接口,测试其鉴权逻辑是否可被绕过。
方法:
尝试修改参数中的用户ID、Token等身份标识。
重放攻击:截获一次合法的通信请求,然后重复发送该请求,看是否依然有效。
7.回调函数安全测试
目的:Native调用H5的回调函数时,是否存在安全风险。
方法:
检查Native端在调用JavaScript回调函数时,是否对传入的参数进行了严格的类型检查和过滤,防止将不可信的数据直接传递给回调函数执行,从而避免XSS等攻击。
8.输入校验和输出编码测试
目的:综合评估通信两端的数据处理是否安全。
方法:
在H5端,测试对Native返回的数据在渲染到页面前是否进行了适当的输出编码,防止DOM型XSS。
在Native端,模拟H5端传入畸形、超长或类型错误的数据,检验Native端的健壮性,是否会因此崩溃。
三、实用测试工具和方法
静态代码分析:直接审查Native端代码(Java/Kotlin,ObjC/Swift),寻找不安全的JSBridge注入、危险的WebView配置。
动态运行时分析:
浏览器开发者工具:在App内WebView中打开调试模式,直接通过Console调用和探测JSBridge对象。
代理抓包工具(BurpSuite/Charles):拦截所有H5发起的网络请求和触发的URLScheme,便于重放和修改。
反编译和Hook框架(Frida,Xposed):对于高安全要求的场景,可以使用Frida等工具HookNative方法,动态监控、修改通信参数,深入分析逻辑。
四、开发建议
测试的目的是为了推动更安全的开发。针对H5和Native通信:
最小权限原则:只暴露必要的Native功能给H5,并且每个接口都应有明确的访问控制。
输入不可信原则:Native端必须将所有来自H5的输入视为不可信的,进行严格的校验、类型转换和过滤。
安全的默认配置:WebView应禁用不必要的能力(如file访问),并强制使用HTTPS。
通信链路加密:确保所有H5和服务器、H5和Native间的通信都使用TLS/SSL加密。
代码审查和渗透测试:将通信接口的安全审查纳入开发流程,并定期进行专业的渗透测试。
通过以上系统性的测试,可以显著提升混合应用的安全性,保护用户数据和设备资源免受恶意H5页面的侵害。