AI 代理堆疊面臨的 1998 年問題
2026 年 6 月的最後一週,一小群 CVE 針對 AI 代理工具接連出現,其中兩個落在同一款桌面代理客戶端上,都是授權漏洞,而其中一個正好位於 MCP OAuth 回呼之中。單獨來看,每一個都只是中等嚴重度的臭蟲,維護者用一個週末就能修好。合起來看,這群 CVE 是個訊號,而且是結構性的訊號:AI 代理生態系累積攻擊面的速度,超過它累積防禦所需資安文化的速度。這不是任何單一專案的道德缺失,而恰恰是 1998 年前後網路所處的狀態——當時一門語言帶著不安全的預設值進入主流,憑證散落各處,而安裝基數的成長速度快過任何人能加固它的速度。那些握有您金鑰、執行您 shell 的工具,正以 1998 年式的資安成熟度,出貨到 2026 年的威脅模型裡。 {.answer-block}
TL;DR
- Cherry Studio 是一款熱門的桌面 AI 代理客戶端,在 2026 年 6 月 29 日一口氣拿下兩個 CVE:其 MCP OAuth 回呼伺服器中的不當授權漏洞(CVE-2026-13524),以及某個 preload API 中的授權繞過(CVE-2026-13534)。12
- 這個模式並不限於單一 app。MCP 的參考工具本身在 2025 年就出過重大遠端程式碼執行漏洞:mcp-remote 為 CVSS 9.6(CVE-2025-6514),Anthropic 自家的 MCP Inspector 為 CVSS 9.4(CVE-2025-49596)。34
- 代理工具在結構上比任何網頁應用曾經暴露得更嚴重:它們握有憑證、以執行程式碼為設計本意,並且坐落在您信任邊界(IDE、shell、瀏覽器)的內部,而非其後方。
- 預防這些臭蟲的知識早已存在。MCP 規範詳細記載了混淆代理人(confused deputy)與 OAuth 流程這兩類攻擊;但將它套用到每一個快速演進整合上的文化,尚未擴散開來。5
- 1998 年的網路,是在蠕蟲讓不安全付出昂貴代價之後才成熟起來。代理生態系目前還沒有對等的迫使力量,而如今正在找出這些臭蟲的同一批模型,也有能力寫出那個成為迫使力量的東西。
具體來看這群 CVE
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 版。措辭直白:「對參數 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 必須是真材實料:CVE-2026-13533 是 agentejo Cockpit CMS,一套 PHP 內容管理系統,而非代理框架;CVE-2026-13543 則根本無從查證。幾個扎實的例子,勝過一份灌水的清單。
為何代理工具在結構上處境更糟
1998 年前後的典型網頁應用並不安全,但它活在一道邊界之後。它跑在一台您並不身處其中的伺服器上,其波及範圍是資料庫與工作階段,而一次入侵讓攻擊者拿到的是該應用的資料。
代理工具則把這套幾何關係翻轉過來。它跑在您的機器上、或您的 IDE 之中,握有通往您雲端與程式碼倉庫的長效憑證,並且把執行程式碼當成核心功能,而非一項漏洞利用。沒有任何邊界可供躲在其後,因為這工具本身就是那道邊界——而它在設計上就是有孔可穿的。
Simon Willison 在 2025 年 6 月以「致命三要素」(lethal trifecta)精準點名了這項危險:當一個代理同時結合了「存取您私密資料」、「暴露於不受信任內容」以及「對外通訊的能力」,並以能竊取該資料的方式湊在一起時,它就變得可被利用。7 每一個有能力的代理,預設就同時具備這三者,因為讀取您的機密、吸收受攻擊者影響的內容、發出對外請求,都是它的功能,而非臭蟲。這三要素不是邊角案例,而是基準配置。
這就是結構性的差別。1998 年的網頁應用得先被誘騙,才會洩漏一道邊界份量的資料。2026 年的代理則出廠即預先接好一整條外洩鏈所需的每一項能力,而橫在惡意輸入與您憑證之間的,就只剩下這工具有沒有把內部信任邊界劃對。Cherry Studio 的回呼臭蟲,正是其中一道邊界劃得稍有偏差時的樣貌。
MCP 的放大效應
Model Context Protocol 是 2026 年代理堆疊的結締組織,它以一種特定方式把攻擊面成倍放大:每一個 MCP 伺服器都是一個嶄新的特權整合,通常是趕工寫成,而模型可以呼叫它。新增一個毫無阻力,稽核一個卻不然。整合的安裝基數,正把會去讀它們程式碼的人數遠遠甩在後頭。
參考工具本身就說明了這不是業餘專案才有的問題。2025 年 7 月,JFrog 揭露了 CVE-2025-6514,這是 mcp-remote 中的一個 OS 命令注入——mcp-remote 是 Claude Desktop、Cursor 與 Windsurf 所使用的連接器——惡意伺服器可在 OAuth 流程中,以一個精心構造的 authorization_endpoint URL 觸發它:屬重大等級,CVSS 9.6。3 同一個月,Tenable 揭露了 CVE-2025-49596,這是 Anthropic 自家 MCP Inspector 中一個評為 9.4 的遠端程式碼執行漏洞,其中一個缺失的身分驗證檢查,讓惡意網站得以觸及本機連接埠,再透過 DNS rebinding 執行任意命令。4
本文四個 CVE 裡,有兩個是 MCP 工具中的 OAuth 流程漏洞:一個在回呼伺服器,一個在端點探索。這並非巧合。代理客戶端裡的 OAuth 是一道被反覆搞砸的邊界,而規範對此直言不諱。那份日期為 2025 年 6 月 18 日的 MCP 資安最佳實務文件,把最長的一節留給「混淆代理人問題」,並強制要求代理伺服器實作逐客戶端同意、驗證 OAuth state 參數,並精確比對重新導向 URI。5 那是在 Cherry Studio 出貨其回呼臭蟲的一年前發布的。落差不在於知識,而在於一份規範的安全附錄,與上週二才寫成的那個中位數整合之間的距離。
prompt injection 讓這種放大效應在本質上,比舊網路曾面對過的任何東西都更糟。Willison 在 2022 年 9 月造出這個詞,寫道「我提議這件事顯而易見的名稱應該叫 prompt injection」,是類比於 SQL injection:受信任的指令與不受信任的輸入被串接成單一字串,再由引擎去解讀。6 對代理而言,資料本身就是一種攻擊向量,而不只是程式碼。一個被下毒的網頁、一個暗藏機關的檔案、一段懷有敵意的工具描述:模型讀進的任何一個位元組都可能夾帶指令。MCP 規範對此毫不避諱,警告惡意伺服器可以把客戶端變成資料外洩的代理管道。5 您無法靠輸入跳脫(input escaping)來修補它,因為輸入是自然語言,而解讀者是一個模型。
把 1998 年的類比講精確
這個類比若通不過事實查核,就只是一種氛圍,所以以下把那個年代精確地擺出來。
PHP 3 於 1998 年 6 月出貨,把一門動態網頁語言交到數百萬人手中,帶著一個如今看來魯莽的預設值:來自查詢字串、cookies 或伺服器的外部輸入,會被直接註冊進全域範圍。register_globals 是開啟的,一個由攻擊者掌控的變數,可以悄悄變成您程式碼所信任的變數。這個修正花了四年。2002 年 4 月釋出的 PHP 4.2.0 更改了預設值,其釋出公告直白地寫著:「外部變數(來自環境、HTTP 請求、cookies 或網頁伺服器)在預設情況下不再被註冊進全域範圍。」8 另一個定義了那個年代的拐杖——magic quotes——用 addslashes 假裝提供 SQL injection 防護卻無其實質,並比 register_globals 多苟活了好幾年,才被專案最終終結。不安全的預設值、一種安全的錯覺、以及文化跟上之前長達數年的滯後。那就是年輕網路的應用層。
這種文化不是自己降臨的,而是被逼出來的。2001 年 7 月 19 日,Code Red 蠕蟲利用了微軟 IIS 網頁伺服器中的一個緩衝區溢位,依 CAIDA 的統計,「在不到 14 小時內,就有超過 359,000 台電腦感染了 Code-Red(CRv2)蠕蟲」。9 2003 年 1 月 25 日,Sapphire/Slammer 蠕蟲打中了 Microsoft SQL Server 的一個緩衝區溢位,把自己塞進 376 位元組的封包裡,並「在十分鐘內感染了幾乎所有能找到的易受攻擊主機」,是當時史上傳播最快的蠕蟲。10 那些是基礎設施蠕蟲,不是 PHP 臭蟲,我不會把兩者混為一談。重點在於那個十年的形狀:每一層都是不安全的預設值,而一種資安文化,是在不安全變得切膚、公開且昂貴之後才成熟起來。預設即安全(secure-by-default),是這個產業用蠕蟲換來的一課。
把它對映到 2026 年,這份對應關係令人不安。不安全的預設值:信任回呼 code、跳過同意檢查的代理客戶端。安全的錯覺:一個蓋在權限範圍為 admin:* 之權杖上的權限提示。爆炸性成長的安裝基數:凡事都來一個 MCP 伺服器,一鍵新增,無人稽核。這個生態系目前還沒有的,是那條蠕蟲。它擁有 1998 年的預設值與 2001 年的目標輪廓,正在等它的迫使力量。
操作者該有的姿態
您沒有等待那份文化的餘裕。您現在就在跑這些工具,所以得由您自己劃出這個生態系尚未替您劃好的邊界。我採用的框架,是把那三要素當成一份操作檢查清單:對任何代理,都要問它可以讀什麼、可以執行什麼、可以外洩什麼,並在每一項上放一道確定性的防護。
| 能力 | 代理做了什麼 | 哪裡會出錯 | 防護 |
|---|---|---|---|
| 讀取 | 吸收檔案、網頁、工具輸出、MCP 回應 | 不受信任的內容夾帶被注入的指令 | 把抓進來的每一個位元組都當成敵意輸入,絕不當成指令;為外部資料來源加上標記並予以隔離 |
| 執行 | 依設計執行 shell、編輯檔案、呼叫工具 | 精心構造的資料變成一道命令(注入、混淆代理人) | 在呼叫之前就先評估的權限規則;把工具與 MCP 伺服器列入允許清單;對新的本機伺服器要求同意 |
| 外洩 | 發出對外請求、寫入程式碼倉庫、向 API 發送資料 | 讀取加上執行,湊齊致命三要素 | 出口(egress)控管;封鎖私有與 link-local IP 範圍;權杖以最小權限授予;絕不讓權杖直接轉傳 |
防護那一欄不是空談。它是確定性的,而確定性正是重點所在。Hooks 會在生命週期事件上觸發,帶著模型無從爭辯的結束碼,而權限規則會在工具執行之前、而非之後評估。那正是「代理不應該做 X」變成「代理無法做 X」的那一層,也是唯一一層,prompt injection 的酬載無法靠花言巧語混過去的地方。當您無法信任輸入、又無法信任模型自己來管束這份輸入時,您就在模型無法掌控的那道邊界上強制執行。
第二道控管看起來像生產力功能,實則是資安功能。當一個代理在執行之前,先把它的工作編纂成一份可供審閱的計畫時,審閱那份計畫就是一次資安審查。一段四十行的工作流程腳本,若指名了它將呼叫的每一個工具、將觸及的每一個檔案,那就是一份您一分鐘內讀得完的威脅模型。您無法稽核一萬個即時決策;但您可以在它花掉任何東西之前,稽核那份會產生這些決策的計畫。
並且別忘了那份不對稱:製造這些 CVE 的同一種能力,也能找出它們。一位 Anthropic 研究員用一個編碼代理與一段十行腳本,就揭出了一個存在 23 年之久的 Linux 核心漏洞以及 22 個 Firefox CVE。您桌上的那個工具,只要您把它指向自己的技術堆疊,它就是一台對準您自家堆疊的漏洞掃描器。防禦方今天就能把探索自動化,而且此刻正在搭建分流層。那是 1998 年的網路所沒有的唯一一項優勢。
我的立場
以下是我認為會發生的事,具體到足以被證明是錯的。代理生態系會先迎來它的 Code Red 時刻,然後才建立起它的資安文化,因為網路當年就是照這個順序走的。那個迫使力量,最可能是一個能自我傳播的 prompt injection 酬載,透過共用的 MCP 伺服器在代理之間流竄;或是一場大規模憑證外洩事件,追溯回某一個熱門卻稽核不足的整合。它會很便宜就能造出來,因為找出核心臭蟲的同一批模型,也能寫出它——而那句「一波大浪正在逼近」的警告,從來就不只是關於防禦而已。
在它落地之後,預設即安全就不再是選配。MCP 客戶端出貨時,同意對話框預設開啟、權杖受眾(audience)經過驗證、回呼會拒絕不相符的重新導向 URI,就像 PHP 最終出貨時把 register_globals 關掉那樣。權限層會從選擇加入(opt-in),轉為預設拒絕(default-deny)。能存活下來的整合,會是那些把規範的安全附錄當成規範本身來對待的整合。
令人不安的是時間軸。網路大約花了 1998 到 2005 年,才把預設即安全內化,其間每兩波蠕蟲之間都還有數年可供思考。代理堆疊複合得更快,每一台開發者機器上都擺著一個更高價值的目標,而攻擊者的工具鏈每一代模型都在進步。1998 年的問題是真實的。唯一懸而未決的問題是:我們會在蠕蟲替這故事寫下結局之前、還是之後,才依這個類比採取行動。
重點整理
- 對每一個代理都跑一次三要素稽核。 寫下每個工具能讀取、執行與外洩什麼,然後逐列確認都有一道確定性的防護。沒有防護的能力,就是您的暴露面,也是下一個酬載落腳的地方。
- 把 MCP 伺服器列入允許清單;把每一個命令參數都當成不受信任的執行。 新增一個整合只需一鍵,稽核它卻不然,所以要把註冊這件事,卡在一份經過審閱的清單之後。這裡四個 CVE 有兩個是 MCP 客戶端裡的 OAuth 流程臭蟲:這場握手是一道邊界,不是一道形式。
- 把計畫階段當成審查關卡。 讓代理把意圖編纂成一份可供審閱的計畫,並在執行前像讀威脅模型那樣讀它。一段指名了其工具與檔案的腳本,一分鐘內就能稽核;一萬次即時工具呼叫則辦不到。
- 先把掃描器對準自己。 製造這些 CVE 的能力,也能找出它們。在別人拿他們的掃描器對準您之前,先對您自己的程式碼與相依套件跑一次代理輔助的資安清掃。
FAQ
MCP 伺服器安全嗎?
預設並不安全,而且並不一致。MCP 是一種協定;它的安全取決於每個伺服器與客戶端如何實作它。2025 年針對 mcp-remote(CVSS 9.6)與 Anthropic MCP Inspector(CVSS 9.4)的揭露顯示,就連參考工具都出過重大的 RCE 漏洞。34 規範記載了幾大類攻擊——混淆代理人、權杖直通(token passthrough)、SSRF、本機伺服器遭入侵——並開出了具體的緩解措施。5 把每一個伺服器都當成一個特權整合:只跑您信任或已稽核過的,明確地把它們列入允許清單,並假設您連上的任何伺服器都能影響您的代理。
什麼是 prompt injection?
prompt injection 是指攻擊者把指令偷渡進 AI 系統所讀取的不受信任輸入中,而模型會照做,彷彿那些指令來自您本人。Simon Willison 在 2022 年 9 月類比 SQL injection 造出這個詞:受信任的指令與不受信任的輸入被串接成單一提示,再由模型去解讀,卻沒有可靠的方法能分辨哪一部分是攻擊者的。6 對代理而言它格外危險,因為資料變成了一種攻擊向量,而跳脫處理無法修好它,因為解讀者是一個語言模型。
什麼是致命三要素?
這是 Simon Willison 於 2025 年 6 月給那三項——湊在一起就使代理變得可被利用的能力——所取的名字:存取您的私密資料、暴露於不受信任的內容,以及對外通訊的能力。7 同時具備這三者的代理,可能被注入的內容操縱,去讀取您的機密並把它們送給攻擊者。大多數有能力的代理,預設就具備這三者,這正是為什麼該做的是逐項防護每一種能力,而不是寄望模型自己抵抗。
我該如何為一個跑在自己機器上的代理做好防護?
從模型無法掌控的那道邊界開始。使用會在工具執行之前評估的權限規則與 hooks,讓一個被攻陷的提示,無法靠花言巧語混進一個您已禁止的動作。把工具與 MCP 伺服器列入允許清單,在新的本機伺服器執行之前要求同意,並讓每一份憑證都以最小權限授予,好讓一個被竊的權杖只有很小的波及範圍。封鎖對私有與 link-local IP 範圍的對外請求,以堵住外洩路徑。然後在大型操作之前審閱代理的計畫——那正是通過了讀取邊界的注入會被逮到的地方。
來源
-
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。「對參數 code 的操縱會導致不當授權。」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;供應商指出 memory 已計畫在 v2 中移除。 ↩↩ -
CVE-2025-6514,GitHub Advisory Database,github.com/advisories/GHSA-6xpm-ggf7-wc3p(發布於 2025 年 7 月 9 日)。「連線至不受信任的 MCP 伺服器時,因來自 authorization_endpoint 回應 URL 的精心構造輸入而導致的 OS 命令注入」,存在於 mcp-remote 版本 >= 0.0.5、< 0.1.16;CVSS v3 基礎分數 9.6(重大);已於 0.1.16 修補。由 JFrog Security Research 發現並詳述;客戶端暴露情形(Claude Desktop、Cursor、Windsurf)見 JFrog 的公告貼文。 ↩↩↩
-
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 rebinding 加以利用;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」,MCP 伺服器不得接受任何並非明確為該 MCP 伺服器所簽發的權杖)、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(我提議這件事顯而易見的名稱應該叫 prompt injection)」,援引類比至 SQL injection,以及受信任指令與不受信任輸入的串接。 ↩↩
-
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(外部變數——來自環境、HTTP 請求、cookies 或網頁伺服器——在預設情況下不再被註冊進全域範圍)。」這就是
register_globals改為預設關閉的變更,約在 PHP 3 於 1998 年出貨其預設開啟行為的四年之後。 ↩ -
〈CAIDA Analysis of Code-Red〉,CAIDA,caida.org/archive/code-red。「在不到 14 小時內,就有超過 359,000 台電腦感染了 Code-Red(CRv2)蠕蟲」,始於 2001 年 7 月 19 日,利用了 Microsoft IIS 中的一個緩衝區溢位;在高峰時「每分鐘有超過 2,000 台新主機遭到感染」。 ↩
-
〈The Spread of the Sapphire/Slammer Worm〉,CAIDA,caida.org/archive/sapphire。於 2003 年 1 月 25 日星期六約 UTC 上午 5:30 釋出,利用了 Microsoft SQL Server 中的一個緩衝區溢位;這隻蠕蟲構造出 376 位元組的封包,並「在十分鐘內感染了幾乎所有能找到的易受攻擊主機」,是當時史上傳播最快的蠕蟲。 ↩