l0lsec/CVE-2026-12960

GitHub: l0lsec/CVE-2026-12960

针对华硕路由器 Android 应用中不当导出组件漏洞(CVE-2026-12960)的完整概念验证仓库,包含技术分析、PoC 代码、利用 APK 及厂商披露报告。

Stars: 0 | Forks: 0

# CVE-2026-12960 **ASUS Router App 中 Android 应用组件的不当导出** ASUS Router Android 应用 (`com.asus.aihome`) 中内置的一个组件被声明为 `android:exported="true"` 且未设置 `android:permission`。同一设备上的任何其他 应用,即使没有任何权限,也可以向其发送精心构造的 `Intent`,并让 ASUS Router 应用代表用户打开由攻击者控制的 URI。 于 2026-03-17 报告给 ASUS。由 ASUS 修复并作为 [CVE-2026-12960](https://www.cve.org/CVERecord?id=CVE-2026-12960) 于 2026-07-03 发布。 由 [Show Up Show Out Security](https://susos.co) 的 [Sedric Louissaint](https://sedriclouissaint.com) 发现并报告。 ## 总结 | | | |---|---| | **CVE** | [CVE-2026-12960](https://nvd.nist.gov/vuln/detail/CVE-2026-12960) | | **产品** | 适用于 Android 的 ASUS Router App (`com.asus.aihome`) | | **受影响版本** | ≤ 1.0.0.9.71 | | **修复版本** | 1.0.0.9.74 | | **弱点** | [CWE-926: Android 应用组件的不当导出](https://cwe.mitre.org/data/definitions/926.html) | | **CVSS 4.0** | 6.0 中危 `CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N` | | **CNA** | ASUS | | **厂商公告** | https://www.asus.com/security-advisory/ | | **测试环境** | `com.asus.aihome` 1.0.0.9.71 (Google Play), Android 11 模拟器 | ## 技术细节 该应用内置了 Baidu Push SDK,其中声明了: ``` ``` 由于没有 `android:permission` 属性,Android 的组件级访问控制从未 生效。任何已安装的应用都可以对其调用 `startService()`。 `CommandService.onStartCommand()` 会从传入 Intent 的 `public_msg` extra 中读取一个 `PublicMsg` Parcelable,并将其传递给 `handlePrivateNotification()`,该函数会根据攻击者提供的 `mOpenType` 字段进行分支处理: | `mOpenType` | 行为 | |---|---| | `1` | 使用攻击者的 `mUrl` 执行 `startActivity(ACTION_VIEW, Uri.parse(mUrl))` | | `2` | 先执行 `Intent.parseUri(mPkgContent, 0)` 然后执行 `startActivity()` / `sendBroadcast()` | 发送方和 payload 均未经过验证。由于生成的 activity 是从 ASUS 应用自身的 UID 和进程启动的,因此屏幕上显示的任何内容看起来都像是来自用户刚刚打开的受信任的路由器管理应用。 这在实际影响上与 Baidu 并无特定关联。该 SDK 提供了导出的组件,宿主应用继承了它,而宿主应用的身份正是被借用之处。 ### 攻击链 1. 恶意应用构造一个与目标字段布局相匹配的 `PublicMsg` Parcelable。 2. 将 `mOpenType` 设置为 1,并将 `mUrl` 设置为由攻击者控制的 URI。 3. 将 Intent 发送给 `CommandService`。无需任何权限,也不会抛出 `SecurityException`。 4. `onStartCommand()` → `handlePrivateNotification()`。 5. 从 ASUS 应用的进程中触发 `startActivity(ACTION_VIEW, Uri.parse(mUrl))`。 从反编译的 smali 中的 `writeToParcel` 恢复出的 `PublicMsg` 字段顺序, 并在 [`poc/PublicMsg.java`](poc/PublicMsg.java) 中重新实现如下: ``` String mMsgId, mAppId, mTitle, mDescription, mUrl, mPkgName int mPkgVercode, mNotificationBuilder, mNotificationBasicStyle int mOpenType, mUserConfirm String mCustomContent, mPkgContent int mAdvertiseStyle String mAdvertiseSmallIconUrl, mAdvertiseLargeIconUrl, mAdvertiseClickUrl, mAdvertiseBigPictureUrl, mAdvertiseBigPictureClickUrl, mAdvertiseDownloadClickUrl ``` 如果顺序错误,Parcel 将反序列化为垃圾数据。如果顺序正确,服务就会接受该消息,就像 Baidu 自己的推送基础设施发送的一样。 ### 已验证的 payload 六种 URI scheme,一个导出的 service,零权限: | # | Scheme | 结果 | |---|---|---| | 1 | `https:` | 浏览器打开由攻击者控制的钓鱼页面 | | 2 | `sms:` | 预填好社会工程学信息的 SMS 编辑器 | | 3 | `tel:` | 预填好由攻击者指定号码的拨号器 | | 4 | `mailto:` | 预填好用于窃取凭据的电子邮件编辑器 | | 5 | `market:` | 重定向至 Play Store 以安装恶意软件 | | 6 | `geo:` | 重定向至虚假服务中心的地图应用 | ## 概念验证 (PoC) [`media/poc_commandservice.mp4`](media/poc_commandservice.mp4) 是完整的 31 秒 运行录像:构建、安装、触发,以及模拟器依次对每个 payload 作出反应。 | 攻击 1:钓鱼页面 | 攻击 2:SMS 编辑器 | 攻击 3:拨号器 | PoC 应用的权限 | |---|---|---|---| | ![浏览器被打开并导航至攻击者 URL](https://static.pigsec.cn/wp-content/uploads/repos/cas/fe/fe9f8029eca70f628a29da9cf7969cae807e09b136d253e7f5a733a5394ab3bb.jpg) | ![预填好虚假 ASUS 安全警报的 SMS 编辑器](https://static.pigsec.cn/wp-content/uploads/repos/cas/bc/bc672f971147621e7ef136afb349bee0078c6d457c41535fb29551730320c513.jpg) | ![预填好攻击者号码的拨号器](https://static.pigsec.cn/wp-content/uploads/repos/cas/58/586f83d714612f55d826fcf6efdcd4092594e4e2dd22c9850e0547e88d7502ab.jpg) | ![显示“未请求任何权限”的 Android 应用信息界面](https://static.pigsec.cn/wp-content/uploads/repos/cas/bc/bc4241537ec064c2452e46986e35648cc77fc2313f1c740a0b6f9dc59f9e934b.jpg) | 最后一张截图就是全部的理由。**未请求任何权限。** 这个刚刚通过 ASUS Router 应用驱动了六项操作的应用,根本没有向用户提出任何请求。 ### 复现步骤 需要 ADB、JDK 和 Android SDK build tools (`aapt2`, `d8`/`dx`, `zipalign`, `apksigner`) 以及 `platforms;android-30`。 ``` ./poc/poc_commandservice_exploit.sh ``` 该脚本分为三个阶段运行: 1. **访问检查。** 从 `com.android.shell` 发送三个 `CommandService` 操作, 并报告是否有任何操作被拒绝。受权限保护的服务在此处会抛出 `SecurityException`。而该服务全部接受了。 2. **构建。** 编译 PoC,打包并签名 `exploit_commandservice.apk`,然后 安装它。如果您想跳过此步,可以在 [`poc/`](poc/) 中找到预编译副本。 3. **执行。** 将 ASUS 应用调至前台,从无特权应用上下文中启动 PoC, 并捕获 logcat 证据。 在易受攻击设备上的阶段 1 输出: ``` [ACCESS] passthrough.notification.CLICK → service accepted intent [ACCESS] privatenotification.CLICK → service accepted intent [ACCESS] privatenotification.DELETE → service accepted intent Phase 1 result: 3/3 actions accepted without permission check ``` 以及来自 `dumpsys activity services` 的 `ServiceRecord`,它记录了调用者: ``` intent={act=com.baidu.android.pushservice.action.privatenotification.CLICK cmp=com.asus.aihome/com.baidu.android.pushservice.CommandService} recentCallingPackage=com.android.shell startRequested=true callStart=true ``` 阶段 3,来自真实的无特权应用而非 shell: ``` W PoCExploit: [OK] attack1_url_open → com.asus.aihome/com.baidu.android.pushservice.CommandService W PoCExploit: [OK] attack2_sms_compose → ... (all 6 succeed) ``` `startService()` 返回了目标的 `ComponentName` 而不是 `null`,并且没有 抛出 `SecurityException`。Android 解析了该 Intent 并将其送达。 ## 仓库内容 ``` poc/ poc_commandservice_exploit.sh Automated three-phase reproduction script ExploitCommandService.java PoC activity + broadcast receiver source PublicMsg.java Parcelable matching the target's field layout AndroidManifest_PoC.xml PoC manifest (note: no ) exploit_commandservice.apk Prebuilt PoC, debug-signed, zero permissions media/ poc_commandservice.mp4 Full PoC recording attack1-browser.jpg Stills pulled from the recording attack2-sms.jpg attack3-dialer.jpg poc-app-no-permissions.jpg vendor/ asus-security-advisory-submission.pdf The report as filed with ASUS ``` PoC 的出站 URL 是一个 Burp Collaborator 子域名,用于确认 导航确实发生了。该链接早已失效。如果您要进行复现,请替换为您自己的 URL。 ## 修复建议 对于厂商而言,修复仅需一个属性: ``` ``` 或者,如果该组件确实需要从外部访问,请使用 `signature` 保护级别的权限对其进行保护,并在执行操作前验证反序列化的 `PublicMsg`。 ASUS 已在 1.0.0.9.74 版本中发布了修复程序。 对于用户:将 ASUS Router 应用更新至 **1.0.0.9.74 或更高版本**。 对于发布 Android 应用的其他所有人:审计您的第三方 SDK 导出了哪些内容。 针对您自己的发布版本运行 `aapt dump xmltree base.apk AndroidManifest.xml` 并检查其中所有的 `exported="true"`。您所发布的 manifest 是合并的所有 manifest 的总和,您需要对这一切负责。 ## 时间线 | 日期 | 事件 | |---|---| | 2026-03-17 | 向 ASUS 报告漏洞,附带 PoC APK、自动化脚本和视频 | | 2026-06-23 | ASUS 作为 CNA 预留了 CVE-2026-12960 | | 2026-07-03 | CVE 发布;修复程序在 1.0.0.9.74 中可用 | | 2026-07-25 | 公开披露文章和 PoC 发布 | ## 相关文章 - 个人记述:https://sedriclouissaint.com/blog/asus-router-app-exported-commandservice-cve-2026-12960 - Show Up Show Out Security:https://susos.co/blog/improper-export-of-android-components-in-the-asus-router-app-cve-2026-12960 ## 免责声明 在协调披露和厂商修复后发布,仅供防御和教育 使用。该 PoC 针对已修复版本,且只会启动 URI。请勿 对您不拥有或未获得书面授权的设备运行该 PoC。
标签:Android安全, JS文件枚举, PoC, 暴力破解, 漏洞分析, 目录枚举, 移动安全, 路径探测