系统:运行中
← 返回所有攻击
AGENTS MEDIUM NEW

当 MCP 工具参数变成 Android intent:mobile-mcp 的注入汇聚点

CVE-2026-35394 使受模型控制的 URL 能够通过 mobile-mcp 的 mobile_open_url 工具触发任意 Android intent。结合一个同源的路径遍历 CVE,它揭示出一种模式:MCP 工具参数未经校验便流入危险汇聚点。

2026-06-05 // 6 min affects: mobile-mcp, mobile-mcp-lt-0.0.50, model-agnostic-mcp-clients

摘要 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-c3vm0.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 修复):截屏与录屏工具的 saveTooutput 参数未经校验便写入磁盘,导致可在工作区之外进行路径遍历。两个 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):它持有设备或主机的权限,并会依据最终可追溯到不可信内容的指令去使用这些权限。

防御

  1. 升级。 mobile-mcp ≥ 0.0.50 修复了 intent 汇聚点;≥ 0.0.49 修复了路径遍历汇聚点。锁定版本并用 npm list @mobilenext/mobile-mcp 核对。
  2. 在每个汇聚点做白名单,而不只是这一个。 对 URL 汇聚点校验方案(仅允许 http/https),对文件汇聚点规范化并限制路径,对查询汇聚点使用参数化。把每个工具参数都当作不可信的模型输出。
  3. 以最小权限运行 MCP 服务器。 驱动一次性模拟器而非个人设备;拒绝流程不需要的电话/短信权限;隔离文件系统与网络,使错误参数无法触达敏感数据。
  4. 审计你的工具面以发现该模式。 在自有及第三方 MCP 服务器中检索那些未经校验便流入 openUrlexec、文件写入或查询构造器的参数,并将该检查固化到 CI,使未来的工具无法再次引入。
  5. 对带外方案进行记录与告警。 tel:sms:content: 或非 http(s) 的值到达 URL 工具——或在工作区之外发生写入——都是有用的狩猎信号,表明某个参数受到了攻击者影响。

状态

项目参考日期说明
CVE-2026-35394GHSA-5qhv-x9j4-c3vm2026-04mobile_open_url intent 注入,CWE-939,向量 C:L/I:H/A:H
修复版本mobile-mcp 0.0.50新增方案校验
CVE-2026-33989GHSA-3p2m-h2v6-g9mx2026-03-27(NVD)截屏/录屏工具中的路径遍历,CWE-22/73
修复版本mobile-mcp 0.0.49新增路径校验

正确的视角不是”给 mobile-mcp 打补丁”。而是:每个 MCP 工具参数都对模型上下文中的内容可达,一个把它未经校验便转发到特权汇聚点的工具,会把上游的提示注入变成下游的实际操作——无论是在手机、文件系统还是数据库上。

Sources