
最近折腾AI Agent安全审计,踩了几个坑,这篇把问题说清楚。
AI Agent和MCP(Model Context Protocol,模型上下文协议)服务器快速普及,引入了一个传统安全工具从未覆盖过的攻击面。过去90天,我们研究团队对10个主流AI框架——包括CrewAI、AutoGen、LlamaIndex、LangGraph、Dify和Haystack——进行了系统性的AI安全审计,发现了24种影响生产LLM系统的漏洞模式。
这篇分享我们的方法论、关键发现,以及为运行LLM漏洞评估项目的团队提供的实操建议。
传统Web应用安全关注注入、认证失效和配置错误。AI Agent引入了三个全新的风险类别:
在执行MCP渗透测试时,我们发现超过60%的MCP服务器实现在工具执行层面缺乏基本的访问控制——任何连接的客户端都可以调用任何已注册的工具,包括伪装成只读调用的破坏性写操作。
我们的组件正确性标准(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µs、P99=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代理实现进行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作为透明代理的部署。
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环境确认。
基于我们在10个框架集成和80K API轨迹上的经验,以下是大规模运行LLM漏洞评估的实操方法论:
用CCS规则集运行你的Agent代码库:
exec()、eval()、subprocess.Popen()与用户输入的组合os.path.join()或Path()调用中未过滤的参数readOnlyHint和工具注册表的访问控制对于每个静态发现:
通过适当渠道提交发现:
AI安全领域的演进速度超过了大多数组织的跟进能力。基于我们的研究流水线,以下是重点关注的三个方向:
如果你的团队正在运行AI安全审计,或者需要为你的部署做MCP渗透测试,我们的CCS扫描器和方法论以开源工具形式提供。24条检测规则驱动着我们的公开扫描器和企业审计服务。