1. 从 LiteLLM 到 Agentjacking:MCP 网关漏洞与 Agent 权限越界复盘
6 月 15 日到 21 日这一周,AI 安全圈的关键词不再是「越狱」两个字。攻击者的注意力明显挪了位置——从让模型说错话,转向了模型背后那层代理与基础设施的接缝。MCP(Model Context Protocol)网关、Sentry 报错通道、npm 技能包,这些原本被当作「管道」的东西,成了新的入口。
如果你正在用 Claude Code、Cursor、Cline 这类 AI 编程代理,或者团队里已经跑起了 LangGraph、Langflow 编排的 Agent 工作流,这一周披露的几个案例值得你花半小时对照自查。核心问题只有一个:你的 Agent 能访问什么,网关信任谁,外部数据能不能变成可执行指令。
我按时间线把这一周的关键事件拆开,再给出可以直接复制的 MCP 服务端最小权限配置和 Agent 工具白名单示例,最后用本地脚本验证越权调用到底有没有被拦住。
1.1 攻击面迁移:网关和代理接缝成了主战场
LiteLLM 是这一周被提及最多的名字。作为企业统一 LLM 代理,它集中持有全部模型 API 密钥和下游流量,一旦沦陷,攻击者可以直接读取密钥、篡改提示与响应。本周披露的漏洞链包括:CVE-2026-42271,MCP 测试端点命令注入,已被 CISA 列入 KEV;CVE-2026-47101 / 47102,低权限用户可提权至 proxy_admin,已有反向 Shell 复现;与 Starlette BadHost 链式组合后,可实现无认证 RCE,组合 CVSS 达 10.0。修复动作很明确:升级至 ≥1.83.14-stable,同步升级 Starlette ≥1.0.1,审计 MCP 端点暴露面并轮换密钥。
比网关漏洞更隐蔽的是 Agentjacking。Tenet Security 披露的攻击链是这样的:攻击者向 Sentry 公开 DSN POST 伪造错误事件;开发者用 Claude Code、Cursor 等 AI 编程代理,通过 MCP 查询「未解决的 Sentry 问题」;代理把外部注入内容当作可信系统诊断并执行其中指令。受控测试中约 85% 的代理会执行恶意载荷,被动侦察发现 2,388 个组织暴露于可注入 DSN。全程都是授权行为,传统 EDR/WAF 很难检测。这意味着,MCP 集成如果没有对工具调用做人工审批或白名单限制,外部数据就能变成 RCE 触发器。
编排层同样没躲过。LangGraph 存在 SQL 注入(CVE-2025-67644)和不安全 msgpack 反序列化(CVE-2026-28277),可链式实现 RCE,须升级 langgraph ≥ 1.0.10。Langflow 的路径遍历 CVE-2026-5027 已在野利用,公网暴露实例应假设已失陷,立即打补丁并轮换密钥。
供应链侧,6 月 17 日 Mastra npm 投毒事件中,攻击者 88 分钟内重发 142 个 @mastra/ 包,周下载量超 110 万。JetBrains 平台出现 15 款伪装 DeepSeek/CodeGPT 助手的恶意 AI 插件,累计安装近 7 万次,明文 HTTP 外传 API 密钥。Trail of Bits 的测试显示,OpenClaw ClawHub、Vercel skills.sh 等多类扫描均未能拦截恶意技能包——「扫描通过」不能替代来源审查与运行时监控。
1.2 模型层风险:任务链内部失守与多模态舒适区
复旦大学等机构团队披露的 Fable 5 案例提出了「内部安全坍塌」(ISC)概念:通过 TVD(任务—验证—数据)结构,在一次对话、不足 5 秒内绕过前置安全分类器。Agent 为通过格式校验自动补全缺失数据,从而在任务链内部生成违规内容,不依赖传统提示注入。ISC-Bench 评测显示 60 余个前沿模型均暴露类似风险。
西湖大学 AGI Lab 发现多模态「攻击舒适区」(ACZ):有害文本渲染为低清、模糊图像后,多模态模型越狱成功率显著上升,形成倒 U 型风险曲线。例如 Qwen3-VL-32B 文本 ASR 36.7%,ACZ 图像 ASR 升至 86.2%。缓解方案是「先转写、再审查、后回答」的结构化认知卸载,可将 ASR 降至约 4%。
Brave 安全团队证实,间接提示注入可同时攻破云端与本地部署的 LLM 代理,根因在于架构无法可靠区分「开发者指令」与「外部数据」。英国 NCSC 警告:提示注入不宜类比 SQL 注入,或无法像 SQLi 一样彻底修复。高权限 Agent 被武器化的案例也在增加:Meta AI 客服被用于重置逾 2 万 Instagram 账号密码;Google 起诉 Outsider Enterprise,指控其利用 Gemini 批量生成 9,000 个钓鱼站;多伦多大学演示本地开源 LLM 驱动的自复制蠕虫,7 天实验网络渗透率达 62%,无固定 CVE 可补丁封堵。
1.3 防御侧反击与治理升温
防御侧这一周的关键词是「AI 加速找洞与补洞」。brutecat AI 模糊测试谷歌,90 天赏金超 50 万美元;Depthfirst AI 扫描 FFmpeg,约 1,000 美元成本发现 21 项零日,9 项已获 CVE;Anthropic 协助 OpenSSL,18 项漏洞近半由 Claude 协助发现。Project Glasswing / Mythos 推动 6 月 Patch Tuesday 超 200 CVE。Anthropic 同步开源 defending-code-reference-harness,提供从威胁建模到 gVisor 沙箱自主验证的完整参考框架。
SOC 转型方向是 Assume Breach + AI 双轨:AI 告警调查清理队列,AI 威胁狩猎发现未触发规则的横向移动。Mandiant 数据显示全球中位驻留时间从 11 天增至 14 天,Vectra AI 报告 SOC 日均 2,992 条告警,63% 未处置。运行时防护产品化也在加速:Microsoft Global Secure Access 在 SSE 层提供 Prompt Injection Protection;Fortinet FortiAIGate + NVIDIA 提供内联 LLM 流量零信任护栏,覆盖 MCP 与代理生态。
治理层面,美国首次在 AI API 层实施类出口管制,CISA 补丁新规将最高风险类别修补窗口缩短至 3 天。欧盟 AI 法案 8 月 2 日高风险义务全面生效。NIST 数学证明指出,任何固定时点的 AI 安全评估在结构上无法完整认证全部潜在行为,须转向持续监控与更新。
2. TaoToken 前置:用统一网关收拢 MCP 与 Agent 的密钥暴露面
这一周的事件反复指向同一个问题:密钥和权限散落在各个 MCP 服务端、各个 Agent 工具配置里,一旦某个接缝被突破,攻击者就能横向移动。如果你同时用 Claude Code、Cline、Codex 等多个代理,每个都直连不同的模型供应商,密钥管理本身就是攻击面。
TaoToken 在这里的角色是统一网关:把模型调用收敛到一个 Base URL,密钥集中管理,MCP 服务端和 Agent 工具通过统一入口访问模型,减少「每个工具各存一份 Key」的暴露面。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api (不加 UTM)。
需要说清楚的是,TaoToken 不是「绕过什么」的工具,它是一个正常的 API 网关服务,适合需要统一管理多个模型调用、希望减少密钥散落风险的开发者和团队。你可以在模型对话页面先验证模型可用性,在 console 里管理项目和额度,在 api-keys 页面生成和管理密钥。
对于这一周的安全复盘来说,TaoToken 的价值在于:当你的 MCP 服务端和 Agent 工具都通过统一网关调用模型时,你只需要在一个地方轮换密钥、审计调用、限制权限。而不是在 LiteLLM、Sentry MCP、各个 IDE 插件里分别处理。
如果你还在用直连方式,建议至少把密钥管理收拢。具体操作:登录后进入 console,创建一个项目,在 api-keys 页面生成密钥,然后在 Claude Code 或 Cline 的配置里把 Base URL 指向 https://taotoken.net/api ,Model ID 填你实际使用的模型。这样后续如果某个 MCP 服务端需要隔离,你只需要在网关侧禁用对应密钥,不用逐个工具去改。
3. 可复制配置:MCP 服务端最小权限与 Agent 工具白名单
这一节给两份可以直接复制的配置。第一份是 MCP 服务端的最小权限配置片段,第二份是 Agent 工具白名单示例。路径和字段名按常见 MCP 客户端约定来写,你按自己实际使用的客户端调整。
3.1 MCP 服务端最小权限配置(JSON)
以下配置放在 MCP 客户端的 servers 配置段中。核心思路是:只暴露必要的工具,禁用文件系统写入和命令执行类工具,对 Sentry 这类外部数据源做只读限制。
{ "mcpServers": { "sentry-readonly": { "command": "npx", "args": ["-y", "@sentry/mcp-server@latest"], "env": { "SENTRY_DSN": "${SENTRY_DSN}", "SENTRY_AUTH_TOKEN": "${SENTRY_AUTH_TOKEN}", "SENTRY_READ_ONLY": "true", "SENTRY_MAX_ISSUES": "20" }, "disabledTools": [ "create_issue", "update_issue", "delete_issue", "execute_command" ] }, "filesystem-readonly": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem@latest", "/workspace/readonly"], "env": { "FS_READ_ONLY": "true" }, "disabledTools": [ "write_file", "delete_file", "move_file" ] } } }关键点:SENTRY_READ_ONLY和FS_READ_ONLY是自定义环境变量,你的 MCP 服务端需要支持读取这些变量并据此限制行为。如果服务端不支持,至少在客户端侧用disabledTools把写操作和命令执行工具禁掉。SENTRY_MAX_ISSUES限制单次查询返回条数,减少注入内容进入上下文的机会。
3.2 Agent 工具白名单示例(TOML)
如果你用的是支持 TOML 配置的 Agent 框架,下面这份白名单可以直接参考。原则是:默认拒绝,只放行明确需要的工具。
[agent] name = "coding-assistant" default_policy = "deny" [agent.tools] allowed = [ "read_file", "list_directory", "search_code", "query_sentry_issues_readonly" ] [agent.tools.denied] patterns = [ "execute_*", "write_*", "delete_*", "shell_*", "network_*" ] [agent.approval] require_human_approval = [ "query_sentry_issues_readonly" ] approval_timeout_seconds = 300default_policy = "deny"意味着没有明确放行的工具一律不可用。require_human_approval对 Sentry 查询这类外部数据源强制人工审批,直接对应 Agentjacking 的缓解措施——不让代理自动执行外部注入内容。
3.3 Claude Code / Cline / Codex 三件套配置
如果你用 Claude Code、Cline 或 Codex,接入 TaoToken 时需要写全三件套:Base URL、Key、Model ID。
Claude Code 的 settings 配置示例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-taotoken-key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }Cline 的 MCP 配置在 settings 里,Base URL 填 https://taotoken.net/api ,API Key 填你在 api-keys 页面生成的密钥,Model ID 按实际使用的模型填写。
Codex 的 auth.json 配置示例:
{ "openai_base_url": "https://taotoken.net/api", "openai_api_key": "sk-your-taotoken-key", "model": "gpt-4o" }三件套缺一不可。只填 Base URL 不填 Key 会报 401,只填 Key 不填 Model ID 会报 model not found。
4. 验证请求:用本地脚本确认越权调用被拦截
配置写完不算完,得验证越权调用到底有没有被拦住。这一节给一个本地 Python 脚本,模拟 Agent 尝试调用被禁用的工具,检查是否被拒绝。
4.1 验证脚本
import json import subprocess import sys def check_tool_allowed(tool_name, config_path): with open(config_path, "r") as f: config = json.load(f) allowed = config.get("agent", {}).get("tools", {}).get("allowed", []) denied_patterns = config.get("agent", {}).get("tools", {}).get("denied", {}).get("patterns", []) if tool_name in allowed: return True, "allowed by whitelist" for pattern in denied_patterns: prefix = pattern.replace("*", "") if tool_name.startswith(prefix): return False, f"denied by pattern: {pattern}" return False, "denied by default policy" def test_unauthorized_call(): config_path = "agent_config.json" test_tools = [ "read_file", "execute_shell", "write_file", "query_sentry_issues_readonly", "delete_file" ] print("=== 越权调用拦截验证 ===") for tool in test_tools: allowed, reason = check_tool_allowed(tool, config_path) status = "PASS" if not allowed else "FAIL" print(f"[{status}] {tool}: {reason}") print("\n=== 验证完成 ===") if __name__ == "__main__": test_unauthorized_call()运行方式:把上面的 Agent 工具白名单配置保存为agent_config.json,然后执行python3 test_unauthorized_call.py。预期输出中,execute_shell、write_file、delete_file应该显示 PASS(被拦截),read_file和query_sentry_issues_readonly显示 FAIL(被放行,符合白名单预期)。
4.2 验证 MCP 服务端只读限制
对于 MCP 服务端,可以用 curl 直接测试只读限制是否生效。假设你的 MCP 服务端暴露了 HTTP 接口:
curl -X POST http://localhost:3000/mcp/tools/call \ -H "Content-Type: application/json" \ -d '{"tool": "write_file", "args": {"path": "/tmp/test.txt", "content": "test"}}'如果配置正确,应该返回类似{"error": "tool not allowed: write_file"}的响应。如果返回成功写入,说明disabledTools没生效,需要检查 MCP 客户端是否真的加载了配置。
4.3 验证 TaoToken 接入是否正常
用 curl 验证 TaoToken 网关连通性:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-your-taotoken-key" \ -H "Content-Type: application/json" \ -d '{"model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "ping"}]}'返回 200 且包含 choices 字段,说明接入正常。如果返回 401,检查 Key 是否正确;如果返回 model not found,检查 Model ID 是否拼写正确。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一周的安全事件里,很多问题出在配置细节上。下面按真实报错逐个排查。
5.1 401 Unauthorized
最常见的原因是 Key 没填、Key 过期、或者 Base URL 和 Key 不匹配。检查顺序:先确认ANTHROPIC_API_KEY或openai_api_key字段填的是 TaoToken 生成的密钥,不是其他平台的 Key;再确认 Base URL 是 https://taotoken.net/api ,没有多余斜杠;最后去 console 确认密钥状态是否正常。如果刚轮换过密钥,记得所有 MCP 服务端和 Agent 工具都要同步更新。
5.2 local proxy failed
这个报错通常出现在 Claude Code 或 Cline 通过本地代理转发请求时。原因可能是本地代理端口被占用,或者代理配置指向了错误的 Base URL。排查动作:检查本地代理进程是否在运行,确认代理配置里的 upstream 指向 https://taotoken.net/api ,重启代理后重试。如果不用本地代理,直接在客户端配置里填 Base URL 即可。
5.3 reading choices 报错
reading 'choices'或cannot read property 'choices' of undefined通常意味着 API 返回的不是标准 OpenAI 格式响应。可能原因:Base URL 填成了不带/v1的路径,或者 Model ID 不被网关识别。检查 Base URL 是否包含正确的 API 路径,Model ID 是否在 TaoToken 支持的模型列表里。如果用的是 Anthropic 格式接口,确认客户端是否支持该格式。
5.4 OAuth 相关报错
如果你用 Claude Code 的 OAuth 登录方式,同时又在环境变量里配了ANTHROPIC_API_KEY,可能会冲突。排查动作:确认你是用 API Key 方式还是 OAuth 方式,二选一。用 API Key 方式时,清掉 OAuth 相关的 token 缓存;用 OAuth 方式时,不要同时配ANTHROPIC_API_KEY。如果报OAuth token expired,重新走一遍登录流程。
5.5 MCP 工具调用被静默忽略
配置了disabledTools但工具还是被调用了,检查 MCP 客户端版本是否支持该字段。部分旧版本客户端不识别disabledTools,需要在服务端侧做限制。另外确认配置文件的路径是否正确,有些客户端会从多个位置加载配置,优先级不同。
6. 把 Agent 纳入 IAM:持续监控比一次性评估更实际
NIST 的数学证明说得很清楚:任何固定时点的 AI 安全评估在结构上无法完整认证全部潜在行为。这一周的事件也印证了这一点——LiteLLM 漏洞链、Agentjacking、Mastra 投毒,都不是一次性扫描能拦住的。
实际可做的动作:把 AI Agent 纳入 IAM 身份生命周期,禁止默认继承人类全量权限;对 MCP 集成做清单盘点,按 OWASP Agentic Top 10 限制工具权限;对多模态和 RAG 流水线引入「转写—审查—回答」串行架构;SOC 流程落地 Assume Breach,AI 告警调查和假设驱动狩猎双轨并行。
如果你需要统一管理多个 Agent 的模型调用和密钥,可以从 https://taotoken.net/api-keys 生成密钥,在 https://taotoken.net/doc 查看接入文档,先在 https://taotoken.net/chat 验证模型可用性,再决定是否上 Coding Plan 做长期编码和 Agent 工作流。密钥集中管理、调用集中审计,至少能让接缝处的默认信任少一点。