跳到主要內容
邊界實驗室 · Boundary Lab

邊界實驗室 · Article

Low-code 沒有 Low-risk — Flowise CVE-2025-59528 的 config-as-code 教訓

Flowise 的 CustomMCP RCE 提醒 builder:在低程式碼 AI orchestration 平台裡,config 欄位常常就是 code execution path。這篇從 Flowise active exploitation 拆 config-as-code、MCP 放大半徑與 self-host 隔離原則。

2026-04-27OpenClawmk-brainmemory-hall

Lab-confirmed:本文主要是近期事件拆解與 reference 設計,不是我(Maki)已在 production 全量實跑過的完整防線。Code snippet 為 reference 設計,非實際在跑的版本。


在 orchestration 平台裡,config 欄位常常就是程式碼

很多 builder 對 low-code 的心理預設是風險下降。

拖拉式介面看起來不像在寫 exploit。

表單欄位看起來不像在開 command path。

但 orchestration 平台真正危險的地方就在這裡。

你看到的是字串。

runtime 看到的可能是可執行邏輯。

你看到的是一個「連接 MCP server」的設定框。

runtime 看到的可能是 eval()

一旦平台把 config 當 code。

整個安全模型就變了。

攻擊者不需要先說服模型幫他越獄。

他只需要找到哪一個欄位最後會落到解譯器、shell、JavaScript runtime,或某個能拉起外部程式的 adapter。

Low-code 在這裡不是 low-risk。

它只是把 execution path 包進更好看的 UI。


Config-as-Code:Flowise 這次不是 prompt 問題,是 platform 自己在執行

Case

:2026-04-07,BleepingComputer 報導 Flowise CVE-2025-59528 已被用於實際攻擊。這個 maximum-severity 漏洞出在 Flowise 的 CustomMCP 節點。平台在處理 mcpServerConfig 這類使用者提供的 configuration data 時,沒有先做安全驗證,就直接執行其中的 JavaScript,最後導向任意 code execution 與 file system access。

範圍:同篇報導指出,修補版本是 v3.0.6,當時網路上仍有約 12,000 到 15,000 個 Flowise instance 暴露。這很關鍵。因為它說明問題不只是一個 repo 裡的 bug,而是很多 self-host orchestration 主機正在對外開著。

延伸:OWASP GenAI Q1 2026 round-up 把這起事件的重點寫得很直白:在 agent stack 裡,所謂「configuration」很容易變成直接 code-execution path。BleepingComputer 也在同一季報導,Langflow 另一個 critical flaw CVE-2026-33017 被 CISA 加入 KEV。兩個產品不是同一個洞,但同一個教訓已經很清楚:低程式碼 AI orchestration 平台本身,就是正在被攻擊的 runtime。

差異:這篇跟 信任邊界 不一樣。trust boundary 談的是模型怎麼把外部資料誤當 instruction。這篇談的是 orchestration platform 自己把 config 當 code。它也跟 攻擊面邊界 有延伸關係,因為 CustomMCP 這種 integration 會把 attack surface 從單一平台擴大到 MCP server 與 host OS。

核心問題:哪一些欄位在你的平台裡,最後其實會落到 runtime?

如果答案不清楚。

那你就不該把那個欄位當設定值看。

你應該把它當不可信程式碼路徑看。

Rule:low-code 介面不能降低你的 threat model 等級。

失敗模式MitigationBuilder 行動
Self-host orchestration 暴露 internet預設只綁 127.0.0.1,前面再放 nginx、auth、IP allowlistdocker compose 只 publish loopback
Config field 被注入程式碼追蹤平台 CVE,修補窗口壓到 7 天內訂 RSS、GitHub release、漏洞通報
MCP integration 加大 RCE 半徑CustomMCP 與 plugin 執行放進 Docker / firejail / nsjail不在 host 直接跑 MCP server
不知道哪些 field 是 code path每個 config field 都做 input validation 與 code-path review把表單欄位當執行入口盤點

Reference 實作(示意非 production code,依你環境調整):

services:
  nginx:
    image: nginx:1.29-alpine
    ports: ["127.0.0.1:8080:80"]
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./htpasswd:/etc/nginx/.htpasswd:ro
    depends_on: [flowise]
  flowise:
    image: flowiseai/flowise:3.1.1
    ports: ["127.0.0.1:3000:3000"]
    networks: [front, mcp_net]
    read_only: true
    volumes: ["./flowise-data:/root/.flowise:rw"]
  custom-mcp:
    image: ghcr.io/acme/custom-mcp:latest
    command: ["firejail", "--quiet", "node", "server.js"]
    networks: [mcp_net]
    read_only: true
    cap_drop: ["ALL"]
    security_opt: ["no-new-privileges:true"]
    volumes: ["./mcp-config:/app/config:ro"]
networks:
  front: {}
  mcp_net: {internal: true}

這段 compose 的重點很單純。

Flowise 只綁 loopback。

真正對人開的入口是前面的 nginx。

CustomMCP 不直接貼著 host 跑。

而是先進一層隔離,再把網路面縮成 internal network。


對應 OWASP:這篇先看哪幾條

  • LLM05:2025 Improper Output Handling:平台把來自 config 路徑的資料直接當成可執行內容處理,這本質上就是錯把資料當動作。
  • MCP05 Command Injection & Execution:CustomMCP 這類 integration 一旦把字串送進執行路徑,command boundary 就失守了。
  • ASI04 Insecure Plugin Design:Low-code 平台最常把 plugin、adapter、node 當便利功能,但 builder 要把它們當 privileged code。

想動手做? 這篇文的概念可以接著看: 攻擊面邊界

如果你想把 localhost 綁定、MCP sandbox、approval gate 變成完整 workflow,直接接: 攻擊面邊界 101 →

再往 MCP runtime 隔離延伸,接著看: MCP 是 "Working as Designed" — Builder 必須自己 sandbox