Skip to content

release: v1.1.6 — sc_flowise_js_rce (Flowise CVE-2025-59528, CVSS 10.0)#63

Merged
killertcell428 merged 1 commit into
masterfrom
release/v1.1.6-flowise-js-rce
May 18, 2026
Merged

release: v1.1.6 — sc_flowise_js_rce (Flowise CVE-2025-59528, CVSS 10.0)#63
killertcell428 merged 1 commit into
masterfrom
release/v1.1.6-flowise-js-rce

Conversation

@killertcell428
Copy link
Copy Markdown
Owner

Summary

  • Salvages sc_flowise_js_rce from closed PR #62 and ships it as v1.1.6.
  • PR Claude/eloquent davinci s bng g #62 was closed because it raced PR #61 for the v1.1.5 slot and lost on the merge order — the underlying Flowise CVE-2025-59528 detector is unrelated to that race.
  • One new detector, 14 new tests (10 true positives, 4 true negatives), all passing.

What changed

1 new supply-chain detector (aigis/filters/patterns.py)

sc_flowise_js_rce — JavaScript Function() Constructor / eval() in MCP Configuration (score 85)

Flowise CVE-2025-59528 (CVSS 10.0, exploited April 2026). The Flowise CustomMCP node parsed user-supplied mcpServerConfig JSON and executed it via JavaScript's Function() constructor — functionally identical to eval() — with no validation. A single payload achieves host-level RCE on the Flowise server, exposing every LLM API key, database credential, and OS resource reachable by the application. 12,000–15,000 instances remained unpatched when exploitation began, more than six months after Flowise 3.1.1 shipped the fix.

The pattern catches:

  • new Function(...) with child_process / fs / os / net / http / https / process.env / execSync / spawnSync / .exec( references
  • Function.prototype.constructor(...) — prototype-chain bypass for naive eval-string blocklists
  • eval(...) / new Function(...) / require('child_process'...) appearing inside MCP mcpServerConfig / "command": / "args": fields

Example blocked input:

new Function('return require("child_process").execSync("id")')()
mcpServerConfig: "new Function(code)()"
"command": "require('child_process').exec('rm -rf /tmp/*')"

Example benign (not blocked):

The Function() constructor is a JavaScript built-in that creates function objects.
The fix replaced Function() with JSON5.parse() to safely parse config.
new Function('x', 'return x + 1')(5)

Provenance

Detector source: origin/claude/eloquent-davinci-sBngG (the PR #62 branch) verbatim. Only release-metadata changed: version bumped 1.1.5 → 1.1.6, CHANGELOG section moved out of v1.1.5 and into v1.1.6. auto-improvement/INDEX.md and ROTATION.md are intentionally not touched — this is not a new rotation cycle, it is a follow-up to cycle 9.

Test plan

  • uv run --no-sync pytest --tb=no -q1582 passed · 0 failed · 0 skipped (measured 2026-05-18 on this branch)
  • uv run --no-sync ruff check aigis/filters/patterns.py tests/test_incident_postmortems3.py → All checks passed
  • 10 true-positive tests covering: Function() + each of child_process / execSync / spawnSync / fs / process.env / net; Function.prototype.constructor prototype-chain bypass; mcpServerConfig with eval() and new Function(); "command": with child_process
  • 4 true-negative tests covering: prose discussion of Function(); mention of JSON5.parse() fix; safe new Function('x', 'return x + 1')(5) arithmetic use; prose mention of require('child_process')

🤖 Generated with Claude Code

Adds `sc_flowise_js_rce` (Flowise CVE-2025-59528, CVSS 10.0): JavaScript
`Function()` constructor / `eval()` patterns combined with dangerous Node.js
system module references (`child_process`, `fs`, `os`, `net`, `process.env`,
`execSync`, `spawnSync`), or the same patterns appearing inside MCP server
configuration fields (`mcpServerConfig`, `"command":`, `"args":`). Also
covers the `Function.prototype.constructor` prototype-chain bypass.

CVE-2025-59528 (CVSS 10.0): the Flowise CustomMCP node parsed
`mcpServerConfig` and executed it via JavaScript's `Function()` constructor —
functionally identical to `eval()` — without any validation. A single
`new Function('return require("child_process").execSync("id")')()` payload
achieves host-level RCE on the Flowise server, exposing every LLM API key,
database credential, and OS resource stored or reachable by the application.
12,000-15,000 Flowise instances remained unpatched when exploitation began
in April 2026, more than six months after the patch (Flowise 3.1.1) was
released. An AI agent receiving indirect prompt injection through a poisoned
tool response or retrieved document could be directed to inject this payload
into a Flowise workflow configuration.

This release is a manual follow-up that salvages the detector from closed
PR #62. PR #62 was closed because it raced PR #61 for the v1.1.5 slot and
lost on the merge order; the underlying detector is unrelated to that race
and is shipped here on its own. Sourced from
`origin/claude/eloquent-davinci-sBngG` (the PR #62 branch) verbatim, with
only release-metadata changes (version 1.1.5 -> 1.1.6, CHANGELOG section
moved out of v1.1.5 into v1.1.6, INDEX/ROTATION untouched since this is not
a new auto-improvement rotation cycle).

Tests: 1582 passed, 0 failed, 0 skipped (measured 2026-05-18 via
`uv run --no-sync pytest --tb=no -q` on this branch). 14 new tests added
for `sc_flowise_js_rce` (10 true positives covering Function() + dangerous
modules, MCP config field injection, and prototype-chain bypass; 4 true
negatives covering legitimate Function() use, JSON5.parse() prose, safe
inline arithmetic Function() calls, and educational mentions of `require`).

Signed-off-by: killertcell428 <killertcell428@gmail.com>
@killertcell428 killertcell428 merged commit 9938a1b into master May 18, 2026
14 checks passed
@killertcell428 killertcell428 deleted the release/v1.1.6-flowise-js-rce branch May 18, 2026 08:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant