2026/10/11 22:56:04

CVE-2026-9739深度解析:Google MCP Toolbox 9.4分高危漏洞,AI Agent直连数据库模式全面崩盘

CVE-2026-9739深度解析:Google MCP Toolbox 9.4分高危漏洞,AI Agent直连数据库模式全面崩盘 1. 从 CVE-2026-9739 说起AI Agent 直连数据库为什么突然不香了CVE-2026-9739 这个编号最近在安全圈和 AI 工程圈被反复提起。它指向的是 Google 官方推出的 MCP Toolbox for Databases一个专门给 AI Agent 提供数据库访问能力的连接器组件。CVSS 4.0 评分 9.4属于临界高危。受影响版本覆盖 v1.0.0 到 v1.3.2 的所有公开稳定版涉及 PostgreSQL、BigQuery、MySQL、SQL Server、MongoDB、Snowflake 等主流数据库。这个漏洞之所以让很多人紧张不是因为它技术多复杂而是因为它击穿了一个被广泛默认的安全假设大模型通过可信连接器访问内部数据是安全的。很多团队在搭 AI Agent 的时候图省事直接让 Agent 通过 MCP Toolbox 连到生产库觉得只要内网隔离、只要连接器是官方出的就万事大吉。CVE-2026-9739 把这个假设直接打碎了。漏洞的核心是 SSE 初始化处理器里硬编码了Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true。这两个响应头一出来浏览器层面的跨域限制就形同虚设。更麻烦的是业务层虽然写了 allowedOrigins 白名单校验但那个校验在硬编码头之后执行浏览器已经根据通配符放行了请求403 永远不会真正生效。攻击者只需要诱导管理员点一次恶意链接配合 DNS 重绑定就能让恶意 JS 以同源身份向内网 MCP 服务器发起 SSE 长连接拿到 sessionId 之后遍历数据库连接、执行任意查询、把数据外传。我试过在本地复现这个链路整个过程比想象中顺滑。攻击门槛低到不需要任何 0day 利用技巧就是一个 CORS 配置优先级错误加上 DNS 重绑定。对于部署了 MCP Toolbox 且暴露在可访问网络中的团队来说这基本等于数据库大门敞开。这篇文章不打算只停留在漏洞分析层面。更实际的问题是在升级到 v1.3.3 之前你怎么快速核查自己的 MCP Toolbox 配置有没有踩坑怎么在本地复现验证风险以及更长期的怎么通过统一的 Key/API 通道把 Agent 的数据库访问入口收敛起来避免每个 Agent 都直连数据库这种危险模式。下面按可跟做的步骤来。2. TaoToken 前置准备统一 Key 与 API 通道收敛 Agent 访问入口在讲具体配置之前先说一下为什么要把 TaoToken 放在前面。CVE-2026-9739 暴露的不只是 MCP Toolbox 一个组件的代码缺陷它暴露的是 AI Agent 直连数据库这种架构模式的系统性风险。每个 Agent 自己拿数据库凭据、自己建连接、自己执行 SQL凭据散落在各个 MCP 配置里一旦某个连接器被攻破攻击者拿到的是全量数据库权限。TaoToken 在这里的角色是作为统一的模型与工具调用通道。你可以把它理解成 Agent 和底层资源之间的一个收敛层Agent 不再直接持有数据库凭据而是通过 TaoToken 的 API 通道发起请求由通道侧统一管理 Key、统一做鉴权和审计。这样即使某个 Agent 的配置泄露攻击者拿到的也只是一个受控的 API Key而不是数据库的 root 密码。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。如果你要管理模型对话走 https://taotoken.net/api-keys 如果是长期编码或 Agent 场景建议看 Coding Plan 相关入口。具体操作上你需要先拿到一个 API Key。登录 console 之后在 API Keys 页面创建一个新的 Key权限范围建议只勾选你实际需要的模型和工具调用权限不要图省事给全量。创建完成后你会得到类似sk-xxxxxxxx的字符串这个就是后续所有配置里要填的 Key。这里有个容易踩的坑很多人把 TaoToken 的 Key 和数据库凭据混在一起管理觉得反正都是密钥。实际上这两者应该严格分离。TaoToken 的 Key 只负责模型和工具调用通道的鉴权数据库凭据应该由通道侧或独立的安全代理层管理Agent 本身不应该接触到原始数据库密码。这个分离原则在后面配置 MCP Toolbox 的时候会反复用到。另外如果你用的是 Claude Code 或者类似的编码 AgentTaoToken 的接入文档里有对应的 Base URL 配置说明。核心是三件套Base URL 填https://taotoken.net/apiKey 填你刚创建的sk-开头的字符串Model ID 根据你实际使用的模型填写。这三项缺一不可少填一个就会出现 401 或者 model not found。3. 可复制配置MCP Toolbox 配置核查清单与 TaoToken 接入片段这一节给可直接复制的内容。先给 MCP Toolbox 的配置核查清单再给 TaoToken 的接入配置片段。MCP Toolbox 的配置文件通常是tools.yaml或者通过环境变量注入。你需要重点核查以下几个位置。第一检查security.allowedOrigins是否被正确设置并且确认没有硬编码的通配符覆盖它。第二检查 SSE 相关路由的响应头确认Access-Control-Allow-Origin不是*。第三检查Access-Control-Allow-Credentials是否被设置为true且没有配合白名单。第四确认版本号是否在 v1.3.3 以下。下面是一个核查用的配置片段你可以对照自己的tools.yaml逐项检查# tools.yaml 安全相关配置核查项 security: # 必须显式设置白名单不能为空 allowedOrigins: - https://your-company.com - https://agent.your-company.com # 禁止在配置中出现通配符 # allowedOrigins: [*] - 这是危险配置必须删除 # 凭据传递必须配合白名单使用 allowCredentials: true # 审计日志必须开启 auditLog: enabled: true output: siem-endpoint如果你在 Nginx 反向代理层做临时防护可以用下面的配置拦截非法跨域请求。注意proxy_hide_header要放在add_header之前确保后端返回的硬编码头被移除location /sse/init { proxy_hide_header Access-Control-Allow-Origin; proxy_hide_header Access-Control-Allow-Credentials; add_header Access-Control-Allow-Origin https://your-company.com always; add_header Access-Control-Allow-Credentials true always; if ($http_origin !~* ^https?://.*\.your-company\.com$) { return 403; } proxy_pass http://mcp-backend:8080; }接下来是 TaoToken 的接入配置。如果你用的是 Claude Code 或者类似的 Agent 工具配置文件通常是settings.json或者auth.json。下面给一个通用的 JSON 配置片段路径和字段名根据你实际使用的工具调整{ baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, modelId: claude-sonnet-4-20250514, timeout: 60000, maxRetries: 3 }如果你用的是 Codex 的auth.json结构类似但字段名可能是base_url和api_key。关键是 Base URL 必须指向https://taotoken.net/api不要带 UTM 参数也不要多加斜杠。Model ID 根据你实际调用的模型填写不确定的话可以在模型对话页面先测试一下。对于 Cline MCP 或者 CC Switch 这类工具配置逻辑是一样的三件套Base URL、Key、Model ID。CC Switch 里通常有一个providers数组每个 provider 包含baseUrl、apiKey、models字段。把 TaoToken 作为一个 provider 加进去然后在 Agent 配置里引用这个 provider 即可。这里要强调一个原则MCP Toolbox 的数据库连接配置和 TaoToken 的 API 配置应该分开管理。MCP Toolbox 负责数据库连接池和查询执行TaoToken 负责模型调用和工具调用的通道鉴权。两者通过 Agent 的编排逻辑串联而不是让 Agent 直接持有数据库凭据。这样即使 MCP Toolbox 出现类似 CVE-2026-9739 的漏洞攻击者能拿到的也只是通道层面的受限权限而不是数据库的全量访问权。4. 验证请求与成功结果本地复现 CVE-2026-9739 风险链路这一节给可执行的验证步骤。你可以在本地或测试环境复现 CVE-2026-9739 的风险链路确认自己的 MCP Toolbox 实例是否存在同样的问题。注意只在你有权限的环境里操作不要对生产系统做未授权测试。第一步确认 MCP Toolbox 版本。用 curl 请求版本接口curl -s http://localhost:8080/api/version如果返回的版本号在 v1.0.0 到 v1.3.2 之间说明存在漏洞风险。如果返回 v1.3.3 或更高说明已经修复。第二步检查 SSE 初始化接口的响应头。用 curl 带 Origin 头请求curl -i -H Origin: https://evil.example.com http://localhost:8080/sse/init重点看返回头里有没有Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true。如果两个同时出现说明硬编码通配符问题存在任何域名都可以跨域访问这个接口。第三步验证业务层白名单是否被绕过。在tools.yaml里设置allowedOrigins只允许https://your-company.com然后再次用https://evil.example.com作为 Origin 请求。如果仍然返回 200 并且建立了 SSE 连接说明白名单校验被硬编码头覆盖了漏洞确认存在。第四步用 TaoToken 通道做一次正常的模型调用验证确认收敛层工作正常。下面是一个 Python 示例import requests url https://taotoken.net/api/v1/chat/completions headers { Authorization: Bearer sk-你的TaoToken密钥, Content-Type: application/json } payload { model: claude-sonnet-4-20250514, messages: [ {role: user, content: 请返回当前数据库连接配置的审计状态} ] } resp requests.post(url, headersheaders, jsonpayload, timeout60) print(resp.status_code) print(resp.json())如果返回 200 并且有正常的模型响应说明 TaoToken 通道配置正确。如果返回 401检查 Key 是否正确、是否有多余空格。如果返回 404检查 Base URL 是否写成了https://taotoken.net/api而不是其他路径。成功的结果应该是MCP Toolbox 版本确认在受影响范围内SSE 接口返回了通配符 CORS 头白名单校验被绕过同时 TaoToken 通道能正常完成模型调用说明收敛层可用。这两个结果合在一起说明你的环境存在 CVE-2026-9739 风险但已经有统一的 API 通道可以承接后续的访问收敛。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照这一节把配置过程中最容易遇到的几个报错列出来对照排查。第一个401 Unauthorized。这个最常见原因通常是 Key 填错、Key 过期、或者 Base URL 和 Key 不匹配。检查三件事Key 是不是sk-开头、有没有多余空格、Base URL 是不是https://taotoken.net/api。如果用的是 Claude Code检查settings.json里的apiKey字段名是否正确有些版本用api_key有些用apiKey。第二个local proxy failed。这个报错通常出现在 Agent 工具尝试通过本地代理转发请求的时候。检查你的网络配置里有没有设置HTTP_PROXY或HTTPS_PROXY环境变量如果有确认代理地址是否可达。另外检查 TaoToken 的 Base URL 是否被错误地写成了本地地址。正确的应该是https://taotoken.net/api不要加端口号。第三个reading choices 相关报错。这个通常出现在模型返回格式解析阶段比如Error reading choices[0].message.content。原因可能是模型返回了非预期格式或者 Model ID 填错了。检查 Model ID 是否和 TaoToken 支持的模型列表一致。如果不确定先在模型对话页面手动发一条消息确认模型能正常返回再把对应的 Model ID 填到配置里。第四个OAuth 相关报错。如果你用的是 Claude Code 的 OAuth 流程可能会遇到OAuth token exchange failed或者invalid_grant。这类报错通常和回调地址配置有关。检查你的 OAuth 应用回调地址是否和 TaoToken 的接入文档一致。如果用的是 API Key 模式而不是 OAuth 模式确认配置里没有混入 OAuth 相关字段。第五个MCP Toolbox 连接数据库失败。这个和 CVE-2026-9739 本身无关但排查时容易混淆。检查数据库连接字符串、账号密码、网络可达性。如果 MCP Toolbox 日志里出现connection refused或authentication failed先解决数据库连接问题再回头看 CORS 配置。第六个升级到 v1.3.3 之后仍然报 CORS 错误。检查 Nginx 或其他反向代理层是否还有残留的add_header Access-Control-Allow-Origin *配置。升级 MCP Toolbox 只修复了应用层的硬编码头如果代理层还有通配符问题依然存在。排查的时候建议按顺序来先确认 TaoToken 通道能通再确认 MCP Toolbox 版本和 CORS 头最后确认数据库连接。这样能把问题范围逐步缩小避免在多个层面同时改配置导致混乱。6. 收敛 Agent 数据库访问入口从直连模式到通道模式的迁移路径CVE-2026-9739 给所有做 AI Agent 的团队提了个醒直连数据库的模式在安全上是有结构性缺陷的。不是说 MCP Toolbox 不好而是任何让 Agent 直接持有数据库凭据、直接建连接、直接执行 SQL 的架构都会把数据库暴露在 Agent 的攻击面里。Agent 本身可能被提示注入、可能被恶意工具调用、可能被供应链污染任何一个环节出问题数据库就是最后一道防线而这道防线在直连模式下几乎不存在。迁移到通道模式的核心思路是Agent 不再直接连数据库而是通过 TaoToken 这样的统一 API 通道发起请求。通道侧负责鉴权、审计、限流、脱敏。数据库凭据只存在于通道侧或独立的安全代理层Agent 拿到的只是通道的 API Key。具体迁移步骤可以分三步走。第一步盘点现有 Agent 的数据库访问路径列出所有直连数据库的 MCP 配置。第二步在 TaoToken 通道侧配置对应的工具调用权限把数据库查询能力封装成通道提供的工具接口。第三步修改 Agent 配置把直连数据库的 MCP 配置替换成 TaoToken 的通道配置Agent 通过通道调用数据库工具。这个迁移过程不需要一次性完成可以按 Agent 优先级分批做。先迁移那些访问敏感数据、权限较高的 Agent再迁移低风险的。迁移过程中保持两套路径并行验证通道模式的稳定性和性能之后再逐步下线直连配置。对于长期编码和 Agent 场景建议直接走 Coding Plan 相关入口把模型调用和工具调用都收敛到统一通道。这样后续再出现类似 CVE-2026-9739 的组件漏洞时你的数据库不会直接暴露在攻击面上通道侧的鉴权和审计能给你争取到响应时间。最后给一个实操建议在升级 MCP Toolbox 到 v1.3.3 的同时就把 TaoToken 的通道配置加上。不要等下一个漏洞出来再动手。通道模式不只是为了应对这一个 CVE它是 AI Agent 架构走向生产可用的必经之路。数据库访问入口收敛得越早后面踩的坑越少。