← 返回首页

📄 AlipayWallet RPC 漏洞报告

二进制逆向分析 · btalipay.com 域名绕过验证

概述

通过对 AlipayWallet iOS 二进制的静态逆向分析,发现 RPC 调用的域名验证机制存在多个漏洞。 攻击者通过注册包含 "alipay.com" 子串的域名(如 btalipay.com),可绕过域名白名单验证, 在非授权域名下执行 RPC 调用,获取用户敏感信息或执行敏感操作。

🔴 CRITICAL 漏洞

V1CRITICAL
isDomainValid 子串匹配绕过
函数: -[RVSTinyappJsPermissionManager isDomainValid:domain:isCheck4Request:] (0x102f22df4)

该函数使用 rangeOfString: 进行域名验证,这是子串匹配而非精确匹配。 攻击者注册 btalipay.com 域名,该域名包含 "alipay.com" 子串, "btalipay.com".rangeOfString("alipay.com") 返回 {2, 10}(有效范围),验证通过。
// 伪代码 (IDA反编译) NSRange range = [domain rangeOfString:validDomain]; if (range.location != NSNotFound) { return YES; // ← btalipay.com 包含 alipay.com, 返回YES }
影响: 小程序环境下完全绕过域名验证,可调用所有受保护 JSAPI。
V2CRITICAL
aliWhitelist 正则缺少锚定符
位置: sub_1072F858C + sub_1072F9C20

aliWhitelist (level_medium 安全等级) 的默认正则:
(.*\.)?(taobao|tmall|...|alipay|...)\.(com|cn|net|hk)$
该正则 缺少 ^ 锚定符,且通过 rangeOfString:options:NSRegularExpressionSearch 匹配。
输入 https://btalipay.com,正则引擎会在字符串中搜索匹配子串: "btalipay.com""alipay.com" 匹配 (alipay)\.(com)$

影响: 所有 level_medium 安全等级的 JSAPI 可从 btalipay.com 调用。

🟠 HIGH 漏洞

V4HIGH
seriousAliWhitelist 允许 HTTP 协议
^http(s)?\\:\\/\\/.*[.](taobao|alitrip|1688)[.]com$
允许 HTTP 明文连接 → 中间人攻击可注入恶意代码。
V6HIGH
TinyApp RPC 传入 nil URL 参数
TAJsApiHandler4TinyRpc 调用 hasPermissionWithjsapiName:data:url: 时传入 0 (nil) 作为 URL, 可能导致 URL 校验被跳过。
V7HIGH
DTRpcAuthInterceptor containsString 匹配
RPC 授权拦截器使用 containsString: 匹配白名单 operationType, 可能被构造包含白名单子串的 operationType 绕过。

白名单正则对照表

白名单 安全等级 正则 btalipay.com 匹配?
rpcWhitelist RPC专用 ^https:\\/\\/.*[.]alipay[.]com$ ❌ 不匹配 (要求.alipay)
alipayWhitelist level_high ^https:\\/\\/.*[.]alipay[.](com|net)$ ❌ 不匹配
seriousAliWhitelist level_abovemedium ^https:\\/\\/.*[.](taobao|...)[.]com$ ❌ 不匹配
aliWhitelist level_medium (.*\\.)?(alipay)\\.(com)$ (无^) ✅ 匹配!
partnerWhitelist level_low (.*\\.)?(weibo)\\.(com)$ ❌ 不匹配
isDomainValid 小程序 rangeOfString: (子串) ✅ 匹配!

攻击链

受害者点击链接 ↓ alipays://platformapi/startapp?appId=20000067&url=https://btalipay.com/rpc-poc.html ↓ 支付宝打开 H5 容器,加载 btalipay.com ↓ JS 评估 document.location.href → "https://btalipay.com/rpc-poc.html" ↓ 域名验证: aliWhitelist 正则匹配 "alipay.com" 子串 → 通过 ✅ ↓ AlipayJSBridge.call("rpc", {operationType: "xxx"}, callback) ↓ H5RPCCaller 发起 RPC 请求到 mgw.alipay.com → 携带用户 Session ↓ RPC 结果返回给攻击者页面 → 外传数据
⚠️ 本报告仅供安全研究使用 · 请负责任地披露漏洞