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.
4 steps from start to impact.
Obtain an editor-capable n8n account
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.- Remote reachability to the
n8nlogin surface or internal network access - Valid credentials or session token
- Role with workflow create/modify permissions
- 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
n8n audit/auth logs, impossible-travel, new-device sign-ins, and anomalous editor logins. Network scanners cannot validate the required role.Build a malicious workflow using the XML node
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.- Target version in a vulnerable range
- XML node enabled and available to the attacker
- Ability to save or run edited workflows
- Disabling
n8n-nodes-base.xmlkills this path outright - Some orgs require workflow review before production activation
- SCA/SBOM catches versions, but not whether XML is actually exposed to editors
Chain polluted state into code execution
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.- A compatible node chain that turns pollution into execution
n8nhost or task runner has OS/network reach worth abusing- Workflow execution is permitted
- 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
n8n service account.Exploit n8n’s trust position
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.- Meaningful secrets or network access exist on the compromised host
n8nis connected to sensitive business workflows
- Secret rotation, scoped tokens, and outbound controls blunt follow-on abuse
- Air-gapped or narrowly integrated
n8ndeployments have less strategic value
n8n logins, and outbound traffic to new destinations. EDR plus cloud audit logs should correlate this stage.The supporting signals.
| In-the-wild status | No confirmed exploitation found in the reviewed sources. CISA KEV: not listed. |
|---|---|
| PoC availability | No 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. |
| EPSS | GitHub 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 status | No. Reviewed against the CISA KEV catalog; no entry found for CVE-2026-44791. |
| CNA / vendor scoring | Your 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 versions | 1.123.43, 2.20.7, and 2.22.1 or later. Temporary mitigation: exclude n8n-nodes-base.xml via NODES_EXCLUDE. |
| Exposure / scanning reality | Black Kite cites ~60,833 n8n instances discoverable on Shodan. That is exposure context, not proof those hosts are vulnerable or grant editor roles. |
| Disclosure timeline | Vendor 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 / provenance | Reporter credited as Simon Köck in the GitHub advisory. The bug is explicitly a bypass of prior XML-node issue GHSA-hqr4-h3xv-9m3r. |
noisgate verdict.
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.
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
n8nonly 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.
What to do — in priority order.
- 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.
- Disable the XML node where feasible — Set
NODES_EXCLUDE=n8n-nodes-base.xmlon 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. - Harden the n8n runtime identity — Run
n8nunder 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. - 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
n8nservice account within 30 days. That gives you a realistic chance to catch post-auth exploitation and follow-on credential theft. - Scope and rotate sensitive credentials selectively — If your
n8ninstance 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.
- A perimeter
WAFalone 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.
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.
#!/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
If you remember one thing.
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
- n8n GitHub Security Advisory GHSA-wrwr-h859-xh2r
- GitHub Advisory Database GHSA-wrwr-h859-xh2r / CVE-2026-44791
- OSV entry for GHSA-wrwr-h859-xh2r
- Previous advisory GHSA-hqr4-h3xv-9m3r
- Snyk vulnerability record for CVE-2026-44791
- CISA Known Exploited Vulnerabilities Catalog
- Black Kite exposure and context writeup
- Cybersecurity Help vulnerability record
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.