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.wp-json/nf-* or admin-ajax.php?action=nf_* route until patched. Match on missing wp_ session cookies to avoid blocking legitimate admins.admin-ajax.php and wp-json routes 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.
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) |
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
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.
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