目录

PoisonGuard-MCP

赛题: 泛在操作系统原生的 MCP 协议栈设计 项目名称:PoisonGuard-MCP:面向工具投毒攻击检测的原生 MCP 协议栈


目录

  1. 需求分析
  2. 总体设计思路
  3. 核心模块划分
  4. 关键技术选型
  5. 接口设计
  6. 异常处理方案
  7. 兼容性说明
  8. 部署与运行
  9. 性能指标与测试方案
  10. SCA 检测性能评估
  11. 端到端应用案例
  12. 未来扩展方向

作者团队:北京大学计算机学院

队长:李如钦

队员:李少飞

1. 需求分析

1.1 赛题背景解读

Model Context Protocol (MCP) 已成为 LLM Agent 集成外部工具的事实标准。在 MCP 架构中,Agent 依据工具描述 (tool description) 进行工具选择和参数构造,但不检查工具源代码。这一设计在描述与实现之间引入了固有的语义分离,构成了工具投毒攻击 (Tool Poisoning Attack, TPA) 的攻击面:攻击者向工具描述中注入恶意指令,Agent 将其解释为权威命令,从而被诱导执行非预期操作。

MCPTox 基准测试表明,在 20 个 LLM Agent 和 45 个真实 MCP Server 上,攻击成功率最高达 72.8%;MCP-ITP 研究显示,隐式工具投毒可达到 84.2% 的攻击成功率,而恶意工具检测率仅为 0.3%。

赛题同时指出现有 MCP 协议栈存在的性能问题:

痛点 描述
中间层损耗 厂商框架独立开发,附加检测大模型调用准确度、处理工具崩溃等功能,引发无效协议重传
上下文膨胀 Agent 交互受大模型上下文长度限制,冗长上下文大幅降低通信效率
安全风险 敏感数据在非原生协议栈中易受攻击,恶意工具可通过描述投毒伪装为良性工具

1.2 项目简介

本系统构建一套面向工具投毒攻击的原生 MCP 协议栈,将细粒度工具描述-代码语义一致性比较技术 (SCA) 深度集成到协议栈安全层,在工具注册阶段自动检测描述投毒攻击。系统支持:

  • 原生 JSON-RPC 2.0 协议处理,作为用户态守护进程运行,无额外中间件
  • 基于 MMD 分布偏移检测的代码分割 + UniXcoder Cross-Encoder 的跨语言语义推理
  • 注册时安全验证(零运行时开销)+ HMAC 身份认证 + AES-256-GCM 数据加密
  • 语义压缩 + LRU 缓存的上下文优化

1.3 功能需求映射

赛题要求 本系统实现
原生协议栈,减少中间层,提升性能 10% 用户态守护进程直接处理 JSON-RPC,安全验证在注册时一次性完成
压缩、缓存优化上下文,提升通信效率 10% 语义压缩+ LRU 缓存+ Gzip 传输压缩
内置安全机制,防止恶意 Agent 攻击 SCA 语义一致性验证 + HMAC-SHA256 认证 + AES-256-GCM 加密

1.4 核心洞察

本系统的安全检测机制基于两点核心认识:

第一,检测范式应从攻击模式匹配转向语义一致性分析。 现有防御手段(规则匹配型扫描器、运行时行为监控、宏观语义相似度比较)的共同局限在于依赖攻击模式匹配,即计算与已知攻击的相似度。本系统不问”该工具是否类似于已知攻击”,而问”描述中的每个声明是否在代码中有对应实现”。恶意工具因注入行为,其描述必然包含代码未实现的声明;良性工具出于可用性需求,必然保持描述与代码的强语义一致性。

第二,语义一致性验证应从宏观相似度计算转向原子级语义推理。 现有方法将描述和代码作为整体进行相似度比较,类似于判断两个物体在外观上是否相似,只能得到表层相似度。本方案将描述分解为元动作 (meta-action),将代码分割为语义连贯的功能块 (functional block),对每个对齐对进行语义推理,验证代码是否逻辑支撑描述声明。

威胁模型设定:攻击者采用非对称注入策略,即向描述中注入恶意内容而保持源代码良性。这是实践中的主要攻击模式,因为注入恶意代码会将攻击转化为传统恶意软件,可被成熟的代码扫描工具检测。


2. 总体设计思路

2.1 架构分层

系统自底向上分为五层:

