site logo

Marico's space

AI Agent 安全审计:从 MCP 渗透测试到 LLM 漏洞评估

AI技术与应用 2026-07-30 20:56:18 4

最近折腾AI Agent安全审计,踩了几个坑,这篇把问题说清楚。

AI Agent和MCP(Model Context Protocol,模型上下文协议)服务器快速普及,引入了一个传统安全工具从未覆盖过的攻击面。过去90天,我们研究团队对10个主流AI框架——包括CrewAI、AutoGen、LlamaIndex、LangGraph、Dify和Haystack——进行了系统性的AI安全审计,发现了24种影响生产LLM系统的漏洞模式。

这篇分享我们的方法论、关键发现,以及为运行LLM漏洞评估项目的团队提供的实操建议。

新的攻击面:为什么AI Agent与众不同

传统Web应用安全关注注入、认证失效和配置错误。AI Agent引入了三个全新的风险类别:

  1. 工具级完整性失效 — Agent可能被欺骗调用内部工具并传入恶意参数,绕过人工确认的保障机制
  2. Prompt到代码的权限升级 — 用户Prompt经过Agent推理循环后,可能被执行为系统命令
  3. MCP协议级绕过 — 代理服务器转发工具调用时不验证意图或范围

在执行MCP渗透测试时,我们发现超过60%的MCP服务器实现在工具执行层面缺乏基本的访问控制——任何连接的客户端都可以调用任何已注册的工具,包括伪装成只读调用的破坏性写操作。

CCS方法论:24条规则、10个框架、4个平台

我们的组件正确性标准(CCS,Component Correctness Standard)扫描器采用24条检测规则,按漏洞类别组织:

类别 规则数 覆盖范围
代码注入(Python/JS/Shell) 6 通过eval/exec/spawn/subprocess实现RCE
路径穿越 4 文件操作中未过滤的用户输入
SSRF/开放重定向 3 Agent工具调用中未验证的URL
不安全的反序列化 3 Pickle/yaml/JSON解析器滥用
SQL注入(格式化字符串) 2 动态查询构建
凭据泄露 2 源码中的硬编码令牌
MCP特定(readOnlyHint绕过) 2 协议级授权漏洞
供应链(npm/PyPI混淆) 2 依赖混淆向量

扫描器已通过80,000条API调用轨迹(20,000条公开验证 + 60,000条储备)验证,覆盖13家提供商33个模型。性能基准测试显示每条规则评估P50=22µsP99=99µs,适合运行时防护栏部署。

实战发现

我们的框架集成行动(2026年7月)确认了多个知名项目存在的漏洞:

项目 漏洞类型 CVSS评分 状态
Revis(蚂蚁集团) 路径穿越 7.5(HIGH) 已提交蚂蚁SRC(QTVA-2026-10862552)
CodeAnalysis(腾讯) 通过task_id实现路径穿越 7.5(HIGH) 已提交腾讯SRC(QTVA-2026-10862567)
Monolith+verl(字节跳动) 工具参数注入 7.0(HIGH) 已提交字节SRC(QTVA-2026-10862588)
LLaMA-Factory(360) 通过模型加载实现SSRF 7.5(HIGH) 已提交360SRC(QTVA-2026-10862618)
Light-R1(深度求索) 路径穿越 7.0(HIGH) 已提交360SRC(QTVA-2026-10862636)
fdp-mcp-server 缺少readOnlyHint检查 7.5(HIGH) 已提交补天
Dify SQL注入(f-string) 8.0(HIGH) 已提交补天(QTVA-2026-10861217)
Stripe-MCP 元数据注入 7.0(HIGH) 已提交补天(QTVA-2026-10861865)

所有发现已通过负责任的披露渠道提交,包括补天、HackerOne、Bugcrowd、ZDI和MSRC——实现了100%提交流程自动化

深度解析:MCP安全审计案例研究

案例1:fdp-mcp-server — readOnlyHint绕过

在对MCP代理实现进行AI安全审计时,我们发现fdp-mcp-server的_call_tool函数(位于proxy_server.py:87)将所有工具请求转发到后端时没有检查readOnlyHint标志

async def _call_tool(req: types.CallToolRequest) -> types.ServerResult: result = await remote_app.call_tool( req.params.name, (req.params.arguments or {}) ) return types.ServerResult(result)

MCP协议规范在ListToolsResult返回的Tool对象上定义了readOnlyHint字段,用于标识只读意图。由于代理从不验证此标志,攻击者可以通过代理调用破坏性写操作,即使客户端配置为只读访问。

影响:任何缺少readOnlyHint验证的MCP代理服务器实际上等于废掉了协议的访问控制机制。这影响了所有使用fdp-mcp-server作为透明代理的部署。

案例2:CodeAnalysis路径穿越(腾讯)

CodeAnalysis客户端的taskdirmgr.py使用从服务器API响应直接获取的task_id,通过os.path.join()构造文件路径:

def acquire_task_dir(self, task_id): task_dir = os.path.join(self._task_dirs_root, f"task_{task_id}") os.makedirs(task_dir, exist_ok=True) return task_dir, task_id

由于task_id(位于looprunner.py:204)来自task_request.get('id')且零验证,攻击者如果控制服务器或进行中间人攻击,可以提供../../etc/evil作为任务ID,导致在预期工作区外创建任意目录。已在Linux和Windows环境确认。

构建你的LLM漏洞评估流水线

基于我们在10个框架集成和80K API轨迹上的经验,以下是大规模运行LLM漏洞评估的实操方法论:

阶段1:静态分析(24条规则)

用CCS规则集运行你的Agent代码库:

  • 代码注入检查器:grep查找exec()eval()subprocess.Popen()与用户输入的组合
  • 路径穿越检查器:识别os.path.join()Path()调用中未过滤的参数
  • 凭据扫描器:用正则匹配API密钥、令牌和硬编码密钥
  • MCP协议检查器:验证readOnlyHint和工具注册表的访问控制

阶段2:动态测试

对于每个静态发现:

  1. 用最小化PoC复现漏洞
  2. 记录完整攻击链(不仅是代码位置)
  3. 在受控测试环境中验证影响

阶段3:负责任的披露

通过适当渠道提交发现:

  • 开源项目:GitHub Advisory + 直接联系维护者
  • 企业SRC:蚂蚁SRC/腾讯SRC/字节SRC/360SRC(面向中国厂商)
  • 漏洞赏金:HackerOne / Bugcrowd(针对符合条件的项目)
  • ZDI/MSRC:针对微软生态系统的漏洞

AI Agent安全的下一步

AI安全领域的演进速度超过了大多数组织的跟进能力。基于我们的研究流水线,以下是重点关注的三个方向:

  1. Agent间协议安全 — 随着多Agent系统增长,Agent间通信渠道成为首要攻击面
  2. LLM依赖的供应链审计 — 模型加载、LoRA适配器下载和插件生态系统基本未经审查
  3. 运行时防护栏绕过 — 即使有输入验证,巧妙的Prompt工程也能绕过安全层

如果你的团队正在运行AI安全审计,或者需要为你的部署做MCP渗透测试,我们的CCS扫描器和方法论以开源工具形式提供。24条检测规则驱动着我们的公开扫描器和企业审计服务。