Someone left a skeleton key in the form builder's suggestion box and anyone walking by can grab it
CVE-2026-12793 affects JetFormBuilder — Dynamic Blocks Form Builder for WordPress in all versions up to and including 3.6.2. The plugin fails to validate whether a submitted form ID actually belongs to a JetFormBuilder form. An attacker can point the submission handler at *any* WordPress post, whose content is then parsed as a form schema. The Advanced Validation server-side callback executes in this context, which lets an unauthenticated attacker forge a request that creates a new administrator-level user account. No credentials, no interaction, no special configuration — just a single crafted HTTP POST to any site running the plugin. The current stable fix is 3.6.5.3, available now on wordpress.org.
The vendor CVSS of 9.8 CRITICAL is honest and, for once, not inflated. An unauthenticated, network-reachable privilege escalation that creates admin accounts on a public-facing CMS checks every severity box: no auth required (PR:N), no user interaction (UI:N), low attack complexity (AC:L), and full CIA impact. WordPress sites are internet-facing by definition, so the 'network' attack vector is not theoretical — it is the default deployment posture. With 80,000+ active installations and WordPress plugin vulns historically weaponized within days of disclosure, the vendor score matches reality.
5 steps from start to impact.
Identify a vulnerable JetFormBuilder site
readme.txt or front-end asset versioning (e.g., /wp-content/plugins/jetformbuilder/assets/js/frontend.js?ver=3.6.2). Tools like WPScan, Nuclei templates, or even Shodan/FOFA dorks for JetFormBuilder JavaScript assets automate this at scale.- Target site runs WordPress with JetFormBuilder ≤ 3.6.2 active
- Site is reachable over the internet
- Plugin only has ~80K active installs, narrowing the target pool compared to top-100 WP plugins
Craft a malicious form submission with a spoofed form ID
/?action=jet_fb_submit or the REST route). Instead of referencing a legitimate JetFormBuilder form post ID, the attacker supplies the ID of a standard WordPress post or page whose content they can predict or control. The plugin blindly parses this post's content as if it were a form schema. This is the core validation bypass — the plugin trusts the form ID without verifying it belongs to a jet-form-builder post type.- Knowledge of a valid WordPress post ID on the target site (often guessable — post ID 1 exists on nearly every WordPress install)
- None significant — post IDs are sequential and predictable in WordPress
jet_fb_submit action with non-standard form IDs could catch this, but no vendor WAF rule exists yet.Trigger Advanced Validation callback execution
administrator as the desired role.- Advanced Validation module is loaded (it is by default in JetFormBuilder)
- The callback registry must include a function that can be abused for privilege escalation — the default registration callbacks qualify
wp_insert_user calls or new user creation events with administrator role is the best detection signal.New admin account is created
administrator role. The attacker logs in via /wp-login.php with the credentials they specified in the crafted request. Full site takeover is achieved — the attacker can install plugins, edit themes, upload web shells, or modify content.- WordPress user registration does not need to be enabled — the bypass creates the user directly via internal API
- None — this is the natural consequence of step 3 succeeding
wp_users table for unexpected admin account creation. Wordfence, Sucuri, and WP Activity Log plugins all alert on new administrator accounts.Post-exploitation: web shell and lateral movement
www-data, nginx, or apache). From here, the attacker can pivot to the underlying server, access wp-config.php for database credentials, and potentially move laterally if the server shares credentials or network access with other infrastructure.- Standard WordPress admin capabilities (plugin/theme editing enabled, which is the default)
- Host-level hardening (read-only filesystem,
DISALLOW_FILE_EDIT, containerized WordPress) can limit post-exploitation - EDR on the web server would catch web shell activity
The supporting signals.
| In-the-wild exploitation | Not confirmed. No CISA KEV listing as of 2026-09-17. No named campaigns yet. However, disclosure was only 24 hours ago — WordPress plugin vulns of this class (unauth admin creation) are historically mass-exploited within 3–7 days. |
|---|---|
| Proof-of-concept | No public PoC found as of 2026-09-17. No repos on GitHub, ExploitDB, or Nuclei templates specific to CVE-2026-12793 yet. The attack is conceptually simple (single HTTP POST), so weaponization is expected imminently. |
| EPSS score | 0.00388 (≈ 0.4%) — low but misleading for a just-disclosed CVE. EPSS lags disclosure by weeks; expect this to climb sharply once PoCs surface. |
| KEV status | Not listed. No CISA KEV entry as of 2026-09-17. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8. Full marks on exploitability (network, low complexity, no auth, no interaction). Unchanged scope is accurate since the vuln stays within the WordPress application boundary. |
| Affected versions | JetFormBuilder ≤ 3.6.2 — all prior versions are vulnerable. |
| Fixed version | 3.6.5.3 is the current stable release (updated 2026-09-15). The changelog references *"Secure SSR callbacks with admin-managed registry"* which directly addresses this CVE's root cause. Versions 3.6.3 through 3.6.5.2 may contain partial fixes but also have their own CVEs (CVE-2026-13459, CVE-2026-28140); update to 3.6.5.3 minimum. |
| Scanning/exposure data | 80,000+ active installations per wordpress.org (as of 2026-09-17). All are internet-facing WordPress sites by default. No GreyNoise/Shodan honeypot tags for this CVE yet. |
| Disclosure date | 2026-09-16 (NVD published). |
| Reporting researcher | Not publicly attributed in available advisories. Likely reported via Patchstack or Wordfence bug bounty programs based on the advisory sources. |
noisgate verdict.
The single most decisive factor is the unauthenticated, internet-facing attack surface — every one of the 80,000+ sites running this plugin is reachable without credentials, and the chain ends in full admin takeover via a single HTTP POST. No prerequisite narrows the reachable population below the floor; WordPress sites are public by design.
Why this verdict
- Unauthenticated + internet-facing: The plugin runs on WordPress, which is public-facing by definition.
PR:Nmeans no credential barrier — every exposed site is a valid target with zero prerequisites. - Trivial attack complexity: The chain is a single crafted HTTP POST. No race condition, no memory corruption, no chained gadgets. Form ID values are guessable (sequential WordPress post IDs). This will be automated at scale.
- Full admin takeover impact: Successful exploitation creates an administrator account, giving the attacker complete control of the WordPress site — content modification, plugin installation, web shell upload, and access to
wp-config.phpdatabase credentials. - Role multiplier: WordPress is typically a *line-of-business web application* (role b). It is not canonically a high-value infrastructure component (not a DC, hypervisor, CI/CD, or IdP). However, admin takeover → web shell → server-level code execution can reach database credentials and potentially enable lateral movement. For e-commerce sites, PII and payment data are directly at risk. The blast radius is site-level to server-level, not fleet-level, but the *population* of reachable targets (80K internet-facing sites, all unauthenticated) compensates. The floor remains CRITICAL because the attack requires zero prior access and the exposed population is the entire installed base.
- Historical pattern: WordPress plugin vulns with unauthenticated admin creation (cf. WPGateway CVE-2022-3180, Jenga Forms, Ultimate Member CVE-2023-32243) are mass-exploited within days. Bot frameworks like WPScan and Jetrail add templates rapidly.
Why not higher?
A 9.8 would require scope change (S:C) or supply-chain impact. The vulnerability is contained within the WordPress application boundary — it does not escape to the host OS without additional post-exploitation steps. The 80K install base, while significant, is not in the millions. The score of 9.6 reflects the extremely low friction but acknowledges the blast radius is site-level, not fleet-level.
Why not lower?
Downgrading below CRITICAL would require a meaningful friction point that narrows the reachable population — there is none. The attack is unauthenticated, requires no user interaction, has low complexity, and targets internet-facing sites. Every single installation is exposed. The only mitigating factor (80K vs. millions of installs) affects *scale* but not *severity per affected site*. Any WordPress site running JetFormBuilder ≤ 3.6.2 is fully compromisable with a single request.
What to do — in priority order.
- Update JetFormBuilder to 3.6.5.3 immediately — This is the primary remediation. The update is available via WordPress dashboard auto-update or WP-CLI (
wp plugin update jetformbuilder). Under the noisgate mitigation SLA for CRITICAL, deploy within 3 days (by 2026-09-20). Given this is a simple plugin update with no breaking changes, same-day deployment is realistic. - Deploy a WAF rule blocking malicious form submissions — Add a rule to your WAF (Cloudflare, Sucuri, Wordfence) that blocks POST requests to JetFormBuilder submission endpoints where the form ID references a non-
jet-form-builderpost type. As a stopgap, block all requests matchingaction=jet_fb_submitif you can tolerate disabling form submissions temporarily. Deploy within 3 days. - Monitor for rogue administrator accounts — Query your WordPress databases across all managed sites:
SELECT * FROM wp_users u JOIN wp_usermeta m ON u.ID = m.user_id WHERE m.meta_key = 'wp_capabilities' AND m.meta_value LIKE '%administrator%' ORDER BY u.user_registered DESC;. Alert on any admin account created after 2026-09-14. Run this daily until patched. - Disable JetFormBuilder if not business-critical — If the plugin's forms are not actively used, deactivate it via WP-CLI across your fleet:
wp plugin deactivate jetformbuilder. A deactivated plugin cannot process submissions. This is the zero-risk mitigation. - Enable DISALLOW_FILE_EDIT in wp-config.php — Add
define('DISALLOW_FILE_EDIT', true);to limit post-exploitation impact. Even if an admin account is created, the attacker cannot edit theme/plugin files via the WordPress admin panel. This does NOT prevent the initial privilege escalation but limits the blast radius.
- WordPress user registration settings — disabling 'Anyone can register' in Settings → General does NOT help. The vulnerability bypasses the registration system entirely by calling
wp_insert_user()directly through the callback. - Rate limiting on login — this stops brute-force attacks, not privilege escalation. The attacker creates a valid admin account, so login rate limits are irrelevant.
- Two-factor authentication on existing admins — 2FA protects existing accounts from credential theft. It does not prevent creation of a new admin account that the attacker controls. The new account will not have 2FA enabled unless your 2FA plugin enforces it for all new users by policy.
Crowdsourced verification payload.
Run this on any host with curl and jq installed, or your auditor workstation. Pass the target WordPress site URL as the first argument. No authentication needed — this is a version check only, not an exploit. Example: bash check_jetformbuilder.sh https://example.com
#!/usr/bin/env bash
# CVE-2026-12793 JetFormBuilder version checker
# Usage: bash check_jetformbuilder.sh <wordpress_site_url>
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
TARGET="${1:?Usage: $0 <wordpress_site_url>}"
TARGET="${TARGET%/}"
VULN_MAX="3.6.2"
PLUGIN_SLUG="jetformbuilder"
# Try readme.txt first (most reliable for version detection)
README_URL="${TARGET}/wp-content/plugins/${PLUGIN_SLUG}/readme.txt"
VERSION=""
README_RESP=$(curl -sL -o /dev/null -w "%{http_code}" "$README_URL" 2>/dev/null)
if [ "$README_RESP" = "200" ]; then
VERSION=$(curl -sL "$README_URL" 2>/dev/null | grep -i '^Stable tag:' | head -1 | sed 's/[Ss]table tag:[[:space:]]*//' | tr -d '[:space:]')
fi
# Fallback: check frontend JS asset version parameter
if [ -z "$VERSION" ]; then
JS_URL="${TARGET}/wp-content/plugins/${PLUGIN_SLUG}/assets/js/frontend.js"
JS_RESP=$(curl -sL -o /dev/null -w "%{http_code}" "$JS_URL" 2>/dev/null)
if [ "$JS_RESP" = "200" ]; then
# Try fetching homepage and grepping for versioned asset
VERSION=$(curl -sL "$TARGET" 2>/dev/null | grep -oP "${PLUGIN_SLUG}[^\"]*ver=\K[0-9]+\.[0-9]+\.[0-9]+[0-9.]*" | head -1)
fi
fi
if [ -z "$VERSION" ]; then
echo "UNKNOWN — JetFormBuilder not detected or version could not be determined at ${TARGET}"
exit 2
fi
echo "Detected JetFormBuilder version: ${VERSION}"
# Version comparison function
version_lte() {
[ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]
}
if version_lte "$VERSION" "$VULN_MAX"; then
echo "VULNERABLE — JetFormBuilder ${VERSION} is affected by CVE-2026-12793 (all versions <= ${VULN_MAX})"
echo "ACTION: Update to 3.6.5.3 or later immediately."
exit 1
else
echo "PATCHED — JetFormBuilder ${VERSION} is above the vulnerable range (${VULN_MAX})."
exit 0
fiIf you remember one thing.
wp plugin update jetformbuilder across your fleet Monday morning, audit wp_users for rogue admin accounts created after September 14, and confirm no web shells were dropped. If you cannot patch immediately, deactivate the plugin or deploy a WAF rule blocking jet_fb_submit requests until the update is applied.Sources
- NVD / CVE-2026-12793 alert
- Patchstack advisory for JetFormBuilder
- JetFormBuilder on WordPress.org (changelog + version)
- OpenCVE — JetFormBuilder vulnerabilities
- CVE-2026-28140 — related JetFormBuilder broken access control
- CVE-2026-19859 — JetFormBuilder unauthenticated shortcode execution
- WPScan — JetFormBuilder security vulnerabilities
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.