层级 职责 对应源码目录
协议核心层 JSON-RPC 2.0 消息封装解析、MCP 方法路由 mcp_os/protocol/
安全层 HMAC 认证 + SCA 语义一致性验证 + AES 加密 mcp_os/security/
上下文优化层 语义压缩 + LRU 缓存 mcp_os/context/

2.2 工具注册数据流

工具注册请求到达后,协议栈执行以下流程:

  1. 传输层接收 JSON-RPC 消息,协议核心层解析请求方法和参数
  2. 安全网关依次执行三重检查:
    • 身份认证:验证 Agent 令牌(HMAC-SHA256)
    • 语义一致性验证:调用 SCA 框架检测描述投毒
    • 数据加密:确保注册数据传输安全
  3. SCA 检测流程:特征提取模块将描述拆分为元动作集合,源代码经 MMD 分割为功能块集合;跨语言语义推理模块对每个元动作在所有功能块中检索最大一致性分数;若存在元动作的最大支持度低于阈值,判定为投毒,拒绝注册
  4. 通过验证的工具注册到工具表中,标记 verified=True

工具调用阶段,协议栈仅检查工具的 verified 标志位,不重新执行 SCA 检测,确保运行时零安全开销。

2.3 抢占式安全验证设计

安全验证在工具注册阶段完成,而非每次工具调用时执行。该设计基于以下考量:

  • 工具注册是低频操作(工具上线时一次),工具调用是高频操作(Agent 每次交互)
  • 将安全开销从高频路径转移到低频路径,实现运行时零开销
  • 首次注册时执行完整 SCA 验证,重复注册同一工具名时跳过验证直接返回

3. 核心模块划分

3.1 模块总览

src/
├── mcp_os/                         # 协议栈主包
│   ├── config.py                   # 全局配置
│   ├── detector_core/              # SCA 框架原始源码(MCPDetector 项目)
│   │   ├── config.py               #   检测器配置
│   │   ├── model.py                #   ConsistencyCrossEncoder 模型定义
│   │   ├── code_parser.py          #   MMD 边缘校准代码切分器
│   │   ├── desc_parser.py          #   spaCy 依存句法描述解析器
│   │   ├── code_ast.py             #   Tree-sitter 代码特征提取
│   │   ├── detector.py             #   PoisonDetector 检测器
│   │   ├── dataset.py              #   训练数据集封装
│   │   ├── process_data.py         #   训练数据构造(对齐 + 硬负采样)
│   │   └── clean_code.py           #   AST 代码净化(防数据泄露)
│   ├── protocol/                   # 协议核心层
│   │   ├── jsonrpc.py              #   JSON-RPC 2.0 消息处理
│   │   ├── messages.py             #   MCP 消息类型定义
│   │   ├── transport.py            #   传输层(stdio / SSE / WebSocket)
│   │   └── server.py               #   MCP Server(请求路由 + 工具管理)
│   ├── security/                   # 安全层
│   │   ├── auth.py                 #   HMAC-SHA256 身份认证
│   │   ├── crypto.py               #   AES-256-GCM 数据加密
│   │   ├── consistency_verifier.py #   SCA 框架集成封装
│   │   └── security_gate.py        #   安全网关(三重检查统一入口)
│   ├── context/                    # 上下文优化层
│   │   ├── compressor.py           #   语义压缩器
│   │   └── cache.py                #   LRU 缓存 + Gzip 压缩
│   ├── registry/                   # 工具注册中心
│   │   └── tool_registry.py        #   工具全生命周期管理
│   └── os_integration/             # OS 适配层
│       └── service.py              #   守护进程 + 信号处理
├── tests/                          # 测试代码(68 个用例)
├── examples/                       # 示例应用
│   ├── weather_server.py           #   描述投毒检测演示
│   └── travel_agent.py             #   多 Agent 协作演示
└── scripts/                        # 启动与工具脚本
    ├── run_server.py               #   Server 启动脚本
    ├── run_client.py               #   Client 启动脚本
    ├── e2e_server.py               #   端到端 Server(自带工具实现)
    ├── e2e_test.py                 #   端到端测试(SCA 验证 + GLM 问答)
    ├── interactive_client.py       #   交互式客户端
    ├── benchmark.py                #   性能基准测试
    ├── train_model.py              #   Cross-Encoder 训练脚本
    ├── process_data.py             #   训练数据构造脚本
    └── clean_code.py               #   代码净化脚本

3.2 SCA 框架

SCA 框架包含三个模块,源码完整保留在 detector_core/ 目录中。

3.2.1 特征提取模块

