資安雷達 2026 年 10 月 8 日

2026-10-08 — Langflow MCP stdio 設定可執行任意指令,1.10.3 才完整修補

primary=https://github.com/advisories/GHSA-w794-rj3p-xv45 primary=https://github.com/langflow-ai/langflow/pull/12290 primary=https://github.com/langflow-ai/langflow/pull/14036 primary=https://github.com/langflow-ai/langflow/releases/tag/v1.10.3

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.xMCP 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.3
  • langflow-base:>= 0.1.2, < 0.10.3,修補版 0.10.3
  • lfx:< 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、資料庫連線與雲端憑證都應視為可能外洩,升級之外還要考慮輪替。公告未說明是否已有在野利用。

原始來源:GHSA-w794-rj3p-xv45、PR #12290、PR #14036、v1.10.3


End of article
0
Would love your thoughts, please comment.x
()
x