A junior dataflow editor walks into the secrets vault because the lock only checked the front door
Apache NiFi enforces an extra authorization tier called *Restricted* on components that can execute code, touch the filesystem, or otherwise reach outside the dataflow sandbox — think ExecuteProcess, ExecuteScript, GetFile. In versions 1.12.0 through 2.9.0, the framework forgot to re-check Restricted status when a user replaced an entire Process Group. A principal with ordinary write access on a Process Group could swap in a flow definition containing Restricted processors and the framework would happily accept it, even though the same user could not have added those processors individually. Once instantiated, Restricted processors run with the NiFi service account's privileges — which on most deployments means access to every database, S3 bucket, Kafka topic, and SFTP credential NiFi holds.
Vendor severity of HIGH (7.5) is defensible but slightly generous given the PR:H requirement — the attacker must already hold authenticated write access. We're holding the verdict at HIGH because the blast radius offsets the friction: NiFi is canonically a credential-rich data orchestrator, and the escalation path goes from *trusted contributor* to *full code execution as the NiFi service principal*. That's a classic insider-privesc footgun, not a perimeter RCE.
4 steps from start to impact.
Obtain authenticated NiFi write access
write on at least one Process Group but lacks access restricted components policy. This is the *power user / dataflow developer* persona — common in shared NiFi clusters used by multiple data teams. Credentials are typically obtained via phishing, stolen SSO tokens, or insider abuse.- Valid NiFi credentials
- Write permission on a target Process Group
- Network reach to NiFi REST API (8443)
- NiFi REST API rarely internet-exposed (Shodan shows ~2k hosts globally)
- SSO + MFA on the IdP fronting NiFi blocks credential replay
- Read-only or scoped policies eliminate this pre-req entirely
Craft a malicious flow definition containing Restricted components
ExecuteStreamCommand, ExecuteScript, or ExecuteProcess with a payload — typically a reverse shell, credential exfil to webhook, or cat /etc/nifi/conf/login-identity-providers.xml. NiFi's flow-definition format is well documented and templates can be authored offline.- Knowledge of NiFi flow JSON schema
- Choice of Restricted processor that executes attacker code
- None — flow authoring is public knowledge
Invoke Process Group replace API
POST /nifi-api/process-groups/{id}/flow-contents (the replace-contents endpoint) with the malicious flow. Pre-patch framework checks only the caller's write permission on the Process Group, not the Restricted policy on the embedded processors. The replacement succeeds and the Restricted processors are instantiated.- Step 1 + 2 satisfied
- Target Process Group exists and is writable
- Custom authorizers (e.g., Ranger-NiFi plugin) that enforce per-component-class policies will still block this
- Multi-tenant clusters with strict Process Group ACLs limit reach
nifi-user.log records the API call; the Restricted component appears in the flow without a corresponding policy grant — easy correlation ruleTrigger execution, achieve code exec as NiFi service account
nifi on Linux or a domain service account on Windows. From here: harvest the encrypted-properties decryption key from nifi.properties, read every flow secret, pivot to any database/cloud creds NiFi holds.- Restricted processor successfully instantiated
- Ability to start the processor or wait for scheduled tick
- NiFi running as unprivileged user with locked-down filesystem perms limits lateral reach
- Network egress filtering blocks reverse shell callbacks
- Sensitive properties protected with HSM/external KMS resist offline decryption
java spawning bash/cmd; outbound connections from NiFi to unusual destinationsThe supporting signals.
| In-the-wild exploitation | None observed as of 2026-06-22. No public IOCs, no campaign reporting. |
|---|---|
| Public PoC | None published at disclosure. Construction is trivial for anyone familiar with NiFi flow JSON — expect a Metasploit module or standalone PoC within weeks. |
| EPSS | Not yet scored (fresh CVE published 2026-06-22); historical NiFi authz CVEs trend <1% / <50th percentile. |
| KEV status | Not listed. |
| CVSS:4.0 vector | AV:N/AC:L/AT:P/PR:H/UI:N/VC:H/VI:H/VA:H — PR:H is the decisive friction: attacker must already hold authenticated write access. |
| Affected versions | Apache NiFi 1.12.0 through 2.9.0 inclusive. |
| Fixed version | Apache NiFi 2.10.0 (framework no longer enforces Restricted authorization in this code path; equivalent guardrails moved into the authorizer layer). Confirm against the project's official advisory before relying on this. |
| Exposure / scanning data | Shodan reports ~2,100 NiFi instances with web UI reachable from the internet (most behind auth). The vast majority of NiFi deployments are *internal* data-platform components. |
| Disclosure date | 2026-06-22 |
| Reporter | Roberto Suggi Liverani, NATO Cyber Security Centre (NCSC) |
noisgate verdict.
Verdict held at HIGH because the affected component is a canonical credential-rich data orchestrator — successful exploitation yields code execution as the NiFi service principal, which typically holds keys to every downstream database, object store, and message bus. The PR:H requirement narrows the attacker population to authenticated insiders or credential-phish victims, which prevents an upgrade to CRITICAL but does not justify a downgrade given the blast radius.
Why this verdict
- Authentication required (PR:H) — this is a privilege-escalation primitive, not a perimeter break. Attackers need a valid NiFi account with at least Process Group write, which limits the attacker pool to insiders, contractors, and credential-theft victims. That eats roughly −1.5 off the vendor score versus an unauthenticated RCE.
- Role multiplier — NiFi as canonical data-pipeline orchestrator: in the typical deployment NiFi holds DB credentials, S3 access keys, Kafka SASL secrets, and SFTP creds. The Restricted-processor escalation grants RCE as the service principal, and from there *mass data egress* is one
ExecuteStreamCommandaway. Blast radius is tenant- to data-domain-scale, holding the floor at HIGH. - Role multiplier — multi-team shared NiFi clusters (common at large enterprises) are the worst case: a low-trust dataflow author pivots to flows owned by adjacent teams. Outcome: cross-team credential theft inside one cluster.
- No KEV, no public PoC — keeps the verdict from being upgraded; weaponization is trivial but not yet observed.
- Custom authorizer deployments (Apache Ranger plugin, file-based authorizer with explicit Restricted policies) may already block the exploit chain. That nudges the effective score down for hardened shops but does not change the bucket — most shipped configs use the default authorizer.
Why not higher?
CRITICAL requires either unauthenticated reachability or fleet-scale blast radius on a universally deployed component. PR:H eliminates the unauthenticated path, NiFi is not ubiquitous like Exchange or vCenter, and there is no active exploitation or KEV listing. The chain ends at the NiFi service principal — meaningful, but not domain-wide.
Why not lower?
MEDIUM would require either narrow affected range, low-value blast radius, or strong inherent friction beyond authentication. None apply: the affected range covers ~14 years of releases (1.12.0–2.9.0), the blast radius reaches every secret NiFi holds, and authenticated *write* access is a common power-user level in multi-team data platforms — not an admin-only choke point.
What to do — in priority order.
- Audit and tighten Process Group
writepolicies — Inventory every principal with write access on every Process Group via the NiFi/policiesAPI. Remove standing write from anyone who doesn't actively author flows; move occasional editors to just-in-time access. Deploy within 30 days per the noisgate mitigation SLA. - Enable an authorizer that enforces Restricted policies independently — Configure file-based or Ranger authorizer with explicit
access restricted componentspolicies separate from generic write. The framework patch removes the in-framework check; the authorizer is now the only line of defense — make sure it's actually enforcing. Deploy within 30 days. - Front NiFi with SSO + MFA, block direct password auth — Most attack paths to step 1 are credential reuse or phishing. Force PingFederate / Okta / Azure AD in front of NiFi with conditional-access MFA. Disable single-user provider in production. Deploy within 30 days.
- Run NiFi as an unprivileged service account with egress filtering — Reduces step-4 blast radius even if the chain lands. NiFi JVM should not have outbound internet by default; allowlist only required downstream endpoints. Apply immediately as a defense-in-depth standard.
- Enable NiFi audit logging into SIEM and alert on flow-replace API calls — Add a detection on
POST /nifi-api/process-groups/*/flow-contentscorrelated with new Restricted component instantiation by a principal that doesn't hold theaccess restricted componentspolicy. Deploy within 30 days.
- WAF / IPS signatures on the REST endpoint — the request looks like a legitimate flow update from an authenticated session; payload is JSON flow definition that varies infinitely.
- Network segmentation alone — the attacker is already inside the trust boundary as an authenticated user; firewall rules don't stop authorized API calls.
- Disabling specific Restricted processors at the bundle level — attackers can ship their own NAR or pick from dozens of Restricted classes; whack-a-mole.
- Read-only mirror / DR cluster patching first — those don't accept flow writes; the production active cluster is the exposed surface.
Crowdsourced verification payload.
Run on each NiFi node as the nifi service user (or any user with read access to the install directory). Invoke as ./check_nifi_44914.sh /opt/nifi/nifi-current. No elevated privileges required — just reads NOTICE / version metadata.
#!/usr/bin/env bash
# noisgate check for CVE-2026-44914 (Apache NiFi Restricted authz bypass)
# Usage: ./check_nifi_44914.sh <NIFI_HOME>
# Exit 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
NIFI_HOME="${1:-/opt/nifi/nifi-current}"
if [ ! -d "$NIFI_HOME" ]; then
echo "UNKNOWN: NIFI_HOME '$NIFI_HOME' not found" >&2
exit 2
fi
# Try to extract version from bootstrap or lib jars
VERSION=""
if [ -f "$NIFI_HOME/conf/bootstrap.conf" ]; then
VERSION=$(grep -hoE 'nifi[-_]framework[-_]nar[-_][0-9]+\.[0-9]+\.[0-9]+' "$NIFI_HOME/lib/" 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
fi
if [ -z "$VERSION" ]; then
JAR=$(ls "$NIFI_HOME"/lib/nifi-framework-nar-*.nar 2>/dev/null | head -1)
if [ -n "$JAR" ]; then
VERSION=$(echo "$JAR" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
fi
fi
if [ -z "$VERSION" ]; then
echo "UNKNOWN: could not determine NiFi version in $NIFI_HOME" >&2
exit 2
fi
echo "Detected NiFi version: $VERSION"
# Semver compare: vulnerable if 1.12.0 <= version <= 2.9.0
IFS='.' read -r MAJ MIN PAT <<< "$VERSION"
ver_num=$((MAJ*1000000 + MIN*1000 + PAT))
low=$((1*1000000 + 12*1000 + 0)) # 1.12.0
high=$((2*1000000 + 9*1000 + 0)) # 2.9.0
fix=$((2*1000000 + 10*1000 + 0)) # 2.10.0 (fixed)
if [ "$ver_num" -ge "$low" ] && [ "$ver_num" -le "$high" ]; then
echo "VULNERABLE: NiFi $VERSION is in affected range 1.12.0-2.9.0 for CVE-2026-44914"
exit 1
elif [ "$ver_num" -ge "$fix" ]; then
echo "PATCHED: NiFi $VERSION is at or above fix 2.10.0"
exit 0
else
echo "PATCHED: NiFi $VERSION predates affected range"
exit 0
fi
If you remember one thing.
nifi.properties, flag everything in 1.12.0–2.9.0. For those instances, per the noisgate mitigation SLA for HIGH, within 30 days audit Process Group write policies and confirm your authorizer enforces access restricted components as a distinct policy — those two controls neuter the exploit chain without a code change. Per the noisgate remediation SLA, schedule the upgrade to Apache NiFi 2.10.0 (or later) within 180 days; bundle it with your next quarterly platform maintenance window since there's no KEV and no public PoC pressuring a fire-drill. If your NiFi is internet-exposed *or* shared across teams without per-team Process Group isolation, treat both deadlines as half — 15 days mitigation, 90 days patch.Sources
- Vulnerability-Lookup (CIRCL) — CVE-2026-44914
- Cyberpress — Critical Apache NiFi Vulnerabilities Enable Authorization Bypass
- GBHackers — Apache NiFi Vulnerabilities Expose Systems to Authorization Bypass
- Cybersecurity News — Apache NiFi Authorization Bypass
- Apache NiFi Security Reporting & Advisories
- stack.watch — Apache NiFi Security Vulnerabilities 2026
- CVE Details — Apache NiFi vulnerability list
- Related CVE-2026-25903 mailing list announcement (sibling NiFi authz bug)
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.