当开发者使用 Claude Code、Cursor 或其他 AI 编程助手时,这些工具会频繁调用外部 API 与各类服务交互。传统安全方案往往聚焦于网络层流量监控或应用层 API 审计,但工具调用层的参数校验却长期处于盲区。攻击者可以通过提示注入、工具毒化或跨工具污染等手段,在看似正常的工具调用中夹带恶意参数,最终实现数据窃取或权限提升。MITM 代理在此场景下的价值,在于它能够透明地拦截工具层流量,对每一条工具调用的输入输出进行即时校验,并将可疑行为记录下来供后续分析。
工具调用层的安全盲区
LLM 工具调用与普通 API 请求存在本质差异。传统 API 调用通常由开发者代码显式触发,参数类型和取值范围在编译期或静态配置阶段即可确定。而 LLM 工具调用则是由模型在运行时动态生成,参数可能包含自由文本、JSON 结构化数据甚至嵌套的函数调用。这种动态性导致两个核心风险:其一是参数完整性无法保证,恶意提示可能诱导模型生成包含敏感路径或认证令牌的参数;其二是跨工具污染难以防范,攻击者可以通过污染一个工具的上下文,间接影响其他工具的行为。
从攻击向量来看,学术界已经识别出超过二十种针对工具调用层的攻击技术。这些攻击可以大致分为四类:上下文注入类攻击通过在提示中嵌入恶意指令,改变工具调用的目标或参数;工具毒化类攻击修改工具定义或描述,使得模型选择错误或参数畸形的工具;跨工具污染利用工具间共享的上下文状态,将恶意数据从一个工具传递到另一个工具;协议层面的攻击则针对 MCP、OpenAI Function Calling 等协议规范本身,构造协议解析器未能预期的异常数据。
MITM 代理的部署架构
在工具层部署 MITM 代理,需要解决透明性和完整性的双重挑战。透明性要求代理对上层应用完全不可见,工具代码无需任何修改即可正常工作;完整性要求代理能够捕获所有流量,包括 TLS 加密的 HTTPS 请求和 WebSocket 长连接。实现这两个目标的技术路径有多种,但在 LLM 工具场景下,我们推荐基于透明代理转发加本地证书绑定的方案。
具体部署时,首先需要在宿主机上生成一个自签名 CA 证书,并将其导入系统的信任根证书存储。对于 macOS 系统,这一步可以通过安全偏好设置中的 "导入项目" 完成;对于 Linux 发行版,通常需要将证书复制到 /usr/local/share/ca-certificates/ 目录并执行 update-ca-certificates;Windows 系统则通过 certlm.msc 控制台将证书导入 "受信任的根证书颁发机构"。代理软件本身监听本地的一个端口,例如 8080 或 8899,并将所有出站流量透明转发到目标服务器。关键配置项包括 ssl_cert_verify 设为 false 以跳过服务器证书验证、transparent 设为 true 以启用透明模式、http2_support 设为 true 以兼容支持 HTTP/2 的 API 端点。
代理与上游工具之间的连接建议使用 HTTP/1.1 协议,虽然许多 LLM API 已经支持 HTTP/2,但部分旧版 SDK 在处理分块传输编码时存在兼容性问题。超时参数需要根据实际场景调整:连接超时建议设为 10 秒,读取超时建议设为 60 秒,写入超时建议设为 30 秒。对于需要流式响应的 API 调用,代理必须支持 chunked transfer encoding 的即时转发,否则会出现响应截断或超时。
参数校验规则设计
工具层流量拦截的核心价值在于参数校验。校验规则的设计需要在安全性和可用性之间取得平衡:过于严格的规则会产生大量误报,干扰正常开发流程;过于宽松的规则则无法有效防范攻击。我们建议采用分层校验策略,将规则分为必须匹配、建议检查和可选审计三个级别。
必须匹配的规则用于检测高风险异常。文件路径类参数应当验证其是否位于预期的安全目录之内,例如不允许路径穿越到 /etc/、/root/ 或项目根目录之外;允许的路径前缀列表应当通过配置文件维护,并支持按工具类型差异化配置。URL 类参数应当验证其域名是否在允许列表中,禁止直接 IP 访问和非常规端口;允许列表应当支持通配符和正则表达式,以便适配动态上线的服务。API 密钥或令牌类参数应当检测其格式是否符合预期格式,并检查是否与已知泄露密钥数据库匹配。JSON 结构化参数应当验证其 schema 是否符合工具定义,对于缺少必需字段或包含额外字段的情况给出警告。
建议检查的规则用于发现潜在风险。字符串长度超过 4096 字节的参数应当记录,因为过长的参数可能暗示提示注入尝试;递归深度超过 3 层的嵌套 JSON 结构应当警告,因为深层嵌套可能用于绕过解析器限制;包含连续三个以上相同字符的参数应当标记,因为这类模式常见于填充式攻击或边界测试。可选审计的规则用于事后溯源,记录所有工具调用的完整请求响应,保存时间建议设为 7 天,对于高风险场景可以延长至 30 天。
校验规则的执行顺序直接影响检测效果。我们建议先执行格式校验,再执行长度校验,最后执行语义校验。格式校验失败应当直接阻断请求并返回错误响应,防止畸形容对下游服务造成影响;长度校验失败应当记录并降级处理,允许请求继续转发但添加监控标记;语义校验失败应当仅记录,不影响正常流程。
检测模式与响应策略
针对工具调用层的典型攻击模式,代理应当内置相应的检测逻辑。提示注入类攻击的检测相对困难,因为恶意指令往往隐藏在正常提示的上下文中。我们建议采用关键词匹配加行为分析的混合方法:关键词匹配检测注入类指令的典型表述,例如 "ignore previous instructions"、"you are now a different persona"、"```system" 等;行为分析则关注工具调用的异常模式,例如同一会话中调用频率突增、调用参数与历史模式显著偏离、或调用目标突然切换到新域。
跨工具污染的检测需要维护工具间的上下文关联。当检测到某个工具的输出包含敏感数据时,应当追踪后续工具调用是否使用了这些数据作为输入。具体实现上,代理可以为每个会话维护一个上下文标签图,记录哪些数据被哪些工具消费过。当标签图的深度超过阈值或出现循环引用时,应当触发告警。工具选择异常的检测则依赖于工具描述的语义分析。当模型选择了一个与任务描述不匹配的工具时,代理应当计算任务描述与工具描述的语义相似度,低于阈值时给出警告。
响应策略应当根据风险等级分级处置。低风险异常仅记录到审计日志,不采取任何阻断动作;中风险异常在记录的同时添加请求标记,便于后续批量分析;高风险异常应当即时阻断请求,向客户端返回 403 Forbidden 响应,并在告警通道推送通知。响应中应当包含足够的信息帮助开发者理解阻断原因,但不应暴露检测规则的具体细节,防止攻击者据此调优攻击策略。
监控指标与阈值设定
有效的监控是验证代理效果的基础。我们建议采集四类核心指标:流量指标包括每秒请求数、平均响应大小、错误率分布;校验指标包括规则触发次数、规则命中率、按风险等级的阻断率;性能指标包括代理延迟、端到端延迟、并发连接数;安全指标包括独特威胁类型计数、高危事件计数、溯源完成率。
具体的阈值设定需要根据实际业务规模调整,但以下数值可作为初始参考:每秒请求数超过 1000 时应当触发容量告警;错误率超过 5% 时应当检查配置或网络状态;单一规则在 1 分钟内触发超过 50 次时应当审查该规则是否过于宽松;代理延迟超过 100ms 时应当考虑水平扩展或性能优化。监控面板应当同时展示实时数据和历史趋势,便于发现突发异常和渐进式退化。
告警通道的选择应当考虑响应时效性。对于阻断类事件,建议使用即时通讯工具的机器人接口推送告警,确保安全团队能够在 5 分钟内获知;对于记录类事件,可以汇总后在固定时间窗口发送邮件报告。告警去重和聚合机制必不可少,否则单一异常事件可能触发大量重复告警,导致告警疲劳。
日志留存与溯源分析
完整的日志是事后调查和合规审计的基础。日志应当记录每个请求的以下字段:唯一标识符、时间戳、源 IP 和端口、目标 URL、HTTP 方法和状态码、请求头和响应头的脱敏版本、请求体和响应体的摘要、校验规则执行结果、处理耗时。这些字段应当以结构化格式存储,推荐使用 JSON Lines 格式,便于后续解析和检索。
日志留存策略应当平衡存储成本和合规要求。对于审计类日志,建议保留 30 天后归档到冷存储,再保留 1 年后删除;对于阻断类日志,建议保留 1 年后归档,再保留 5 年后删除。敏感字段在存储前应当脱敏,例如将 API 密钥替换为其哈希值,将完整 URL 替换为路径和参数的组合。日志访问应当实施最小权限原则,仅安全团队和合规团队可以查看完整日志,其他角色仅能查看聚合统计。
溯源分析通常从时间线重构开始。分析师首先根据告警时间定位到相关日志条目,然后向前追溯该会话的早期请求,向后追踪攻击的后续影响。关键在于建立请求之间的关联关系,包括会话标识、用户标识和调用链追踪。代理应当在每个请求中注入追踪头,使得请求在多个服务之间的流转可以被完整串联。
部署注意事项
MITM 代理的部署并非一劳永逸,需要持续关注以下问题。证书管理是首要任务,自签名 CA 证书的有效期通常为一年,应当提前设置日历提醒进行更换;证书更换需要同步更新所有客户端的信任配置,建议使用配置管理工具自动化这一过程。兼容性测试应当在每次代理更新后执行,覆盖主流的 LLM 工具和 API 客户端,重点验证认证流程和流式响应处理。性能基线应当定期更新,当业务量增长或工具调用模式改变时,原有阈值可能不再适用。
容灾设计同样不可忽视。当代理本身发生故障时,应当确保客户端能够绕过代理直接访问目标服务,这可以通过操作系统的路由策略或客户端配置实现。代理应当支持热重载配置,在不中断服务的情况下更新校验规则或阈值参数。健康检查接口应当暴露代理的运行状态,便于负载均衡器或容器编排系统进行故障转移。
资料来源
本文核心信息来自以下公开资源:Sherlock 项目的 GitHub 仓库展示了实时终端仪表盘的 LLM 流量拦截实现;arXiv 论文《From Prompt Injections to Protocol Exploits: Threats in LLM-Powered AI Agents Workflows》系统分类了三十余种针对 LLM 代理的攻击技术;Medium 文章《Model Context Protocol (MCP) Attacks: Threats, Taxonomy, and Defenses》详细分析了 MCP 协议层面的二十余种攻击向量和防御措施。