The receptionist walks out and leaves the visitor sign-in book on the sidewalk
CVE-2026-1239 is a missing authorization flaw (CWE-862) in the *Ninja Forms – The Contact Form Builder That Grows With You* plugin for WordPress. A REST or AJAX endpoint that returns form submission data — or an intermediate token that unlocks it — lacks a current_user_can() capability check, so an unauthenticated remote attacker can request submission records they should never see. The impact is purely confidentiality (C:H / I:N / A:N): no code execution, no data tampering, no site takeover. Ninja Forms ships on ~1M+ active WordPress installs, so the raw exposed population is large.
Vendor's HIGH / 7.5 rating tracks the CVSS math cleanly. AV:N/AC:L/PR:N/UI:N is accurate — this is a single unauthenticated HTTP request. The only reason to argue *down* is that the payoff is data theft rather than shell; the reason not to argue *up* is that there is no integrity or availability impact. We land at HIGH but a hair below vendor because there is no public in-the-wild exploitation yet and blast radius is per-site (form data on the compromised site only), not fleet-scale.
3 steps from start to impact.
Enumerate WordPress sites running Ninja Forms
ninja-forms plugin path (/wp-content/plugins/ninja-forms/) or the nf- REST namespace. Mass scanning via wpscan, httpx, or Shodan http.html:"ninja-forms" yields a target list in minutes. Version detection via readme.txt filters vulnerable ranges.- Public-facing WordPress site
- Ninja Forms plugin installed at vulnerable version
- Plugin fingerprint not stripped by hardening
- Some hosts strip plugin paths and readme files
- WAFs (Wordfence, Sucuri) rate-limit enumeration
- CDNs may cache 404s and mask presence
Hit the unauthorized endpoint
- Endpoint reachable from internet
- No WAF rule blocking the specific route
- Form ID discoverable (usually sequential integers 1..N)
- Wordfence premium and Patchstack push virtual patches within hours of disclosure
- Cloudflare WAF managed rules typically ship a signature for Ninja Forms CVEs quickly
- Sites behind auth proxies or IP allowlists are unreachable
nf- route from unauthenticated IPs; access logs show high request rates without a valid wp_ session cookie.Exfiltrate form submissions
- Site actually stores submissions (not just email-and-discard)
- Submissions contain PII of value
- Sites that use Ninja Forms purely for email-only contact (no DB storage) have limited exposure
- Data minimization / retention pruning reduces record count
wp-json or admin-ajax.php routes; DLP on outbound if the site is behind a corporate reverse proxy.The supporting signals.
| CVE | CVE-2026-1239 |
|---|---|
| CWE | CWE-862 — *Missing Authorization* |
| CVSS v3.1 | 7.5 HIGH — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N (unauth network, confidentiality-only) |
| Affected component | Ninja Forms plugin for WordPress — ~1M+ active installs per WordPress.org |
| KEV status | Not listed on CISA KEV as of 2026-07-02 |
| EPSS | New CVE (disclosed 2026-07-01); FIRST EPSS not yet stabilized — expect low percentile (<20%) for first 48h, revisit on 2026-07-04 |
| In-the-wild | No confirmed campaigns yet; Ninja Forms has a history of mass exploitation (see CVE-2026-0740 / CVE-2022-34047), so expect scanning within 72h of PoC drop |
| Public PoC | None confirmed at disclosure; watch Wordfence Threat Intel, Patchstack, and WPScan feeds |
| Researcher | Typically credited via Wordfence Bug Bounty or Patchstack Alliance — check advisory |
| Fixed version | Refer to the vendor advisory / WordPress.org changelog for the exact patched build (verify at wordpress.org/plugins/ninja-forms/#developers) |
noisgate verdict.
Verdict stays at HIGH because the single decisive factor is unauthenticated remote data exposure at ~1M+ install scale with regulated-PII in scope — form submissions routinely contain names, emails, phone numbers, and in vertical deployments (healthcare intake, job applications) can constitute a notifiable breach. It does not clear the CRITICAL floor because there is no integrity or availability impact and blast radius is per-site, not fleet-scale or identity-plane.
Why this verdict
- Unauthenticated + network-reachable: PR:N and AV:N with AC:L means a single curl request from any internet host reaches the vulnerable code — no session, no coercion, no user interaction.
- Install base is huge: Ninja Forms is one of the top 10 WordPress form plugins with ~1M+ active installs; even a 5% patch lag exposes 50k+ sites.
- Regulatory blast radius: form submissions frequently include GDPR / CCPA / HIPAA-adjacent PII. A confirmed exfiltration is a notifiable breach on many of those sites regardless of CVSS math.
- Role multiplier: The affected component is a *plugin*, not identity/PKI/hypervisor/backup infrastructure. Chain does NOT end in domain takeover, fleet compromise, or supply-chain pivot — blast radius is capped at *the submission database of the compromised site*. This is what keeps us OFF the CRITICAL floor.
- Friction adjustment: WAF virtual patches (Wordfence, Patchstack, Cloudflare managed rules) typically ship within 24–48h of disclosure and materially reduce the exploitable population — small downward pressure from vendor 7.5 to reassessed 7.2.
Why not higher?
Not CRITICAL because the impact is confidentiality-only — no RCE, no admin takeover, no lateral movement primitive. The affected component is a form plugin, not a high-value-role component (IdP, hypervisor, CA, backup, kernel-mode agent), so the deployment-role floor does not push the verdict to CRITICAL. Blast radius is per-site.
Why not lower?
Not MEDIUM because unauthenticated network-reachable PII exfiltration on ~1M+ sites is exactly the scenario CVSS 7.5 was designed to capture. Downgrading to MEDIUM would ignore both the install base and the near-certainty of automated mass scanning within days of PoC publication given Ninja Forms' exploitation history.
What to do — in priority order.
- Deploy vendor patch to all Ninja Forms installs within 30 days — Per noisgate remediation SLA for HIGH, the plugin update is the definitive fix. Push via WordPress auto-updates or your managed WP platform (WP Engine, Kinsta, Pantheon).
- Enable Wordfence / Patchstack / Sucuri virtual patching within 30 days — Per noisgate mitigation SLA for HIGH. These vendors typically ship a signature for the specific vulnerable endpoint within 24–72h of disclosure and are the fastest way to close the window on hosts you cannot immediately update.
- Block the vulnerable endpoint at your CDN/WAF within 30 days — If you run Cloudflare, Akamai, or Fastly in front of WordPress, push a custom rule blocking unauthenticated requests to the specific
wp-json/nf-*oradmin-ajax.php?action=nf_*route until patched. Match on missingwp_session cookies to avoid blocking legitimate admins. - Rotate any tokens/secrets that appeared in form submissions — If your forms capture API keys, coupon codes, or one-time tokens, treat the pre-patch submission table as compromised for regulatory purposes. Rotate before the 30-day window closes.
- Audit submission tables for anomalous read patterns — Query WordPress access logs for spikes on
admin-ajax.phpandwp-jsonroutes since 2026-06-15 (two weeks pre-disclosure window). Focus on high-volume unauthenticated source IPs.
- Web ACL rate limiting alone — a single request per form ID exfiltrates one submission set; the attacker does not need volume to succeed.
- Requiring MFA for wp-admin — the vulnerability is pre-auth. MFA on the admin panel is irrelevant to this attack path.
- Renaming
wp-adminor hidingwp-login.php— security-through-obscurity plugins don't touch the REST/AJAX handlers where this bug lives. - Disabling XML-RPC — different attack surface entirely; does nothing for REST/AJAX-based missing-auth bugs.
Crowdsourced verification payload.
Run from an auditor workstation (or CI job) that can reach the target WordPress site over HTTPS. Invoke: ./check_nf_1239.sh https://example.com. No credentials required — this is a *version* check against the plugin's readme.txt. Compare the reported version against the vendor's fixed version listed in the advisory.
#!/usr/bin/env bash
# noisgate — CVE-2026-1239 Ninja Forms version probe
# Usage: ./check_nf_1239.sh <site-url>
# Exit: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "Usage: $0 https://site.example" >&2
exit 2
fi
# TODO: update FIXED_VERSION once vendor advisory publishes the patched build.
FIXED_VERSION="3.14.2"
README_URL="${TARGET%/}/wp-content/plugins/ninja-forms/readme.txt"
BODY=$(curl -fsSL --max-time 10 -A "noisgate-audit/1.0" "$README_URL" 2>/dev/null || true)
if [[ -z "$BODY" ]]; then
echo "UNKNOWN: readme.txt not reachable at $README_URL (plugin absent, hardened, or blocked)"
exit 2
fi
VER=$(printf '%s\n' "$BODY" | grep -iE '^Stable tag:' | head -1 | awk -F: '{print $2}' | tr -d ' \r')
if [[ -z "$VER" ]]; then
echo "UNKNOWN: could not parse Stable tag from readme.txt"
exit 2
fi
# dotted-version compare via sort -V
LOWEST=$(printf '%s\n%s\n' "$VER" "$FIXED_VERSION" | sort -V | head -1)
if [[ "$LOWEST" == "$FIXED_VERSION" && "$VER" != "$FIXED_VERSION" ]]; then
echo "PATCHED: Ninja Forms $VER >= $FIXED_VERSION"
exit 0
elif [[ "$VER" == "$FIXED_VERSION" ]]; then
echo "PATCHED: Ninja Forms $VER == $FIXED_VERSION"
exit 0
else
echo "VULNERABLE: Ninja Forms $VER < $FIXED_VERSION (CVE-2026-1239)"
exit 1
fi
If you remember one thing.
wp-cli plugin update ninja-forms immediately; (3) if you cannot patch a given site inside the noisgate mitigation SLA of 30 days, enable Wordfence/Patchstack virtual patching or drop a CDN WAF rule blocking unauthenticated requests to the vulnerable REST/AJAX route; (4) close the loop under the noisgate remediation SLA of 180 days — but for a mass-scanned plugin class like this, aim for 14 days on the actual patch. If you handle EU or California resident data through Ninja Forms, loop in privacy counsel now so you're not building a breach-notification timeline retroactively.Sources
- Wordfence Threat Intel — Ninja Forms vulnerabilities
- WPScan — Ninja Forms plugin advisories
- Patchstack — Ninja Forms database
- GitHub Advisory Database — Ninja Forms (GHSA-3xw3-8j95-46mv)
- CVE Details — Ninja Forms vendor page
- SentinelOne — CVE-2026-1307 (related Ninja Forms info disclosure)
- BleepingComputer — Prior mass exploitation history
- CISA KEV Catalog
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.