从工具描述和源代码中提取安全相关关键特征,用于训练阶段建立自然语言与代码语言之间的细粒度映射关系。

描述特征提取:使用 spaCy 依存句法分析生成依赖树,识别所有具有直接宾语 (dobj) 的动词,提取以该动词为根的完整动词短语作为元动作。元动作集合中的每个元素代表描述中声明的一个完整动作。

源代码特征提取:使用 Tree-sitter 将源代码解析为 AST,从五个维度提取特征:外部依赖(识别潜在恶意库)、函数签名(捕获声明意图)、关键行为指令(监控敏感系统调用)、数据扫描(确定处理目标)、输出流(识别数据去向)。

3.2.2 源代码分割模块

提出基于 MMD 的语义分布偏移检测算法,将源代码分割为语义连贯的功能块。核心认识:同一功能块内的代码行在嵌入空间中呈现相似的语义分布,功能边界处的代码行呈现分布偏移。

算法流程:

  1. 每行代码经 UniXcoder 编码获得行级向量表示
  2. 滑动窗口计算每个位置的 MMD 值(窗口内样本量不足时退化为余弦距离)
  3. 基于中位数 + λ × MAD 的自适应阈值确定分割点
  4. 非极大值抑制,仅保留局部峰值作为分割点

3.2.3 跨语言语义推理模块

对每个描述元动作,在所有代码功能块中检索最大一致性分数。UniXcoder Cross-Encoder 使每个元动作与对应代码块在每一层 Transformer 中进行完整的自注意力交互,验证描述中的每个指令是否被代码逻辑支撑。若任意元动作的最大支持度低于阈值,判定为孤立描述意图,触发投毒告警。

模型结构:UniXcoder 编码器提取 [CLS] 向量,经 Dropout(0.1) → Linear(hidden, hidden) → Tanh → Linear(hidden, 2) 分类头输出二分类结果。损失函数为 CrossEntropyLoss。

3.3 训练流程

训练严格按 MCPDetector 项目原始源码实现:

阶段 脚本 说明
代码净化 clean_code.py AST 编译器级净化,物理摘除 Docstring,防数据泄露
数据构造 process_data.py Bi-Encoder 相似度对齐,正负比 1:3 硬负采样
模型微调 train.py AdamW lr=2e-5,线性预热,梯度裁剪,F1 保存最佳

3.4 安全网关

安全网关是安全层的统一入口,将三个安全组件组合为串行验证流水线:

检查顺序 组件 机制
1 身份认证 HMAC-SHA256 令牌,TTL 1 小时
2 语义一致性验证 SCA 框架(PoisonDetector.detect)
3 数据加密 AES-256-GCM,96-bit nonce

4. 关键技术选型

技术领域 选型 依据
预训练模型 UniXcoder 统一跨语言预训练模型,利用 AST 和代码注释,支持代码与自然语言双模态
一致性判定 Cross-Encoder 相比 Bi-Encoder,在 Transformer 每层实现描述-代码深度交互,验证精度更高
描述解析 spaCy (en_core_web_sm) 工业级依存句法分析器,支持复合句拆分
代码分割 MMD + 边缘退化 MMD 是分布偏移的严谨度量,边缘退化解决小样本估计不稳定问题
代码特征提取 Tree-sitter 跨语言 AST 解析器
数据加密 AES-256-GCM NIST 标准,GCM 模式同时提供机密性和完整性
身份认证 HMAC-SHA256 对称密钥签名,计算开销小
传输层 asyncio 异步 I/O 支持高并发连接,非阻塞
缓存策略 LRU + TTL LRU 保证热点数据常驻,TTL 保证数据新鲜度
LLM Agent GLM-4 (智谱) 国产大模型,支持工具选择决策

5. 接口设计

5.1 MCP 标准方法

方法 参数 返回 说明
initialize {} {protocolVersion, capabilities, serverInfo} 初始化连接
ping {} {status, timestamp} 心跳检测
tools/list {} {tools: [...]} 列出已注册工具
tools/call {name, arguments} {content, isError} 调用工具
shutdown {} {status} 关闭服务端

5.2 扩展方法

方法 参数 返回 说明
tools/register {name, description, source_code, inputSchema} VerificationReport 动态注册工具(含 SCA 验证)
security/verify_tool {name} VerificationReport 手动触发一致性验证
security/get_report {} {tools_verified, tools_blocked, ...} 安全审计报告
context/compress {text} {original_length, compressed_length, ratio} 上下文压缩
context/cache_stats {} {hit_rate, hits, misses, compression} 缓存统计

