← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2026-44791 · CWE-1321 · Disclosed 2026-05-13

n8n XML Node prototype pollution patch bypass leading to host RCE

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a master-key bug hidden behind an employee-only door

CVE-2026-44791 is an n8n XML node prototype-pollution *patch bypass*: an authenticated user who can create or modify workflows can still poison object prototypes in the XML node and, when chaining other nodes, reach code execution on the n8n host. Authoritative affected ranges published by GitHub/OSV are < 1.123.43, >= 2.0.0-rc.0, < 2.20.7, and >= 2.21.0, < 2.22.1; fixed versions are 1.123.43, 2.20.7, and 2.22.1.

In vacuum-CVSS terms this looks *critical*, and on May 13–14, 2026 GitHub/n8n did publish a CNA-backed 9.4 CVSS v4 score. In real enterprise operations, though, the decisive friction is that exploitation requires *authenticated remote access plus workflow creation/editing rights*—that is already a post-initial-access or privileged-insider condition in most serious deployments. That friction pulls this down from internet-worm panic into HIGH patch priority, while the blast radius stays severe because n8n commonly holds API tokens, database creds, and automation secrets.

"Full host compromise is plausible, but only after the attacker gets workflow-edit rights."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Obtain an editor-capable n8n account

The attacker first needs valid credentials for an n8n user that can create or modify workflows. In practice that means a stolen admin/operator account, a compromised SSO session, or an overly broad internal role assignment. A common operator toolkit here is Burp Suite or a normal browser session against the n8n UI/API.
Conditions required:
  • Remote reachability to the n8n login surface or internal network access
  • Valid credentials or session token
  • Role with workflow create/modify permissions
Where this breaks in practice:
  • MFA, SSO conditional access, and IP restrictions block a lot of opportunistic abuse
  • Many enterprises restrict workflow editing to a small admin/devops group
  • Public exposure does not equal editor access
Detection/coverage: Identity telemetry is your best shot: IdP logs, n8n audit/auth logs, impossible-travel, new-device sign-ins, and anomalous editor logins. Network scanners cannot validate the required role.
STEP 02

Build a malicious workflow using the XML node

Using the XML node, the attacker submits a crafted payload that bypasses the earlier fix (GHSA-hqr4-h3xv-9m3r) and achieves prototype pollution. The vulnerability itself is not a one-click pre-auth RCE; it is a primitive that becomes dangerous when combined with other node behavior. Weaponization is likely manual at this stage using the native n8n workflow editor or direct API calls.
Conditions required:
  • Target version in a vulnerable range
  • XML node enabled and available to the attacker
  • Ability to save or run edited workflows
Where this breaks in practice:
  • Disabling n8n-nodes-base.xml kills this path outright
  • Some orgs require workflow review before production activation
  • SCA/SBOM catches versions, but not whether XML is actually exposed to editors
Detection/coverage: Version-based scanners can flag vulnerable packages. Behavioral detection is better: watch for new or modified workflows invoking the XML node unexpectedly.
STEP 03

Chain polluted state into code execution

The attacker then combines the polluted object state with downstream node behavior to reach host-level code execution on the n8n server. This is where impact spikes: once the chain lands, the adversary can read environment variables, harvest stored credentials, and pivot through automation trust. Likely tooling is just the native n8n runtime plus built-in nodes; no public exploit framework is needed if the operator understands workflow composition.
Conditions required:
  • A compatible node chain that turns pollution into execution
  • n8n host or task runner has OS/network reach worth abusing
  • Workflow execution is permitted
Where this breaks in practice:
  • Least-privilege service accounts and isolated task runners reduce blast radius
  • Hardened containers, egress filtering, and secret scoping can limit post-exploitation value
  • No public PoC lowers copy-paste attacker volume
Detection/coverage: EDR on the host should catch child-process spawns, shell execution, unexpected interpreter launches, or anomalous outbound traffic from the n8n service account.
STEP 04

Exploit n8n’s trust position

After RCE, the attacker targets the real prize: credentials stored in n8n, .env secrets, database tokens, webhook secrets, and cloud API keys. Because n8n often orchestrates many internal and SaaS systems, one compromised instance can become a lateral-movement hub. Operators will typically use standard host tooling plus cloud/API clients rather than bespoke malware.
Conditions required:
  • Meaningful secrets or network access exist on the compromised host
  • n8n is connected to sensitive business workflows
Where this breaks in practice:
  • Secret rotation, scoped tokens, and outbound controls blunt follow-on abuse
  • Air-gapped or narrowly integrated n8n deployments have less strategic value
