智能体技术栈的“1998年问题”
2026年6月的最后一周,一小批 CVE 集中落在 AI 智能体工具上:其中两个出自同一款桌面智能体客户端,都是授权缺陷,其中一个正好位于 MCP OAuth 回调之中。单独看,每一个都只是维护者一个周末就能修掉的中危漏洞;放在一起看,这批漏洞是一个信号,而且是结构性的信号:AI 智能体生态积累攻击面的速度,快于它积累防御所需安全文化的速度。这不是哪一个项目的道德失败,而正是1998年前后 Web 世界所处的境况——彼时一门语言带着不安全的默认配置走向主流,凭据散落各处,安装基数的增长快得没人来得及加固。今天,替您保管密钥、替您执行 shell 的这些工具,正带着1998年的安全成熟度,被投放进2026年的威胁模型里。
TL;DR
- 热门桌面 AI 智能体客户端 Cherry Studio 在2026年6月29日一次收到两个 CVE:MCP OAuth 回调服务器中的不当授权缺陷(CVE-2026-13524),以及 preload API 中的授权绕过(CVE-2026-13534)。12
- 这种模式并不局限于某一款应用。MCP 的参考实现本身就在2025年出货过严重的远程代码执行缺陷:CVSS 9.6 的 mcp-remote(CVE-2025-6514),以及 CVSS 9.4 的 Anthropic MCP Inspector(CVE-2025-49596)。34
- 智能体工具在结构上比当年任何 Web 应用暴露得都更彻底:它们持有凭据,按设计执行代码,并且坐在您的信任边界(IDE、shell、浏览器)之内,而不是之后。
- 防住这些漏洞所需的知识早已存在。MCP 规范详细记录了混淆代理(confused deputy)与 OAuth 流程这两类攻击;缺的是把这份知识落实到每一个高速迭代集成上的文化,而它还没有扩散开来。5
- 1998年的 Web 之所以成熟,是因为蠕虫让不安全变得昂贵。智能体生态还没有等来同等量级的强制力,而此刻正在找出这些漏洞的同一批模型,也能写出那个强制力本身。
具体看这批漏洞
Cherry Studio 是一款跨平台桌面客户端,自我标榜为“具备智能聊天、自主智能体和300多个助手的 AI 生产力工作室”,并明确支持 Model Context Protocol 服务器。它正是本文讨论的那类工具:一个面向普通用户的智能体,替您中转 API 密钥,运行本地集成,并代表您向网络发起请求。
2026年6月29日,VulDB 针对它发布了两条公告。CVE-2026-13524 是 MCP OAuth Local Callback Server 中的不当授权缺陷(CWE-285),位于文件 src/main/services/mcp/oauth/callback.ts,影响1.9.0 至 1.9.6 各版本。描述很直白:“The manipulation of the argument code leads to improper authorization.”(对参数 code 的操纵会导致不当授权。)CVSS 3.1 评分5.6,中危。1 CVE-2026-13534 是 CherryIN preload API 中的授权绕过(CWE-639),影响直至1.9.7版本,评分5.0。2 两者都上不了头条,都是团队在一个对所有人都陌生的领域里快跑时,犯下的安静的授权错误。
真正的线索是第一个。MCP 客户端里的 OAuth 回调是教科书式的信任边界:外部授权服务器把 code 交回您的机器,而您的机器决定是否信任它。处理失当并不是什么新奇的漏洞类别,恰恰是 MCP 规范自己的安全文档着墨最多的那一类。
同一时间窗口里相邻的两个 CVE 被我剔除了,因为这批漏洞必须是真的:CVE-2026-13533 属于 agentejo Cockpit CMS,是一款 PHP 内容管理系统,而非智能体框架;CVE-2026-13543 则完全无法核实。几个扎实的例子,胜过一份注水的清单。
智能体工具为何在结构上更不利
1998年前后典型的 Web 应用确实不安全,但它活在边界之后。它跑在一台您并不身处其中的服务器上,爆炸半径止于数据库和会话,一旦被攻破,攻击者拿到的是这个应用的数据。
智能体工具把这套几何关系整个翻转了。它跑在您的机器上或您的 IDE 里,握着通往您的云和代码仓库的长期凭据,并且把执行代码当作核心功能而非漏洞利用。没有可供藏身的边界,因为工具本身就是边界,而这道边界按设计就是有孔的。
Simon Willison 在2025年6月用“lethal trifecta”(致命三要素)精确命名了这一危险:当一个智能体同时具备“访问您的私有数据”“接触不可信内容”“对外通信的能力”,并且这种组合足以把数据偷走时,它就可被利用。7 每一个有能力的智能体默认都同时具备这三项,因为读取您的机密、摄入受攻击者影响的内容、发出对外请求,都是它的功能而不是它的缺陷。这三要素不是边缘情况,而是出厂配置。
结构性差异就在这里。1998年的 Web 应用必须先被骗,才会泄漏一道边界之内的数据。2026年的智能体则是带着一条外泄链所需的全部能力预先接好线送到您面前,恶意输入与您的凭据之间,只剩下“这款工具有没有把内部信任边界画对”这一件事。Cherry Studio 的回调漏洞,就是这道边界画歪了一点点时的样子。
MCP 带来的放大
Model Context Protocol 是2026年智能体技术栈的结缔组织,而它以一种具体的方式把攻击面乘了起来:每一个 MCP 服务器都是一个新的特权集成,通常写得很快,而模型可以调用它。加一个毫无摩擦,审一个则不然。集成的安装基数,正在跑赢读过这些代码的人数。
参考实现说明了这不是业余项目才有的问题。2025年7月,JFrog 披露了 CVE-2025-6514:mcp-remote 中的操作系统命令注入。这个连接器被 Claude Desktop、Cursor 和 Windsurf 使用,恶意服务器只需在 OAuth 流程中给出一个精心构造的 authorization_endpoint URL 即可触发,严重等级为 critical,CVSS 9.6。3 同月,Tenable 披露了 CVE-2025-49596:Anthropic 自家 MCP Inspector 中评分9.4的远程代码执行缺陷,缺失的认证检查让恶意网站得以触达本地端口,再借助 DNS 重绑定执行任意命令。4
本文涉及的四个 CVE 中,有两个是 MCP 工具里的 OAuth 流程缺陷:一个在回调服务器,一个在端点发现。这不是巧合。智能体客户端里的 OAuth 是一道被反复搞砸的边界,而规范本身把话说得很明白。2025年6月18日发布的 MCP 安全最佳实践文档,把最长的一节留给了“confused deputy problem”(混淆代理问题),并要求代理服务器实现按客户端的同意机制、校验 OAuth 的 state 参数、对重定向 URI 做精确匹配。5 这份文档比 Cherry Studio 出货那个回调漏洞早了整整一年。差距不在知识,而在规范的安全附录与上周二写就的那个中位数集成之间的距离。
提示注入让这种放大在性质上比老 Web 面对过的任何问题都更糟。Willison 在2022年9月造出这个词,写道“I propose that the obvious name for this should be prompt injection”(我提议这件事显而易见的名字应该叫提示注入),类比的是 SQL 注入:可信指令与不可信输入被拼接进同一个字符串,然后由某个引擎去解释。6 对智能体来说,数据本身就是攻击向量,而不只是代码。一个被投毒的网页、一份埋了陷阱的文件、一段带敌意的工具描述——模型读到的任何一个字节都可能携带指令。MCP 规范对此直言不讳,警告恶意服务器可以把客户端变成数据外泄的代理。5 这件事无法靠输入转义来修补,因为输入是自然语言,而解释器是一个模型。
把1998年这个类比说准
类比若经不起事实核查,就只是一种气氛。所以,把那个年代准确地讲一遍。
PHP 3 于1998年6月出货,把一门动态 Web 语言送进数百万人手里,而它的默认配置今天读起来堪称鲁莽:来自查询字符串、Cookie 或服务器的外部输入,被直接注册进全局作用域。register_globals 是开着的,攻击者能控制的变量可以悄无声息地变成您的代码所信任的变量。修好它花了四年。2002年4月发布的 PHP 4.2.0 改掉了这个默认值,发布公告说得干脆:“External variables (from the environment, the HTTP request, cookies or the web server) are no longer registered in the global scope by default.”(来自环境、HTTP 请求、Cookie 或 Web 服务器的外部变量,默认不再注册进全局作用域。)8 另一根定义了那个年代的拐杖 magic quotes,靠跑一遍 addslashes 伪装出防 SQL 注入的安全感却没有实质,比 register_globals 多活了好几年,才终于被项目组亲手废掉。不安全的默认值,安全的错觉,以及文化追上来之前长达数年的滞后——这就是年轻 Web 的应用层。
这份文化并非自己走来,而是被逼出来的。2001年7月19日,Code Red 蠕虫利用了微软 IIS Web 服务器的缓冲区溢出,按 CAIDA 的统计,“more than 359,000 computers were infected with the Code-Red (CRv2) worm in less than 14 hours”(不到14小时里,超过359,000台计算机感染了 Code-Red(CRv2)蠕虫)。9 2003年1月25日,Sapphire/Slammer 蠕虫击中了 Microsoft SQL Server 的缓冲区溢出,把自己塞进376字节的数据包,并且“infected most of the vulnerable hosts that could be found within ten minutes”(在十分钟内感染了几乎所有能被找到的脆弱主机),是当时史上传播最快的蠕虫。10 这些是基础设施层的蠕虫,不是 PHP 漏洞,我不会把两者混为一谈。重点在于那十年的形状:每一层都是不安全的默认值,而安全文化只有在不安全变得切身可感、公开昂贵之后才成熟起来。安全默认(secure-by-default)是整个行业用蠕虫换来的一课。
把这套映射到2026年,对应关系令人不适。不安全的默认值:信任回调 code、跳过同意检查的智能体客户端。安全的错觉:盖在一个作用域为 admin:* 的令牌之上的权限提示框。爆炸式增长的安装基数:什么都有对应的 MCP 服务器,一键添加,无人审计。生态目前还缺的只有那只蠕虫。它已经拥有1998年的默认值和2001年的目标画像,只差自己的强制力。
运维者的姿态
您没有等文化成熟的余裕。这些工具是您现在就在用的,所以生态还没为您划出的边界,得由您自己来划。我用的框架,是把那三要素当成一份运维清单:对任何一个智能体,都问它可以读什么、可以执行什么、可以外传什么,并为每一项配上确定性的守卫。
| 能力 | 智能体做什么 | 会在哪里出错 | 守卫 |
|---|---|---|---|
| 读取 | 摄入文件、网页、工具输出、MCP 响应 | 不可信内容携带被注入的指令 | 把取回的每一个字节都当作敌意输入,绝不当作指令;对外部数据源加标记并隔离 |
| 执行 | 按设计运行 shell、编辑文件、调用工具 | 构造过的数据变成命令(注入、混淆代理) | 在调用之前生效的权限规则;对工具和 MCP 服务器做白名单;新的本地服务器必须经过同意 |
| 外传 | 发起对外请求、写入代码仓库、向 API 提交 | 读取加执行,凑齐致命三要素 | 出网管控;封禁私有地址段与链路本地地址段;令牌按最小权限授予;绝不透传令牌 |
守卫这一列不是愿景。它是确定性的,而确定性正是重点。钩子在生命周期事件上触发,返回模型无法辩驳的退出码;权限规则在工具运行之前生效,而不是之后。就是在这一层,“智能体不应该做 X”变成了“智能体做不了 X”,也是提示注入载荷唯一无法靠说话绕过去的一层。当您既不能信任输入,也不能指望模型在输入面前自我约束时,就只能在模型控制不了的边界上强制执行。
第二道控制读起来像生产力功能,实际上是安全功能。当智能体在执行之前把工作编译成一份可审阅的计划,审阅这份计划就是一次安全评审。一段四十行的工作流脚本,把它将调用的每个工具、将改动的每个文件都写明,这就是一份您一分钟读得完的威胁模型。您无法审计一万次实时决策,但您可以在它花掉任何东西之前,审计那份会生成这一万次决策的计划。
另外别忘了这层不对称:造出这些 CVE 的能力,同样也能找出它们。一位 Anthropic 研究员用一个编码智能体加十行脚本,翻出了一个存在了23年的 Linux 内核漏洞和22个 Firefox CVE。您桌上的这件工具,只要您愿意把它对准,就是一台指向自家技术栈的漏洞扫描器。防守方今天已经能把发现环节自动化,并且正在把分诊层建起来。这是1998年的 Web 唯一没有的优势。
8月24日更新:发表之后的记录
本文当初主张,6月那批漏洞是结构性信号而非运气不好。此后七周的记录如下。
MCP 的长尾正在产生稳定的 CVE 流量。 8月中旬的某一周里,三个社区 MCP 服务器同时中招:Jij-MCP-Server 的 Python REPL 代码注入(CVE-2026-19964)、android-mcp-server 中通过参数操纵实现的命令执行(CVE-2026-19978),以及 mcp-florence2 的服务端请求伪造(CVE-2026-19984)。111213 全部为中危——两个可远程触发,第三个仅限智能体所在的主机本地——并且全是经典类别:注入、未净化的执行、SSRF,落点都是以智能体权限运行的工具。这正是“MCP 带来的放大”一节所论证的结构性场景:一条由小型集成构成的长尾,每一个都可能是下一个 mcp-remote,如今如期而至。
这不只是社区长尾的问题。 微软自家的运维智能体 Azure SRE Agent 在8月7日拿到了 CVE-2026-62830:授权缺失导致可通过网络提权,评分为 9.9,严重级。14 结构性论证从来不是在说业余维护者,而是在说智能体工具究竟是什么。
攻击研究已经追上了供应链。 ElasticBack 演示了植入单一智能体技能文档中的条件式后门,并把技能定义为“an emerging supply chain where a single poisoned skill can persistently compromise every agent that installs it”(一条新兴的供应链,其中一个被投毒的技能就能持续攻陷每一个安装它的智能体)。15 而生态对分发问题给出的答案 Agent Plugins 1.0,出货时把权限与来源溯源交给客户端自行管理,完全没有签名层——打包层先于安全层到达,这正是本文所论证的、定义了整个技术栈的顺序:能力先出货,安全文化随后才跟上。
下面的预测原样保留,未作修改。
我的立场
以下是我认为会发生的事,具体到足以被证伪。智能体生态会先迎来它的 Code Red 时刻,然后才拥有它的安全文化,因为 Web 当年就是这个顺序。最可能成为强制力的,是一个通过共享 MCP 服务器在智能体之间移动的自我传播提示注入载荷,或是一起追溯到某个热门却缺乏审计的集成的大规模凭据外泄事件。造出来很便宜,因为找出内核漏洞的同一批模型也能把它写出来;而“一波大浪正在到来”这句警告,从来就不只是关于防守的。
等它落地之后,安全默认就不再是可选项。MCP 客户端会带着默认开启的同意对话框、经过校验的令牌受众、以及拒绝不匹配重定向 URI 的回调一起出货,就像 PHP 最终带着关闭的 register_globals 出货那样。权限层会从选择加入变成默认拒绝。活下来的集成,是那些把规范的安全附录当成规范本身来对待的。
令人不适的是时间表。Web 大约用了1998年到2005年才把安全默认内化,两次蠕虫之间还有好几年可供思考。智能体技术栈的复利更快:每一位开发者的机器上都摆着价值更高的目标,而攻击方的工具链每一代模型都在变好。1998年问题是真实的。唯一悬而未决的问题是:我们是在蠕虫写下结局之前依着这个类比行动,还是在那之后。
要点回顾
- 对每一个智能体都做一次三要素审计。 写下每件工具能读什么、能执行什么、能外传什么,然后逐行确认都配了确定性守卫。没有守卫的能力就是您的暴露面,也是下一个载荷的落点。
- 给 MCP 服务器做白名单;把每一个命令参数都当成不可信的执行。 添加一个集成只要一次点击,审计它却不是,所以要把注册权限收拢到一份经过评审的清单上。本文这四个 CVE 里有两个是 MCP 客户端的 OAuth 流程漏洞:握手是一道边界,不是走过场。
- 把计划阶段变成评审关口。 让智能体把意图编译成一份可审阅的计划,并在执行前像读威胁模型那样读它。一段写明了工具和文件的脚本,一分钟就能审完;一万次实时工具调用则不行。
- 先把扫描器对准自己。 造出这些 CVE 的能力,同样也能找出它们。在别人拿他们的扫描器对准您之前,先在自己的代码和依赖上跑一遍智能体辅助的安全排查。
常见问题
MCP 服务器安全吗?
默认并不安全,而且参差不齐。MCP 是一套协议,它的安全性取决于每个服务器和客户端各自如何实现。2025年针对 mcp-remote(CVSS 9.6)和 Anthropic MCP Inspector(CVSS 9.4)的披露表明,连参考实现都出货过严重的 RCE 缺陷。34 规范记录了主要的攻击类别——混淆代理、令牌透传、SSRF、本地服务器被攻陷——并给出了具体的缓解措施。5 请把每一个服务器都当作特权集成:只运行您信任或已审计过的,明确把它们列入白名单,并且假定您连接的任何服务器都能影响您的智能体。
什么是提示注入?
提示注入,是指攻击者把指令夹带进 AI 系统会读取的不可信输入里,而模型把它当成您下达的指令来执行。Simon Willison 于2022年9月类比 SQL 注入造出了这个词:可信指令与不可信输入被拼接成同一段提示,再由模型去解释,而没有可靠办法分辨哪一部分来自攻击者。6 对智能体来说尤其危险,因为数据成了攻击向量;又因为解释器是一个语言模型,转义也救不了。
什么是致命三要素?
这是 Simon Willison 在2025年6月给三种能力起的名字,它们凑在一起就会让智能体变得可被利用:访问您的私有数据、接触不可信内容、以及对外通信的能力。7 三样俱全的智能体,可能被注入的内容操纵,去读取您的机密并把它们送给攻击者。多数有能力的智能体默认三样俱全,所以正确的做法是为每一项能力配上守卫,而不是指望模型自己扛住。
怎样保护跑在我自己机器上的智能体?
从模型控制不了的那道边界开始。使用在工具运行之前生效的权限规则和钩子,这样被攻陷的提示无论怎么说,都无法把自己说进一个您禁止过的动作里。给工具和 MCP 服务器做白名单,新的本地服务器执行前必须取得同意,并把每一份凭据都按最小权限授予,让被盗令牌的爆炸半径足够小。封禁发往私有地址段和链路本地地址段的对外请求,堵住外泄路径。然后在大规模操作之前审阅智能体的计划——那些穿过读取边界的注入,会在这里被抓住。
参考来源
-
CVE-2026-13524,CircL Vulnerability-Lookup,vulnerability.circl.lu/vuln/cve-2026-13524(2026年6月29日发布)。CherryHQ cherry-studio 1.9.0 至 1.9.6 的 MCP OAuth Local Callback Server 中的不当授权(CWE-285),文件为
src/main/services/mcp/oauth/callback.ts。“The manipulation of the argument code leads to improper authorization.” CVSS 3.1 基础评分5.6(中危);GHSA-9c5h-h4mj-p5ch;修复方案见 pull request #15388。 ↩↩ -
CVE-2026-13534,CircL Vulnerability-Lookup,vulnerability.circl.lu/vuln/cve-2026-13534(2026年6月29日发布)。CherryHQ cherry-studio 直至1.9.7 的 CherryIN preload API 中的授权绕过(CWE-639),函数为
src/main/services/memory/MemoryService.ts中的sha256。CVSS 3.1 基础评分5.0(中危);GHSA-qwwm-4xhq-q4m4;厂商表示计划在 v2 中移除 memory 功能。 ↩↩ -
CVE-2025-6514,GitHub Advisory Database,github.com/advisories/GHSA-6xpm-ggf7-wc3p(2025年7月9日发布)。“OS command injection when connecting to untrusted MCP servers due to crafted input from the authorization_endpoint response URL”,影响 mcp-remote 版本 >= 0.0.5、< 0.1.16;CVSS v3 基础评分9.6(严重);已在0.1.16修复。由 JFrog Security Research 发现并详述;受影响客户端(Claude Desktop、Cursor、Windsurf)见 JFrog’s advisory post。 ↩↩↩
-
CVE-2025-49596,Tenable Research,“How Tenable Research Discovered a Critical Remote Code Execution Vulnerability on Anthropic MCP Inspector”,tenable.com(2025年7月9日)。Anthropic MCP Inspector 0.14.1 以下版本中的 RCE,根因是 Inspector 客户端与代理之间缺失认证检查,可由恶意网站借助 CORS 与 DNS 重绑定利用;CVSS 9.4(严重);通过加入代理会话令牌在0.14.1修复。 ↩↩↩
-
“Security Best Practices”,Model Context Protocol 规范,修订版2025-06-18,modelcontextprotocol.io/specification/2025-06-18/basic/security_best_practices。记录了混淆代理问题,并要求 MCP 代理服务器“MUST implement per-client consent”,同时校验 OAuth 的
state参数、对重定向 URI 做精确匹配;文中还涵盖令牌透传(“MCP servers MUST NOT accept any tokens that were not explicitly issued for the MCP server”)、SSRF、会话劫持与本地服务器被攻陷。 ↩↩↩↩ -
Simon Willison,“Prompt injection attacks against GPT-3”,simonwillison.net/2022/Sep/12/prompt-injection/(2022年9月12日)。以“I propose that the obvious name for this should be prompt injection”造出这一术语,并给出与 SQL 注入的类比,以及可信指令与不可信输入被拼接在一起的结构。 ↩↩
-
Simon Willison,“The lethal trifecta for AI agents: private data, untrusted content, and external communication”,simonwillison.net/2025/Jun/16/the-lethal-trifecta/(2025年6月16日)。点名了组合起来即让智能体可被利用的三种能力:“access to your private data”“exposure to untrusted content”与“the ability to externally communicate”。 ↩↩
-
“PHP 4.2.0 Release Announcement”,php.net/releases/4_2_0.php(2002年4月)。记录了这次安全默认值的变更:“External variables (from the environment, the HTTP request, cookies or the web server) are no longer registered in the global scope by default.” 这就是把
register_globals默认关闭的改动,距 PHP 3 于1998年出货默认开启的行为大约四年。 ↩ -
“CAIDA Analysis of Code-Red”,CAIDA,caida.org/archive/code-red。“More than 359,000 computers were infected with the Code-Red (CRv2) worm in less than 14 hours”,始于2001年7月19日,利用的是微软 IIS 的缓冲区溢出;峰值时“more than 2,000 new hosts were infected each minute”。 ↩
-
“The Spread of the Sapphire/Slammer Worm”,CAIDA,caida.org/archive/sapphire。于2003年1月25日星期六协调世界时约5点30分放出,利用 Microsoft SQL Server 的缓冲区溢出;该蠕虫构造376字节的数据包,并“infected most of the vulnerable hosts that could be found within ten minutes”,是当时史上传播最快的蠕虫。 ↩
-
CVE-2026-19964,NVD,2026年8月17日发布,CVSS 3.1 基础评分5.5(中危)。Jij-MCP-Server 0.1.0 中经由
PythonREPL.run函数(jij_mcp/python_repr.py,jm_check组件)的代码注入;“manipulation of the argument code results in code injection”,可远程触发。 ↩ -
CVE-2026-19978,NVD,2026年8月17日发布,CVSS 3.1 基础评分5.3(中危)。android-mcp-server 中经由
child_process.exec(build/index.js)的命令执行,通过操纵deviceId/packageName参数实现;本地攻击向量(AV:L)。 ↩ -
CVE-2026-19984,NVD,2026年8月17日发布,CVSS 3.1 基础评分6.3(中危)。mcp-florence2 直至0.3.13 中经由
get_images函数src参数的服务端请求伪造,可远程发起。 ↩ -
CVE-2026-62830,NVD,2026年8月7日发布,CVSS 3.1 基础评分9.9(严重):“Missing authorization in Azure SRE Agent allows an authorized attacker to elevate privileges over a network.” ↩
-
ElasticBack: Stealthy Conditional Backdoor in LLM-Agent Skills via Coupled Trigger-Rule Optimization,Sui 等,2026年8月。有关供应链的引文逐字出现在摘要中;该论文演示了一种条件式的单技能后门。 ↩