系统:运行中
← 返回所有攻击
AGENTS CRITICAL NEW

CVE-2026-46519:当 MCP 服务器只在展示层而非执行层过滤工具

mcp-server-kubernetes 仅在 tools/list 中执行只读与白名单控制,却从未在 tools/call 中执行。任何知道工具名称的客户端都能直接调用它。这是一堂关于展示层授权与执行层授权的清晰教训。

2026-06-15 // 6 min affects: mcp-server-kubernetes<3.6.0

这是什么?

CVE-2026-46519mcp-server-kubernetes 中的一处访问控制绕过漏洞。该 Model Context Protocol(MCP)服务器被广泛使用,让 AI 智能体得以驱动 Kubernetes 集群。漏洞通过 GitHub 安全公告 GHSA-cr22-wjx7-2w6m 公开,并在 NVD 中记录,CVSS 3.1 评分为 8.8(高危),弱点类别为 CWE-863(不正确的授权)。NeuralTrust 于 2026 年 5 月 19 日 发布了技术剖析,GitLab Advisory Database 于 2026 年 5 月 21 日 收录,并在 3.6.0 版本 中修复。

这个软件包并不冷门:它在 npm 上约有 每周 2 万次下载,是组织希望让智能体读取或管理集群状态时所采用的标准桥梁。正是这种覆盖面,把一个微小的逻辑缺口放大为集群级的问题。

工作原理

服务器暴露了三个被记录为访问控制的环境变量:ALLOW_ONLY_READONLY_TOOLSALLOW_ONLY_NON_DESTRUCTIVE_TOOLSALLOWED_TOOLS(一个明确的工具名称白名单)。设置 ALLOW_ONLY_READONLY_TOOLS=true 的运维人员期望已连接的智能体只能查看,绝不能改动。

MCP 把工具使用拆分为两个操作:tools/list(发现——“我在这里能做什么?“)与 tools/call(执行——“现在就做这件事”)。缺陷在于:限制逻辑只存在于 tools/list

层级               请求           是否检查限制?
-----------------  -------------  ----------------------
发现(展示)        tools/list     是 -> 返回过滤后的列表
执行(动作)        tools/call     否 -> 任何被命名的工具都会执行

当只读智能体请求其工具列表时,服务器确实返回了过滤后的集合——kubectl_getkubectl_describe 等——其中不含 kubectl_deleteexec_in_podkubectl_generic 这类破坏性工具。但 tools/call 处理器从不重新检查策略。任何已经知道受限工具名称的客户端——而这些名称就写在项目自己的 README 中——都能直接调用它。没有注入、没有利用链、没有提权原语:只是请求了一个界面假装不存在的工具。

智能体所见:[ kubectl_get, kubectl_describe ]            # tools/list 显示的内容
实际可达:  tools/call -> kubectl_delete([REDACTED])       # 服务器实际会执行的内容

用公告的话说,这些控制”实际上只是装饰”:它们隐藏了按钮,却让线路依然接通。

为什么重要

真实的影响范围取决于一件 CVE 无法替你修复的事:MCP 服务器所运行的 Kubernetes Service Account 的权限。 这种绕过永远不会赋予服务器超出其已有的权限——但在开发和预发布集群中,“为了方便”以 cluster-admin 运行此类服务器十分常见。在这种配置下,任何能触达 HTTP 端点的人都会继承该账户的全部权力:删除命名空间、改写部署、读取每一个 Secret。

有两点教训超越了单个 npm 包。其一,这是一个展示层授权与执行层授权的教科书案例——与一个隐藏管理员按钮却让 /admin 路由未经认证的 Web 应用如出一辙。智能体工具链因其年轻,正在重蹈这些覆辙。其二,MCP 的威胁模型并不只是”恶意提示”。一个诚实但配置错误的智能体,或同一网络上的任何客户端,用一个普通请求就能触发此缺陷。截至披露时尚无公开的概念验证,但复现该漏洞不需要任何特殊技能。

防御

  1. 立即升级。 升级到 mcp-server-kubernetes 3.6.0 或更高版本,它在 tools/call 中执行了它一向在 tools/list 中执行的相同限制。这是唯一真正堵住缺口的修复。

  2. 将 RBAC 视为真正的边界。 应用层的”只读模式”是一种便利,而非控制。给服务器的 Service Account 它真正需要的最小权限。如果某个智能体只观察 pod,其 SA 就不应能删除它们——无论应用内有何开关。

  3. 不要暴露端点。 让 MCP 服务器远离公共互联网,仅可从受信任网络或通过安全隧道访问,并要求强身份验证(该项目支持 MCP_AUTH_TOKEN)。

  4. 审计你自己的工具服务器是否存在同样的形态。 如果你构建或运行 MCP 服务器,请核实每一个授权决策都在 tools/call 处执行,而不仅仅在 tools/list 处。发现层的过滤属于用户体验;执行层的过滤才属于安全。快速测试:调用一个本应被隐藏的工具,确认服务器拒绝它。

  5. 在执行层记录日志。 记录 tools/call 调用的工具名称与结果,这样即使缺少某项控制,对”被过滤掉”工具的请求事后也可见。

状态

项目参考日期备注
GitHub 安全公告GHSA-cr22-wjx7-2w6m2026-05来源公告,v3.6.0 修复
CVE 记录NVD CVE-2026-465192026-05CVSS 8.8 高危,CWE-863
技术分析NeuralTrust2026-05-19发现与执行剖析
GitLab Advisory DBGLAD2026-05-21受影响:所有 < 3.6.0 版本
媒体报道TheHackerWire2026-06-11发布时尚无公开 PoC
修复版本mcp-server-kubernetesv3.6.0在执行层补充了检查

标题不是”Kubernetes MCP 很危险”,而是:授权必须在动作发生之处执行,而非在菜单绘制之处 ——这是 Web 二十年前就学会的规则,如今智能体工具链正以一个又一个 CVE 的方式重新学习。

Sources