通过对 AlipayWallet iOS 二进制的静态逆向分析,发现 RPC 调用的域名验证机制存在多个漏洞。 攻击者通过注册包含 "alipay.com" 子串的域名(如 btalipay.com),可绕过域名白名单验证, 在非授权域名下执行 RPC 调用,获取用户敏感信息或执行敏感操作。
-[RVSTinyappJsPermissionManager isDomainValid:domain:isCheck4Request:]
(0x102f22df4)rangeOfString: 进行域名验证,这是子串匹配而非精确匹配。
攻击者注册 btalipay.com 域名,该域名包含 "alipay.com" 子串,
"btalipay.com".rangeOfString("alipay.com") 返回 {2, 10}(有效范围),验证通过。
sub_1072F858C + sub_1072F9C20^ 锚定符,且通过
rangeOfString:options:NSRegularExpressionSearch 匹配。https://btalipay.com,正则引擎会在字符串中搜索匹配子串:
"btalipay.com" 中 "alipay.com" 匹配 (alipay)\.(com)$。level_medium 安全等级的 JSAPI 可从 btalipay.com 调用。
TAJsApiHandler4TinyRpc 调用 hasPermissionWithjsapiName:data:url: 时传入 0 (nil) 作为
URL,
可能导致 URL 校验被跳过。
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: (子串) |
✅ 匹配! |