駭客透過 WebSocket 繞過驗證,
摘要
人工智慧代理程式(AI agents)快速整合至開發工作流程中,帶來了新興的攻擊面(attack surface),尤其是在本機管理介面方面。這份報告針對Cline Kanban伺服器(GHSA-5c57-rqjx-35g2)中發現的關鍵跨源WebSocket劫持(Cross-Origin WebSocket Hijacking, CSWSH)漏洞,提供了詳盡的技術分析。透過利用缺乏Origin標頭驗證與身分驗證機制的弱點,惡意的Threat actor能夠竊取敏感的工作區資料,並透過劫持AI代理程式的終端機來達成遠端程式碼執行(Remote Code Execution, RCE)。研究檢視底層的架構缺陷,分析攻擊向量,並在AI代理程式安全與Model Context Protocol(MCP)的更大脈絡下討論緩解策略。
1. 簡介
現代軟體開發越來越依賴在本機上擁有高權限運作的AI輔助程式碼工具。這些工具經常部署本機網頁伺服器,為任務管理(例如看板)提供圖形化使用者介面。然而,這些本機服務的安全性時常被忽略,假設「localhost」的隔離能提供足夠的保護。正如近期安全公告 [1] 所示,缺乏傳統網頁安全控制(特別是Origin驗證)可能使這些系統容易受到 跨網站攻擊 。
文章探討的漏洞影響Cline CLI的
kanban
元件,該元件負責促進開發者與AI代理程式之間的即時互動。與macOS及跨平台環境中其他新興威脅類似
[2]
,這些漏洞常利用WebSocket等合法協定來繞過傳統的邊界防禦。此外,透過MCP等協定將AI代理程式與系統層級功能整合,也帶來了額外的風險,其中身分驗證不對稱可能導致系統被完全接管
[3]
。
2. 技術架構與漏洞根本原因
Cline Kanban伺服器以本機Node.js應用程式運作,曝露數個WebSocket端點以促進即時狀態同步與終端機互動。其架構依賴一個中央執行時期狀態中心及一個終端機管理器,來協調使用者介面與底層AI代理程式程序之間的活動。
此漏洞的根本原因在於WebSocket交握過程中未能實作「檢查Origin」的安全模式。與標準HTTP請求不同,WebSocket不受同源政策的限制。瀏覽器會對任何目標(包含
localhost
)發起WebSocket連線,無論請求頁面的來源為何。伺服器有責任在
upgrade
請求期間驗證
Origin
標頭。
2.1 交握缺陷分析
以下來自Kanban伺服器的程式碼片段展示了在HTTP升級至WebSocket的過程中缺乏Origin驗證的問題:
- // Snippet 1: Vulnerable WebSocket Upgrade Handler
- server.on("upgrade", (request, socket, head) => {
- // The server only checks the pathname but ignores the 'Origin' header
- if (normalizeRequestPath(requestUrl.pathname) !== "/api/runtime/ws") {
- return;
- }
- // CRITICAL: No Origin header validation.
- // Any website visited by the user can trigger this upgrade.
- deps.runtimeStateHub.handleUpgrade(request, socket, head, { requestedWorkspaceId });
- });
由於沒有針對信任的Origin允許清單(例如
http://127.0.0.1:3484
)進行檢查,伺服器會接受來自任何網域的連線。這個疏漏是典型的關鍵功能缺少身分驗證(CWE-306)與WebSocket缺少Origin驗證(CWE-1385)案例。
3. 攻擊途徑與衝擊
該漏洞曝露了三個主要端點,每個端點都促成了複雜攻擊鏈中的不同階段:資訊洩露、終端機劫持與阻斷服務。
3.1 即時資訊外洩
一旦建立與
/api/runtime/ws
端點的連線,伺服器會立即廣播開發者環境的完整快照。這包含檔案系統路徑、git儲存庫細節,以及AI代理程式互動的完整歷史記錄。
- // Snippet 2: Automated Data Leakage on Connection
- sendRuntimeStateMessage(client, {
- type: "snapshot",
- currentProjectId: projectsPayload.currentProjectId,
- projects: projectsPayload.projects, // Leaks absolute filesystem paths
- workspaceState, // Leaks tasks, git info, and board state
- workspaceMetadata, // Leaks git summaries
- clineSessionContextVersion
- });
這樣的行為讓攻擊者能夠悄悄地繪製受害者本機環境的地圖。如同關於Python-based竊資程式的研究所指出 [2] ,這類資訊對於後續的目標攻擊(例如認證竊取或智慧財產權盜竊)極具價值。
3.2 終端機劫持與遠端程式碼執行
最嚴重的衝擊來自
/api/terminal/io
端點。此端點允許將原始位元組串流直接寫入有效的AI代理程式連線的虛擬終端機(Pseudo-Terminal, PTY)。由於AI代理程式被設計為解讀並執行使用者指令,攻擊者可以注入惡意Prompt。
- // Snippet 3: Unauthenticated Terminal Input Injection
- ioServer.on("connection", (ws, context2) => {
- ws.on("message", (rawMessage) => {
- // Attacker-controlled bytes are written directly to the agent's PTY
- // This bypasses all UI-level safety checks
- terminalManager.writeInput(taskId, rawDataToBuffer(rawMessage));
- });
- });
攻擊者可以監控執行時期狀態以尋找有效的session,然後發送一個包含shell指令及隨後加上carriage return(
\r
)的malicious payload。AI代理程式會將其視為合法的使用者輸入,並以開發者的權限執行該指令。
3.3 阻斷服務(DoS)
/api/terminal/control
端點提供了對執行中任務的管理控制權。由於沒有身分驗證,任何跨源客戶端都可以終止有效的AI代理程式的session,干擾開發者的工作流程。
- // Snippet 4: Unauthorized Task Termination
- controlServer.on("connection", (ws, context2) => {
- ws.on("message", (rawMessage) => {
- const message = parseWebSocketPayload(rawMessage);
- if (message.type === "stop") {
- // Terminates the session without verifying the requester's identity
- terminalManager.stopTaskSession(taskId);
- }
- });
- });
4. 比較分析與更廣泛的安全背景
Cline Kanban漏洞並非單一事件,而是更廣泛趨勢的一部分——本機開發者工具成為遠端攻擊的閘道。利用WebSocket進行命令與控制及資料外洩,是現代macOS惡意軟體中常見的技術 [2] 。這類「竊資程式」常採用模組化設計,針對開發者特定的資產(如SSH金鑰與Kubernetes設定檔)進行攻擊。
此外,與AI代理程式整合相關的風險,已由Model Context Protocol(MCP)中的漏洞所體現。如同Nginx UI MCPwn漏洞 [3] 所示,若未能在所有端點(特別是處理工具執行的端點)實施一致的身分驗證,可能導致災難性的後果。在該案例中,一個「fail-open」的IP白名單結合一個未經身分驗證的MCP訊息端點,允許了伺服器被完全接管。Cline Kanban的缺陷也反映了類似的模式:透過未受保護的通訊頻道,曝露了強大的系統層級能力(終端機存取)。
| 特徵 | Cline Kanban (CSWSH) | Nginx UI (MCPwn) | Python Infostealers |
|---|---|---|---|
| 主要協定 | WebSocket | HTTP / MCP | WebSocket / HTTP |
| 根本原因 | 缺少Origin驗證 | 身分驗證不對稱 | 社交工程 / LOLBINs |
| 衝擊 | 透過AI終端機達成的RCE | 完整伺服器接管 | 認證/錢包竊取 |
| 目標環境 | 本機開發者電腦 | Nginx管理伺服器 | 跨平台 (macOS/Win) |
5. 緩解措施與最佳實務
為了保護本機伺服器免受跨源WebSocket劫持攻擊,開發者必須實施多層防禦策略。建議採取以下措施:
-
嚴格的Origin驗證:
伺服器必須在WebSocket交握期間驗證
Origin標頭。只應允許受信任的本機來源(例如Kanban UI本身)。 - Session Token 身分驗證: 在伺服器啟動時產生一個唯一且具備密碼學安全性的session token。所有WebSocket連線都應以此token作為查詢參數。由於外部網站無法存取此token(因初始頁面載入時的SOP限制),因此無法建立有效的連線。
- 一致的中介軟體應用: 確保所有端點,無論其預期用途為何,都繼承完整的身分驗證堆疊(full authentication stack)。避免「fail-open」的設計,因為缺少設定可能導致過度寬鬆的存取權限 [3] 。
6. 結論
Cline Kanban伺服器中的漏洞凸顯了在開發AI整合工具時,實施強健安全工程的關鍵需求。隨著AI代理程式獲得更多自主性以及對系統資源更深層的存取權,控制它們的通訊頻道必須以與公開網頁應用程式同樣嚴謹的態度來保護。藉由理解跨源WebSocket劫持的機制,並從MCP實作與惡意軟體戰術中的相關失敗案例中學習,安全社群能夠更好地保護現代開發環境,對抗不斷演進的威脅。