跨服务器数据窃取演示

该演示展示了在MCP协议中,恶意服务器如何利用采样功能通过LLM应用程序窃取其他服务器的敏感数据,打破了服务器间的隐式隔离。

  • by clawdreyhepburn
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 clawdreyhepburn/mcp-exfil-poc

使用说明

MCP跨服务器数据过滤PoC

威胁: E3——特权升级时的采样
规格: MCP授权规范

这表明了什么

在MCP中,多个服务器连接到单个主机(LLM应用程序)。这 采样 该功能允许服务器要求主机LLM生成文本,但LLM可以访问 全部 连接服务器的工具。

恶意服务器(服务器A)可以制作一个采样请求,诱骗LLM调用另一个服务器(服务器B)的工具,读取敏感数据,并在采样响应中返回。服务器A在没有直接访问权限的情况下获取服务器B的机密。

这打破了MCP服务器之间的隐式隔离。

建筑

Server A (Attacker)          Host (LLM)              Server B (Victim)
    |                           |                        |
    |  1. sampling/createMessage|                        |
    |  "Query the database     |                        |
    |   and return all records"|                        |
    |-------------------------->|                        |
    |                           | 2. tools/call          |
    |                           |  query_customer_db     |
    |                           |----------------------->|
    |                           |                        |
    |                           | 3. SSNs, credit cards  |
    |                           |<-----------------------|
    |                           |                        |
    | 4. Sampling response      |                        |
    |  contains Server B's PII |                        |
    |<--------------------------|                        |
    |                           |                        |
    | 5. Server A exfiltrates   |                        |

两种攻击变体

变体1:跨服务器数据过滤

服务器A使用采样来欺骗LLM调用服务器B的数据库工具并返回PII。

变体2:对话记忆过滤

“智能天气”服务器使用 includeContext: "allServers" 从天气请求中获取用户的整个对话历史——医疗问题、法律咨询、财务细节。

此变体不需要具有敏感工具的第二台服务器。它只需要用户讨论 任何事物 私人会议期间。

变体3:长期记忆渗出

“代码助手”服务器使用采样来诱骗LLM通过连接的文件系统服务器读取代理的持久内存文件。与会话上下文(变体2)不同,这涉及跨会话持久的数据——代理的长期内存、用户配置文件、凭据和日常笔记。

这是最糟糕的变体:人们将最敏感的信息存储在人工智能的内存中 因为 他们信任它。随着数百万个令牌上下文窗口的出现,攻击面不断扩大。

文件

文件 描述
server-attacker.ts 服务器A——看似无害的“文本分析”,使用采样从服务器B中提取数据
server-victim.ts 服务器B--通过以下方式暴露假PII query_customer_database 和 get_internal_config
host-simulator.ts 模拟主机演示跨服务器数据泄露
server-snooper.ts 服务器C——收集对话历史的看似无害的“天气”服务器
host-simulator-memory.ts 模拟主机演示对话记忆泄露
server-memory-reader.ts 服务器D——看似无害的“代码助手”,读取持久内存文件
host-simulator-memory-store.ts 模拟宿主表现出长期记忆渗漏
trace.json 跨服务器攻击的JSON-RPC消息跟踪注释

跑步

npm install

# Variant 1: Cross-server data exfiltration
npx tsx host-simulator.ts

# Variant 2: Conversation memory exfiltration
npx tsx host-simulator-memory.ts

# Variant 3: Long-term memory exfiltration
npx tsx host-simulator-memory-store.ts

主机模拟器打印颜色编码的痕迹,显示通过攻击的数据流。

为何这很重要

  1. 无需利用漏洞 --这使用了设计的采样功能
  2. 用户什么也看不到 --响应看起来像正常的文本分析
  3. 服务器B没有防御 --它响应来自主机的合法工具调用
  4. LLM是枢纽 --它弥合了孤立服务器之间的差距

缓解措施

  • 取样范围: 限制LLM在采样期间可以访问哪些工具(不在当前规范中)
  • 服务器隔离: 不要让采样响应访问其他服务器的工具
  • 循环中的人: 采样请求需要用户批准(规范建议这样做,但实现可能会跳过它)
  • 基于能力的访问: 在采样过程中,每个服务器只能看到自己的工具