[Paper] Unsafe by Flow:揭示 MCP 生态系统中的双向数据流风险
发布: (2026年5月8日 GMT+8 23:03)
8 分钟阅读
原文: arXiv
Source: arXiv - 2605.07836v1
请提供您希望翻译的具体文本内容,我将为您翻译成简体中文。
概述
模型上下文协议(Model Context Protocols,MCP)是让大语言模型(LLM)代理调用外部工具的粘合剂——比如“搜索网页”“运行 shell 命令”或“查询数据库”。虽然它们能够实现强大的工作流,但也暴露了一个隐藏的攻击面:数据可能以恶意方式 流入 工具,且结果可能以不安全的方式 流出 工具返回给 LLM 或主机系统。论文 Unsafe by Flow 介绍了 MCP‑BiFlow,一种静态分析框架,能够自动发现真实世界 MCP 服务器中这些双向数据流漏洞。
关键贡献
- Bidirectional taint model 同时跟踪 请求端(输入)和 响应端(输出)数据在 MCP 处理程序中的传播。
- MCP‑aware entry‑point recovery 用于定位 MCP 服务器使用的多样化注册和分发模式(例如装饰器、动态路由表)。
- Interprocedural propagation engine 尊重 MCP 特定语义(例如 “tool‑output is exposed to the LLM” 与 “internal log is private”)。
- Comprehensive evaluation 在精心挑选的基准(32 个已知 MCP 漏洞)上实现 93.8 % 的召回率,并对 >15 k 开源 MCP 服务器进行大规模扫描,发现 118 条已确认的漏洞路径。
- Open‑source prototype (MCP‑BiFlow)以及为社区准备的 MCP 漏洞案例精选数据集。
方法论
- 入口点提取 – 分析器首先扫描代码库中的 MCP 注册代码(例如
register_tool、@mcp_handler)。由于开发者可以通过多种方式注册处理器(静态表、运行时反射、插件加载),MCP‑BiFlow 会构建一个 控制流图,捕获所有可能的入口点。 - 特定协议的污点语义 – 作者定义了两类污点来源:
- 请求者可控输入(JSON 负载、命令字符串)。
- 敏感内部数据(环境变量、凭证)。
以及两类污点汇: - 敏感操作(文件写入、操作系统执行)。
- MCP 可见输出(返回给 LLM 的响应)。
分析会为每个变量标记方向(入/出),并在赋值、函数调用和数据结构操作中传播这些标签。
- 跨过程数据流分析 – 使用工作列表算法,工具在函数边界之间追踪污点,处理常见的 Python 习惯用法(装饰器、async/await、动态导入)。它还对 工具作用域的执行路径 进行建模:请求从调度器 → 处理器 → 内部库 → 响应生成。
- 候选聚类 – 为了让输出易于管理,类似的污点路径会基于共享的来源‑汇模式合并为“聚类”,随后交由人工审阅者进行验证。
结果与发现
| Evaluation | Metric | Value |
|---|---|---|
| 基准(32 个已知漏洞) | 召回率 | 30 / 32(93.8 %) |
| 基准 | 精确率(人工检查) | ~85 %(误报很少) |
| 真实世界扫描(15 452 个仓库) | 候选聚类 | 549(经重叠压缩后) |
| 手动验证 | 确认的易受攻击路径 | 118(分布于 87 台不同服务器) |
| 对比工具(CodeQL, Semgrep, Snyk Code, MCPScan) | 最佳召回率 | ≤ 55 %(没有检测到双向流) |
这意味着:
- 现有的静态分析器错过了大多数与 MCP 相关的漏洞,因为它们只检查数据流的单一方向。
- 不安全的传播是 常见的:约 0.7 % 的被扫描 MCP 服务器至少包含一个可利用的双向流。
- 双向模型是必需的;许多漏洞仅在 请求端 的污点到达 敏感操作 并且 随后产生的 输出 再次被送回 LLM 时才会出现。
实际意义
- 针对 LLM‑tool 开发者: 将 MCP‑BiFlow(或类似的双向污点检查)集成到 CI 流水线中,以在部署前捕获不安全的参数处理和过于宽松的响应序列化问题。
- 针对平台运营者(例如 LangChain、AutoGPT 生态系统): 采用协议感知的入口点发现机制,自动审计第三方工具插件,降低供应链风险。
- 针对安全团队: 聚类输出提供了每个 MCP 服务器的简明“攻击面图”,即使在大型代码库中也能实现手动分流。
- 针对 API 设计者: 论文强调了 显式 数据流合约的必要性(例如,将字段标记为“私有”或“公开”),以便静态工具使用,从而推动更安全的 MCP 规范。
- 性能影响: MCP‑BiFlow 作为静态分析步骤运行;作者报告对典型 5 k 行 Python 项目的分析时间不足 2 分钟,适合夜间构建。
限制与未来工作
- 语言范围: 原型针对 Python MCP 服务器;扩展到其他语言(Node.js、Go)将需要额外的入口点启发式。
- 动态分发: 极度动态的注册(例如,从用户提供的代码字符串构建处理程序)可能规避静态恢复,导致路径遗漏。
- 误报: 虽然精确度很高,但某些标记的路径涉及良性数据(例如,对用户输入的日志记录),并不构成真实的利用。未来工作可以加入运行时分析以过滤这些情况。
- 运行时语义: 该分析未对实际的大语言模型推理进行建模;恶意模型可能将良性流程放大为利用。将静态污点分析与沙箱执行轨迹相结合是一个有前景的方向。
作者
- Xinyi Hou
- Yanjie Zhao
- Haoyu Wang
论文信息
- arXiv ID: 2605.07836v1
- 分类: cs.SE
- 发表时间: 2026年5月8日
- PDF: 下载 PDF