Langflow MCP stdio 設定可執行任意指令,1.10.3 才完整修補
GitHub Advisory · 2026-10-07
Langflow 的 MCP stdio 傳輸會把使用者填的 command 與 args 原封不動交給 bash -c 執行,沒有任何白名單,這讓「新增 MCP Server」變成遠端指令執行入口。GHSA-w794-rj3p-xv45(CVE-2026-105697)於 2026-10-07 公開,嚴重度 Critical,CVSS 3.1 分數 9.9,向量為 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H。
漏洞機制
只要能進到「Settings → MCP Servers → Add MCP Server」,或呼叫 POST/PATCH /api/v2/mcp/servers/{server_name},或能建立含 MCP Tools 元件的 flow,就能填入任意指令。指令在 Langflow 嘗試連線時就會執行,包含列出 server、載入 tools、跑 flow;即使 UI 顯示 stdio server 啟動失敗,指令早已跑完,因為 MCP SDK 是先用 anyio.open_process 起行程,之後才做 MCP 握手。
有問題的程式在 MCPStdioClient._connect_to_server,1.10.3 之前長這樣:
server_params = StdioServerParameters(
command="bash",
args=["-c", f"exec {command_str} || echo 'Command failed with exit code $?' >&2"],
env=env_data,
)1.9.0 之前唯一的檢查是 _validate_node_installation,它只確認指令含 npx 時機器上有 Node.js,與安全無關。
預設設定下更糟:LANGFLOW_AUTO_LOGIN=true 時,GET /api/v1/auto_login 不用帳密就發 token。公告原文說明,暴露在網路上的預設實例不需帳號即可打到;關閉 AUTO_LOGIN 後,任何已登入的非管理員使用者仍可利用。公告也提到回報者找到數台公開在網際網路上、仍有此漏洞的 Langflow 伺服器。
受影響版本
修補分兩步,所以「1.9.0 以後」並不安全,這是最容易誤判的地方。
| 版本 | 狀態 |
|---|---|
1.1.2 – 1.4.x | MCP Stdio 元件直接用 command 欄位建 StdioServerParameters,無驗證 |
1.5.0 – 1.8.x | 新增設定頁與 /api/v2/mcp/servers,以 bash -c 啟動,無驗證 |
1.9.0 – 1.10.2 | #12290 在 REST 層加白名單,執行端仍無驗證且仍用 bash -c |
1.10.3+ | #14036 把同一套政策放到 API、flow 執行與啟動前,並移除 shell |
langflow:>= 1.1.2, < 1.10.3,修補版1.10.3langflow-base:>= 0.1.2, < 0.10.3,修補版0.10.3lfx:< 1.10.3,修補版1.10.3
1.9.0 到 1.10.2 之間,嵌在 flow 裡的 MCP Tools 元件值,或以 tweak 傳入的設定不經過 MCPServerConfig,仍可執行任意指令。只擋住 REST 入口的版本,實際上沒有修好。
修補與緩解
1.10.3 的修補把驗證集中到 lfx.base.mcp.security.validate_mcp_stdio_config,並改為不經 shell 直接 exec:
command_parts = shlex.split(command_str)
command, args = command_parts[0], command_parts[1:]
validate_mcp_stdio_config(command, args, env) # final pre-spawn enforcement
server_params = StdioServerParameters(command=command, args=final_args, env=env_data)白名單包含 node、python、python3、npx、uvx、docker,而 cmd/sh/bash 只能用來包裝前述其中之一。參數會檢查 shell 特殊字元與危險關鍵字,環境變數封鎖 LD_PRELOAD、NODE_OPTIONS、PYTHONPATH、BASH_ENV 等。在 1.10.3 以上送出 touch,會得到 Command 'touch' is not allowed for security reasons;bash -c、sh -c、python3 -c、node -e 這類包裝也一併被拒。
白名單不等於安全:公告自己指出,npx 與 uvx 預設仍能執行任何套件,這是 MCP server 的正常發行方式。多租戶部署應另外設定:
LANGFLOW_MCP_SERVER_ALLOWED_PACKAGES:列出npx/uvx可跑的套件LANGFLOW_MCP_SERVER_INTERPRETER_HARDENING=true與LANGFLOW_MCP_SERVER_DOCKER_HARDENING=true- 1.11.1 以上(#14150):限制自訂程式碼,例如
LANGFLOW_ALLOW_CUSTOM_COMPONENTS=false,可讓 MCP stdio server 僅限 superuser 使用
影響範圍
自架 Langflow 的團隊要先查三件事:版本是否低於 1.10.3(用 pip 裝 langflow-base 或單獨用 lfx 跑 flow 的環境也要看對應版本)、LANGFLOW_AUTO_LOGIN 是否仍是預設的 true、實例是否可從不受信任的網路連到。反向代理後面的內部平台,只要有人持有一般帳號,風險仍在。
無法立即升級時,公告列出的暫時做法有兩項:設 LANGFLOW_AUTO_LOGIN=false 且不要把 Langflow 直接暴露給不受信任的網路,以及只發帳號給可信任的使用者。命令會以 Langflow 行程的使用者身分執行(CWE-78),所以該行程可讀到的 API key、資料庫連線與雲端憑證都應視為可能外洩,升級之外還要考慮輪替。公告未說明是否已有在野利用。