Detection/coverage: Watch for secret-store reads, bulk credential export, unusual API usage following n8n logins, and outbound traffic to new destinations. EDR plus cloud audit logs should correlate this stage.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo confirmed exploitation found in the reviewed sources. CISA KEV: not listed.
PoC availabilityNo public PoC found in reviewed sources. Cybersecurity Help says exploit availability is No public exploit available; GitHub advisory provides impact details but not exploit code.
EPSSGitHub shows an EPSS section for this advisory but no numeric value was populated in the captured page. Treat EPSS as not yet published / unavailable in public UI at publication time rather than as low risk.
KEV statusNo. Reviewed against the CISA KEV catalog; no entry found for CVE-2026-44791.
CNA / vendor scoringYour prompt said no authority score existed, but that changed: GitHub/n8n published a CNA-backed score on 2026-05-13 / 2026-05-14 of CVSS v4 9.4 CRITICAL with backward-compatible CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H.
Affected versions< 1.123.43, >= 2.0.0-rc.0, < 2.20.7, and >= 2.21.0, < 2.22.1 per OSV and GitHub advisory data.
Fixed versions1.123.43, 2.20.7, and 2.22.1 or later. Temporary mitigation: exclude n8n-nodes-base.xml via NODES_EXCLUDE.
Exposure / scanning realityBlack Kite cites ~60,833 n8n instances discoverable on Shodan. That is exposure context, not proof those hosts are vulnerable or grant editor roles.
Disclosure timelineVendor advisory published 2026-05-13 in n8n-io/n8n; GitHub Advisory Database published/reviewed it on 2026-05-14. OSV shows published time 2026-05-14T16:17:49Z.
Researcher / provenanceReporter credited as Simon Köck in the GitHub advisory. The bug is explicitly a bypass of prior XML-node issue GHSA-hqr4-h3xv-9m3r.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to HIGH (8.2/10)

The single biggest reason this is HIGH instead of CRITICAL is the attacker-position requirement: exploitation needs an authenticated user who can create or modify workflows, which is already a meaningful foothold in most enterprises. The reason it stays HIGH instead of falling further is n8n's role as an automation hub—successful exploitation can spill secrets and control into many downstream systems, not just one app container.

HIGH Affected/fixed versions and workaround details from primary advisories
HIGH Attack prerequisite of authenticated workflow-edit access
MEDIUM Real-world exposure estimate because Shodan counts do not equal exploitable editor-capable deployments
MEDIUM Lack of public exploitation / PoC based on currently reviewed sources

Why this verdict

  • Down from pure CVSS: the exploit chain starts with authenticated remote access *and* workflow create/modify rights, which implies prior compromise, insider access, or an already-privileged application user—not broad unauthenticated internet reach.
  • Still serious: once that gate is passed, impact is host-level RCE plus likely exposure of n8n-stored credentials, API tokens, webhook secrets, and connected-system trust.
  • Population narrows materially: many enterprises expose n8n only internally or restrict editor roles to admins/devops; that sharply reduces the fraction of deployments where a random internet attacker can directly exercise this bug.
  • Controls should stop the first step: SSO, MFA, conditional access, RBAC, and IdP telemetry are modern controls that should intercept the required account takeover stage before the XML bug is even reachable.
  • No field exploitation signal: no KEV listing and no public PoC found. That lowers immediate mass-exploitation pressure versus truly urgent externally reachable pre-auth RCE.

Why not higher?

This is not a pre-auth RCE and not a broad one-packet internet bug. Requiring a valid account plus workflow-edit capability compounds the friction: the attacker is either already inside, has already stolen a meaningful identity, or is an insider. That makes it a very dangerous *second-stage* vulnerability, not a universal emergency.

Why not lower?

Once exploited, the blast radius is bigger than a normal authenticated app bug because n8n often sits on a pile of secrets and integrations. Even with the access prerequisite, host compromise plus credential theft can cascade into cloud, SaaS, database, and internal API compromise, so backlog treatment would be irresponsible.

05 · Compensating Control

What to do — in priority order.

  1. Restrict workflow editing now — Limit workflow creation and modification rights to fully trusted admins/operators only, and complete that access review within the HIGH noisgate mitigation window of 30 days. This directly removes the most important prerequisite in the exploit chain.
  2. Disable the XML node where feasible — Set NODES_EXCLUDE=n8n-nodes-base.xml on affected self-hosted instances that do not need the XML node, and deploy that mitigation within 30 days if patching cannot happen first. This is the vendor-published short-term control and blocks the vulnerable feature path.
  3. Harden the n8n runtime identity — Run n8n under a low-privilege OS account or tightly confined container profile, and finish that containment work within 30 days. It will not stop exploitation, but it reduces the value of a successful RCE and limits secret and filesystem reach.
  4. Monitor for workflow and process abuse — Add detections for new or modified workflows using the XML node and for suspicious child processes or outbound connections from the n8n service account within 30 days. That gives you a realistic chance to catch post-auth exploitation and follow-on credential theft.
  5. Scope and rotate sensitive credentials selectively — If your n8n instance is internet-reachable or has a broad editor population, identify high-value stored credentials and begin selective rotation within 30 days where business impact allows. This contains the most likely post-exploitation payoff path.
What doesn't work
  • A perimeter WAF alone does not solve this, because the attack uses legitimate authenticated workflow functionality after login.
  • Version-only external vulnerability scans are not enough; they cannot tell you whether an exposed user actually has workflow-edit rights or whether the XML node is disabled.
  • MFA does not reduce impact *after* an attacker already has an active editor session or valid token; it helps only at the initial account-takeover step.
  • Disabling unrelated nodes does not help if the XML node remains available and editors can still build malicious workflows.
06 · Verification

Crowdsourced verification payload.

Run this on the target n8n host or container host. Invoke it as bash check-cve-2026-44791.sh for auto-detect, or pass an explicit version like bash check-cve-2026-44791.sh 2.20.6; no root is required unless you need elevated rights to inspect Docker containers.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-cve-2026-44791.sh
# Detect whether a local n8n installation version falls into the vulnerable ranges for CVE-2026-44791.
# Outputs exactly one of: VULNERABLE, PATCHED, UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -u

input_version="${1:-}"

auto_detect_version() {
  local v=""

  # 1) Direct binary
  if command -v n8n >/dev/null 2>&1; then
    v="$(n8n --version 2>/dev/null | head -n1 | tr -d '\r' | sed 's/^v//')"
    if [ -n "$v" ]; then
      echo "$v"
      return 0
    fi
  fi

  # 2) Common package.json locations
  for f in \
    /usr/local/lib/node_modules/n8n/package.json \
    /opt/n8n/package.json \
    /app/package.json \
    /usr/src/app/package.json
  do
    if [ -f "$f" ]; then
      v="$(grep -m1 '"version"' "$f" 2>/dev/null | sed -E 's/.*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/' | sed 's/^v//')"
      if [ -n "$v" ]; then
        echo "$v"
        return 0
      fi
    fi
  done

  # 3) Docker container image tags / exec
  if command -v docker >/dev/null 2>&1; then
    local cid
    cid="$(docker ps --format '{{.ID}} {{.Image}} {{.Names}}' 2>/dev/null | awk '/n8n/ {print $1; exit}')"
    if [ -n "$cid" ]; then
      v="$(docker exec "$cid" n8n --version 2>/dev/null | head -n1 | tr -d '\r' | sed 's/^v//')"
      if [ -n "$v" ]; then
        echo "$v"
        return 0
      fi
      v="$(docker inspect "$cid" --format '{{.Config.Image}}' 2>/dev/null | sed -n 's/.*:\([^:@]*\)$/\1/p' | sed 's/^v//')"
      if [ -n "$v" ]; then
        echo "$v"
        return 0
      fi
    fi
  fi

  return 1
}

normalize_version() {
  echo "$1" | tr -d '[:space:]' | sed 's/^v//'
}

version_ge() {
  # returns 0 if $1 >= $2
  [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | tail -n1)" = "$1" ]
}

version_lt() {
  # returns 0 if $1 < $2
  [ "$1" != "$2" ] && [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]
}

version_in_range() {
  # inclusive lower bound, exclusive upper bound
  local v="$1"
  local low="$2"
  local high="$3"
  version_ge "$v" "$low" && version_lt "$v" "$high"
}

is_vulnerable() {
  local v="$1"

  # Authoritative vulnerable ranges:
  #   < 1.123.43
  #   >= 2.0.0-rc.0, < 2.20.7
  #   >= 2.21.0, < 2.22.1

  if version_lt "$v" "1.123.43"; then
    return 0
  fi

  if version_in_range "$v" "2.0.0-rc.0" "2.20.7"; then
    return 0
  fi

  if version_in_range "$v" "2.21.0" "2.22.1"; then
    return 0
  fi

  return 1
}

main() {
  local v=""

  if [ -n "$input_version" ]; then
    v="$(normalize_version "$input_version")"
  else
    if ! v="$(auto_detect_version)"; then
      echo "UNKNOWN"
      exit 2
    fi
    v="$(normalize_version "$v")"
  fi

  if ! echo "$v" | grep -Eq '^[0-9]+(\.[0-9A-Za-z-]+)+$'; then
    echo "UNKNOWN"
    exit 2
  fi

  if is_vulnerable "$v"; then
    echo "VULNERABLE"
    exit 1
  else
    echo "PATCHED"
    exit 0
  fi
}

main
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, treat this as a HIGH post-auth RCE in a secrets-rich orchestration platform: identify every self-hosted n8n instance, immediately review who has workflow edit rights, and where patching is blocked disable the XML node or otherwise remove editor exposure within the noisgate mitigation SLA of 30 days. Then drive all vulnerable versions to 1.123.43, 2.20.7, 2.22.1, or later within the noisgate remediation SLA of 180 days—but do not wait that long for internet-facing or multi-editor instances, because those are the ones where the authenticated-access friction is weakest and the downstream blast radius is nastiest.

Sources

  1. n8n GitHub Security Advisory GHSA-wrwr-h859-xh2r
  2. GitHub Advisory Database GHSA-wrwr-h859-xh2r / CVE-2026-44791
  3. OSV entry for GHSA-wrwr-h859-xh2r
  4. Previous advisory GHSA-hqr4-h3xv-9m3r
  5. Snyk vulnerability record for CVE-2026-44791
  6. CISA Known Exploited Vulnerabilities Catalog
  7. Black Kite exposure and context writeup
  8. Cybersecurity Help vulnerability record
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.