你按下 MCP 登入的那一刻,server 就能在你的電腦上跑程式

資安公司 Pillar Security 在 10 月中旬公開一份技術報告:開源 AI coding agent opencode 在 Windows 與 WSL 上,連接遠端 MCP server 並進行 OAuth 登入時,這個 server 可以在開發者的機器上執行任意程式。依 Pillar 的報告,受影響的是 opencode 1.0.137 到 1.18.32,修復版本是 9 月 28 日發布的 1.18.33。

如果你在 Windows 或 WSL 上用 opencode,又設定過遠端 MCP server,現在就該查一下自己的版本。更麻煩的是,這個漏洞沒有 CVE,也沒有安全公告,你平常依賴的掃描器和依賴更新機器人不會提醒你。

受影響的條件:遠端 server 加上一次登入

Pillar 說 opencode 每週約有 300 萬次 npm 下載。它和其他 coding agent 一樣,可以存取本機檔案、執行指令,通常以開發者自己的權限運作;惡意程式若透過它執行,用的也是你的權限。

觸發條件有兩個。第一,你在 opencode 裡設定了一個遠端 MCP server;第二,你觸發了對它的登入,例如執行 opencode mcp auth 或發出對應的請求。依 The Hacker News 的整理,只是設定好 server 或開一個 session,並不會走到出問題的那段程式。

攻擊者需要控制那個 server,但它不必一開始就是惡意的。Pillar 指出,惡意內容是在連線當下從 HTTP 回應送來的,所以一個原本正常、之後被接管的 server,轉手或過期的網域、名稱相近的仿冒 server(typosquat),或被劫持的登錄項,都可能走上同一條路。macOS 與 Linux 不受影響,因為這兩個平台開瀏覽器時以參數陣列(argv)傳遞網址,不經過 shell。

這不是 prompt injection,問題發生在模型之前

談 MCP 的風險,大家最常想到 prompt injection:惡意 server 回傳設計過的工具描述,誘導模型做壞事。Pillar 的比喻是,遠端 MCP server 等於一個陌生的第三方在和你筆電上的程式對話,MCP client 因此和瀏覽器、郵件程式一樣,是在解析不可信的輸入。Pillar 認為這次是另一類問題,攻擊不需要騙過模型,client 在解析對方送來的資料時就出事了,整個過程也不需要使用者再多做確認。

依 Pillar 的技術分析,MCP server 要求授權時,client 會做 OAuth discovery:server 回應 401,指向一份 discovery 文件,告訴 client 要把使用者帶到哪裡登入。其中的 authorization_endpoint 是一段自由字串,由被認證的 server 自己決定。在 opencode 1.18.32,這段字串一路傳進負責開瀏覽器的 open(),途中沒有檢查網址的 scheme,也沒有確認它和你設定的 server 是不是同一個來源。

真正出事的地方在 open 這個套件。所有受影響的 opencode 版本都鎖在 open@10.1.2(v1.18.32 的 package.json 上確實寫著 "open": "10.1.2"),它在 Windows 上會把網址放進雙引號字串,交給 PowerShell 執行;應用程式名稱有跳脫,網址本身卻沒有。PowerShell 會展開雙引號字串裡的 $(...) 子表達式,所以只要網址裡夾帶一段 $(...),裡面的指令就會先被執行。Pillar 說,即使之後瀏覽器開啟失敗,指令也已經跑完,而 opencode 會把這個失敗直接丟掉。

修好了,但 release notes 一個字也沒提

依 Pillar 的時間線,他們在 8 月 29 日透過 GitHub Security Advisory 私下通報;9 月 25 日 Anomaly(opencode 的開發公司)回覆,惡意 MCP server 不在其威脅模型內,同一天修復的 PR 合併;9 月 28 日發布 1.18.33。The Hacker News 另外引述 Anomaly 的安全政策,指使用者自行設定的 MCP server 屬於「outside our trust boundary」。

回頭看 opencode 1.18.33 的 release notes,和 MCP 有關的只有一行:launcher 一啟動就結束時,現在會回報 MCP 瀏覽器啟動失敗。整份說明沒有提到安全修復。修復的 PR #51414 標題是「refactor(core): share a browser opener across opencode and tui」,9 月 25 日合併,標題沒有提到安全;Pillar 說它被描述成整合八個瀏覽器啟動呼叫點的重構,內文也沒提安全。官方發布頁能確認的只有版本與日期;Anomaly 對漏洞的完整回應,目前只能透過 Pillar 和 The Hacker News 的報導得知。

這帶來兩個後果。沒有 CVE,漏洞掃描器和依賴機器人就不會標出 1.0.137 到 1.18.32 的安裝;但任何人比對 1.18.32 和 1.18.33 之間的差異,都能重建這個漏洞。Pillar 表示,正因如此才決定公開報告,並提議 CVSS v3.1 分數 9.8(Critical);這是 Pillar 自己的評分,目前沒有公開的 CVE。The Hacker News 也提到,Anomaly 今年曾為 opencode 其他程式碼執行漏洞發過安全公告,這次則沒有。

只檢查 https,擋不住這一招

這類漏洞常見的修法是檢查網址 scheme:擋掉 javascript:、data: 這類奇怪的開頭,只放行 http 和 https。opencode 在 1.18.33 也加了這種檢查。但 Pillar 指出,他們的攻擊網址就是一個普通的 https:// 網址,不含空白,MCP TypeScript SDK 的 denylist、更嚴格的 http/https allowlist,以及 opencode 新加的 openUrl() 檢查都會放行。

Pillar 的看法是,真正封住漏洞的是把依賴升到 open@11.0.4:新版把網址包在單引號裡,PowerShell 不會展開單引號內的內容。更持久的做法則是以 argv 傳網址,根本不用遠端字串組 shell 指令。

這也不是新問題。Pillar 列出 2025 年已有三個同型態的 CVE,包括 mcp-remote 的 CVE-2025-6514(9.6 分),都屬於 server 提供的值被送進開啟網址流程的同一類問題。open 套件本身的問題也早有人看過。依 Pillar 的整理,2020 年就有人回報「網址裡有 $ 在 WSL 2 上會出錯」,當時被當成顯示問題;2023 年另有人直接以命令注入回報,維護者引用 README 說這個套件不做安全保證。PowerShell 參數跳脫在 2025 年 11 月的 open@11.0.0 修正,而 opencode 寫下用 open() 開授權網址的程式是在 2025 年 12 月,當時鎖定的仍是舊版,之後也沒人回頭更新。Pillar 也審視了其他 MCP client,稱 gemini-cli、Claude Code、github-mcp-server 和 Docker 的 mcp-gateway 各有防護,而做得好的共同點不是 scheme 檢查,是 argv。

現在該做什麼

如果你在 Windows 或 WSL 上用 opencode:

  1. 查你安裝的 opencode 版本。落在 1.0.137 到 1.18.32 之間,就是受影響的範圍。
  2. 升級到 1.18.33 或更新的版本。
  3. 暫時不能升級,就把沒有審查過的遠端 MCP server 從 opencode 設定中移除。The Hacker News 建議可用 opencode mcp list 看目前設定了哪些 server。

如果你負責團隊的資安:這個漏洞不會出現在掃描結果或依賴警示裡,要直接盤點 opencode 的安裝與版本,Pillar 也是這樣建議的。依 The Hacker News 的報導,Pillar 沒有回報這個漏洞已被用於攻擊,也沒有提供可檢查過往入侵的指標。

如果你維護 MCP client 或任何會開網址的工具,Pillar 的建議是:用 argv 而不是組指令列;scheme 檢查有用但不夠;OAuth discovery 要綁定你設定的 server 來源;把 server 送來的每個欄位都當成不可信輸入。

用其他 coding agent 的人,這次未必直接受影響,但值得記得一件事(這是我們的推論):遠端 MCP server 的風險不只是模型被誘導,client 自己怎麼處理對方送來的網址和資料,同樣決定你的機器安不安全。Pillar 也肯定 opencode 這次修得很快,只是沒有對外說明;在官方補上公告或 CVE 之前,確認版本這件事只能靠你自己。