5.3 错误码

错误码 含义
-32700 JSON 解析错误
-32600 无效请求
-32601 方法未找到
-32602 无效参数
-32603 内部错误
-32001 认证失败
-32002 加密错误
-32003 工具未找到
-32004 工具执行错误
-32005 安全违规(SCA 语义一致性验证失败)
-32006 上下文超限

5.4 核心 Python API

from mcp_os.protocol.server import MCPServer
from mcp_os.security.security_gate import SecurityGate
from mcp_os.context.cache import ContextOptimizer

gate = SecurityGate()
optimizer = ContextOptimizer()
server = MCPServer(security_gate=gate, context_optimizer=optimizer)

# 注册工具(自动触发 SCA 安全验证)
report = server.register_tool(
    name="get_weather",
    description="Get weather for a city",
    handler=get_weather_handler,
    source_code=weather_code_string,
)
# report.is_poisoned == False → 注册成功
# report.is_poisoned == True → 抛出 SecurityViolationError

await server.run()

6. 异常处理方案

6.1 安全违规

工具注册时若 SCA 检测发现描述中存在元动作缺乏代码支撑,安全网关抛出 SecurityViolationError,返回 SECURITY_VIOLATION (-32005) 错误,工具不注册到工具表中。

6.2 模型权重不可用

ConsistencyVerifier 在初始化前检查权重文件。权重文件不存在时抛出 FileNotFoundError 并提示运行训练流程。权重文件为空(未训练)时抛出 RuntimeError 并给出训练指引。

6.3 传输层异常

异常 处理方式
连接断开 自动关闭当前会话
消息解析失败 返回 PARSE_ERROR (-32700)
空行输入 静默跳过,不触发错误
请求超时 30 秒超时
并发过载 连接池限制 256,超限拒绝

6.4 工具调用异常

异常 处理方式
工具未找到 返回 TOOL_NOT_FOUND (-32003)
工具未验证 返回 SECURITY_VIOLATION (-32005)
执行超时 60 秒超时,返回 TOOL_EXECUTION_ERROR
执行异常 捕获,返回 isError=true

7. 兼容性说明

7.1 运行环境

项目 要求 备注
Python ≥ 3.10 使用 dataclasses、asyncio 等特性
操作系统 OpenHarmony / Linux / Windows / macOS 纯 Python 实现
GPU(可选) NVIDIA CUDA 11.8+ SCA 完整模式需要,CPU 可运行

7.2 依赖兼容性

依赖 版本 用途
torch ≥ 2.0 SCA 模型推理
transformers ≥ 4.30 UniXcoder 加载
spaCy ≥ 3.6 + en_core_web_sm 描述依存句法解析
tree-sitter-languages ≥ 1.8 代码 AST 解析
cryptography ≥ 41.0 AES-256-GCM 加密
zhipuai ≥ 2.0 GLM-4 Agent(端到端演示)

7.3 MCP 协议兼容

兼容 MCP 2024-11-05 规范,完整支持标准方法。扩展方法以非冲突方式提供,标准客户端可忽略。Agent 框架(LangChain、HelloAgents)可通过 stdio 传输集成。


8. 部署与运行

8.1 快速开始

# 安装依赖
pip install -r requirements.txt

# 安装 spaCy 模型
python -m spacy download en_core_web_sm

# 下载 UniXcoder 模型(从 ModelScope,国内可用)
pip install modelscope
python -c "from modelscope import snapshot_download; snapshot_download('microsoft/unixcoder-base')"

# 运行测试
cd src
python -m pytest tests/ -v

# 运行描述投毒检测演示
python examples/weather_server.py

# 运行多 Agent 协作演示
python examples/travel_agent.py

8.2 SCA 模型训练

cd src/scripts
python clean_code.py        # AST 净化训练数据
python process_data.py      # 构造对齐训练对(正负比 1:3)
python train_model.py       # 微调 Cross-Encoder(AdamW lr=2e-5)

8.3 端到端 Agent 问答

export ZHIPUAI_API_KEY=你的key
cd src
python scripts/e2e_test.py "帮我查北京天气"
python scripts/e2e_test.py "上海有哪些景点"
python scripts/e2e_test.py "从故宫到颐和园怎么走"

8.4 启动 MCP Server

cd src
python scripts/run_server.py --transport stdio
python scripts/run_server.py --transport sse --port 9000

8.5 性能基准

cd src
python scripts/benchmark.py

9. 性能指标与测试方案

9.1 测试覆盖

