当 MCP 工具参数变成 Android intent:mobile-mcp 的注入汇聚点
CVE-2026-35394 使受模型控制的 URL 能够通过 mobile-mcp 的 mobile_open_url 工具触发任意 Android intent。结合一个同源的路径遍历 CVE,它揭示出一种模式:MCP 工具参数未经校验便流入危险汇聚点。
摘要
mobile-mcp是一个用于移动开发与自动化的 MCP 服务器。CVE-2026-35394 于 2026 年 4 月公布(CWE-939,GitHub CNA 向量AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:H/A:H,高危),它使传给mobile_open_url工具的 URL 能够触发任意 Android intent——tel:、sms:、USSD 代码、content:——原因是该工具从不校验 URI 的协议方案(scheme)。该问题已在 0.0.50 修复。一个同源缺陷 CVE-2026-33989(路径遍历,已在 0.0.49 修复)通过另一个汇聚点呈现同一类问题。教训不止于某个软件包:MCP 工具参数是攻击者可达的,它们流入的每一个汇聚点都必须校验。
这是什么?
Mobile Next 的 @mobilenext/mobile-mcp 将一部手机或模拟器以一组 MCP 工具的形式暴露给 LLM 智能体——点按、输入、截屏、打开 URL。根据 GitHub 安全公告 GHSA-5qhv-x9j4-c3vm,0.0.50 之前的版本会把传给 mobile_open_url 工具的字符串直接交给 Android 的 intent 系统,没有任何方案白名单。Android 能解析的远不止 http(s):tel: 会拨打电话,sms: 会打开短信,content: 会触达 content provider,拨号器代码可触发 USSD 操作。于是,一个模型可以自由选择的值,变成了对设备的实际操作。
同一项目几天前发布了 CVE-2026-33989(NVD 于 2026-03-27 公布,已在 0.0.49 修复):截屏与录屏工具的 saveTo 和 output 参数未经校验便写入磁盘,导致可在工作区之外进行路径遍历。两个 CVE、两个工具,却是同一个根因——未经校验的工具参数流入了强力汇聚点。
工作原理
MCP 工具参数并非”可信输入”。它是模型生成的内容,而模型的上下文中经常包含不可信文本:它浏览过的网页、它总结的邮件、它分诊的工单。这就是间接提示注入面——攻击者文本在上游,工具调用在下游。当工具不加校验地把该参数转发到汇聚点时,注入便落地为真实操作。
对 mobile_open_url 而言,危险的环节是在派发前缺失方案校验:
// 易受攻击的写法(< 0.0.50):从不约束方案
async function mobile_open_url(url) {
// url 可能是 tel:、sms:、content: 或拨号器/USSD 字符串——
// 被 Android 的 intent 系统原样解析。
await device.openUrl(url); // 汇聚点:任意 intent
}
// 修复后的写法(0.0.50):先对方案做白名单
function assertWebScheme(url) {
const ok = ["http:", "https:"];
if (!ok.includes(new URL(url).protocol)) throw new Error("scheme not allowed");
}
CVSS 向量中的 UI:R 表明仍需有人在已连接的设备上运行该智能体,但无需攻击者权限(PR:N),且请求可经网络触达(AV:N)。完整性与可用性影响为高:操作在真实手机上执行。我们不发布可用的攻击链;重点在于缺陷的形态,而非具体载荷。
为何重要
MCP 的价值在于一个智能体可以驱动众多工具。其风险在于每个工具各自决定是否信任自己的参数——没有一个中心化的仲裁者来声明”这个字符串来自模型输出,应视为不可信”。mobile-mcp 恰好位于一个格外强力的汇聚点之前(手机的 intent 解析器),但这一模式无处不在:把参数拼接进 SQL 的数据库 MCP、把参数转发给命令的 shell MCP、把参数拼进路径的文件系统 MCP。每一个新工具都是再次引入该类问题的机会——这正是为何同一项目在两周内出现了两个 CVE。
实际危险在于一条虚假的边界。团队往往把”智能体”当作要加固的对象,却忽视了 MCP 服务器是一个混淆代理(confused deputy):它持有设备或主机的权限,并会依据最终可追溯到不可信内容的指令去使用这些权限。
防御
- 升级。
mobile-mcp≥ 0.0.50 修复了 intent 汇聚点;≥ 0.0.49 修复了路径遍历汇聚点。锁定版本并用npm list @mobilenext/mobile-mcp核对。 - 在每个汇聚点做白名单,而不只是这一个。 对 URL 汇聚点校验方案(仅允许
http/https),对文件汇聚点规范化并限制路径,对查询汇聚点使用参数化。把每个工具参数都当作不可信的模型输出。 - 以最小权限运行 MCP 服务器。 驱动一次性模拟器而非个人设备;拒绝流程不需要的电话/短信权限;隔离文件系统与网络,使错误参数无法触达敏感数据。
- 审计你的工具面以发现该模式。 在自有及第三方 MCP 服务器中检索那些未经校验便流入
openUrl、exec、文件写入或查询构造器的参数,并将该检查固化到 CI,使未来的工具无法再次引入。 - 对带外方案进行记录与告警。
tel:、sms:、content:或非http(s)的值到达 URL 工具——或在工作区之外发生写入——都是有用的狩猎信号,表明某个参数受到了攻击者影响。
状态
| 项目 | 参考 | 日期 | 说明 |
|---|---|---|---|
| CVE-2026-35394 | GHSA-5qhv-x9j4-c3vm | 2026-04 | mobile_open_url intent 注入,CWE-939,向量 C:L/I:H/A:H |
| 修复版本 | mobile-mcp 0.0.50 | — | 新增方案校验 |
| CVE-2026-33989 | GHSA-3p2m-h2v6-g9mx | 2026-03-27(NVD) | 截屏/录屏工具中的路径遍历,CWE-22/73 |
| 修复版本 | mobile-mcp 0.0.49 | — | 新增路径校验 |
正确的视角不是”给 mobile-mcp 打补丁”。而是:每个 MCP 工具参数都对模型上下文中的内容可达,一个把它未经校验便转发到特权汇聚点的工具,会把上游的提示注入变成下游的实际操作——无论是在手机、文件系统还是数据库上。
Sources
- → https://www.sentinelone.com/vulnerability-database/cve-2026-35394/
- → https://advisories.gitlab.com/pkg/npm/@mobilenext/mobile-mcp/CVE-2026-35394/
- → https://github.com/mobile-next/mobile-mcp/security/advisories/GHSA-5qhv-x9j4-c3vm
- → https://nvd.nist.gov/vuln/detail/CVE-2026-33989
- → https://github.com/mobile-next/mobile-mcp/security/advisories/GHSA-3p2m-h2v6-g9mx