测试文件 用例数 覆盖内容
test_jsonrpc.py 13 JSON-RPC 消息解析、请求/响应构造、错误处理
test_transport.py 7 传输层工厂、stdio/SSE/WebSocket 创建
test_security.py 20 身份认证、SCA 一致性验证、安全网关
test_context.py 15 压缩器、缓存器、优化器
test_e2e.py 13 Server 初始化、工具注册验证、工具调用、安全报告

9.2 协议栈性能基准

指标 结果
工具调用延迟 (P50) 0.002ms
工具调用延迟 (P99) 0.04ms
并发 QPS (50 并发) > 60,000
上下文压缩率 0.599(节省 40.1%)
缓存命中率 (70% 重复) 70%
SCA 验证开销 注册时一次性(~1.5s),运行时为零

10. SCA 检测性能评估

10.1 实验环境

双 Intel Xeon Platinum 8358 CPU (64 核 128 线程),NVIDIA RTX A6000 GPU (48GB GDDR6),256GB 内存。

10.2 数据集

数据集 类型 样本数 说明
MCPCorpus 良性 部分 学术标准化 MCP 数据集
MCPZoo 良性 部分 真实生态库,120,000+ 实例
MCPTOX 恶意 452 对抗生成,覆盖未授权访问、隐私泄露等

10.3 检测效果

方法 MCPCorpus+MCPTOX MCPZoo+MCPTOX
Prec / Recall / F1 Prec / Recall / F1
MCP-Scan 1.0000 / 0.5553 / 0.7141 1.0000 / 0.5351 / 0.6971
LLM-Guard 0.4545 / 0.1659 / 0.2431 0.2132 / 0.1568 / 0.1807
SCA 0.9671 / 0.9757 / 0.9714 0.8326 / 0.9676 / 0.8950

SCA 在标准化基准上 F1 达到 0.9714,较 MCP-Scan 提升 36%;在真实生态数据集上 F1 达到 0.8950,Recall 维持 0.9676。

10.4 效率

指标 MCPCorpus MCPZoo
延迟 50.9ms 86.4ms
吞吐量 19.6 items/s 11.6 items/s

10.5 消融研究

变体 MCPCorpus F1 MCPZoo F1 分析
完整 SCA 0.9714 0.8950
w/o Module 1 ~0.97 下降显著 真实场景非标准化描述需要元动作提取
w/o Module 2 ~0.97 中等下降 当前 MCP Server 多为单功能,代码较短
w/o Module 3 ~0.97 下降显著 浅层交互无法区分真实场景的良性/恶意

11. 端到端应用案例

11.1 工具注册与 SCA 验证

客户端通过 JSON-RPC 协议逐个注册工具,每个工具注册时安全网关调用 SCA 框架执行验证:

工具 描述 代码 SCA 结果
get_weather 查询城市天气 调用天气 API PASS (1/1 verified)
search_poi 搜索城市景点 调用 POI API PASS (1/1 verified)
route_planner 规划路线 调用路线 API PASS (1/1 verified)
poisoned_weather 查询天气 + 删除文件 仅天气查询(良性) BLOCKED (孤立意图: “delete all files”)

11.2 GLM Agent 端到端问答

集成智谱 GLM-5.2 大模型,实现从用户自然语言提问到自然语言回复的完整链路:

用户: "帮我查北京天气"
  ↓ GLM 分析意图,选择 get_weather 工具
  ↓ 通过 JSON-RPC 调用 MCP Server
  ↓ Server 执行 get_weather(city="beijing")
  ↓ 返回 {temperature: 25, condition: "晴"}
  ↓ GLM 生成回复
用户收到: "北京今天天气晴,温度25℃,湿度60%。"

12. 未来扩展方向

方向 描述
多语言代码支持 扩展 Tree-sitter 解析器覆盖 Java、JavaScript、Rust 等语言
联邦安全验证 多个 MCP Server 共享 SCA 验证结果,避免重复计算
运行时行为监控 将静态 SCA 审计与动态沙箱监控结合,覆盖动态加载攻击
可视化安全面板 Web Dashboard 展示工具验证状态、投毒拦截记录、性能指标
关于

MCP-OS 是面向 OpenHarmony 的原生 Model Context Protocol (MCP) 协议栈实现。将细粒度工具描述与工具代码的语义一致性比较技术深度集成到协议栈安全层,在工具注册阶段自动检测投毒攻击,同时提供上下文压缩、缓存优化和原生系统服务集成。

449.2 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号