← Back to Feed CACHED · 2026-07-01 16:43:41 · CACHE_KEY CVE-2026-11380
CVE-2026-11380 · CWE-79 · Disclosed 2026-07-01

The JetWidgets For Elementor plugin for WordPress is vulnerable to Stored Cross-Site Scripting in versions…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A contributor with a pen writes JavaScript into a widget and it fires when anyone loads the page

JetWidgets For Elementor is a free widget pack for the Elementor page builder on WordPress. Versions up to and including 1.0.21 fail to properly sanitize and/or escape one or more widget attributes before rendering them, allowing a user with Contributor privileges or higher to inject arbitrary JavaScript that executes in the browser of any visitor who later loads the affected page. This is a classic stored XSS via authenticated post/widget input — the plugin trusts what an editorial user types into a shortcode/widget attribute and echoes it back into the DOM.

The vendor's 6.4 MEDIUM rating is accurate. CVSS scope-change (S:C) reflects that the payload runs in the site visitor's browser context, not the plugin's, and PR:L correctly captures the Contributor requirement. This is not a preauth site takeover — but it is also not zero. On a multi-author blog or membership site where Contributor is a self-service role, this is a real path to session theft against editors and admins.

"Authenticated contributor-level stored XSS in a WordPress widget plugin — real, but nowhere near the top of your queue."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Acquire a Contributor-or-higher account

The attacker needs edit_posts capability, which maps to Contributor on default WordPress. They either register on a site that allows open registration with elevated default role, compromise a low-privileged editorial account via credential stuffing, or already hold a legitimate account on a multi-author site.
Conditions required:
  • Site permits Contributor+ account creation OR attacker has stolen creds
  • JetWidgets For Elementor ≤ 1.0.21 installed and active
Where this breaks in practice:
  • Most production WP sites do not grant Contributor by default registration
  • MFA plugins (Wordfence Login Security, miniOrange) block cred-stuffing
Detection/coverage: Wordfence and Patchstack flag anomalous new-user creation; SIEM sees wp-login.php brute activity
STEP 02

Craft malicious widget payload

Attacker edits or creates a post/page using an affected JetWidgets element (e.g. jet-animated-box, jet-price-list, etc.) and injects JavaScript into an unsanitized attribute — commonly a URL, onerror, or freeform text field. Tools: browser + Elementor UI, or direct REST API calls to /wp-json/wp/v2/posts with the shortcode body embedded.
Conditions required:
  • Elementor active
  • Contributor can save/preview drafts with the vulnerable widget
Where this breaks in practice:
  • Some deployments restrict Contributors from using Elementor entirely
  • WAF rules (Wordfence, Sucuri, Cloudflare OWASP) flag <script> in post bodies
Detection/coverage: Patchstack and Wordfence virtual patches for CVE-2026-11380 will match once published
STEP 03

Trigger execution against a privileged viewer

The payload sits in the draft (or a public page, if publication is allowed). When an Editor or Administrator opens the post for review — or when any site visitor loads a published page — the stored JavaScript executes in their browser under the site's origin.
Conditions required:
  • Editor/Admin previews the malicious content, OR post reaches public URL
Where this breaks in practice:
  • Draft-only workflows mean payload only fires on internal reviewer, not public users
  • Strict CSP (script-src 'self') blocks inline JS — but few WP sites deploy one
Detection/coverage: Browser CSP reports; DOM-based XSS scanners in CI
STEP 04

Escalate via admin session

Once JS runs in an admin's authenticated session, the attacker uses fetch() to call wp-admin/admin-ajax.php or the REST API to create a new admin user, install a backdoored plugin, or exfiltrate the session cookie. Common weaponization: wpxf XSS-to-RCE modules, or hand-rolled fetch chains.
Conditions required:
  • Victim is Administrator with create_users / install_plugins capability
  • No SameSite=strict on WP auth cookie (default is Lax)
Where this breaks in practice:
  • Nonce checks limit some AJAX actions but nonces are readable from the admin DOM
  • Reputable admins rarely preview untrusted contributor drafts without inspection
Detection/coverage: Wordfence alerts on new-admin creation and plugin installs from unusual sessions
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed as of 2026-07-02. No campaigns tracked by Patchstack or Wordfence.
Public PoCNo public PoC repo yet. Wordfence Threat Intel entry describes the sink but withholds a working payload until patch uptake improves.
EPSSNot yet scored (disclosed 2026-07-01). Expect low single-digit percentile — consistent with authenticated WP plugin XSS class.
KEV statusNot listed. CISA KEV does not include authenticated Contributor XSS bugs without active exploitation.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N — network-reachable, low complexity, low privileges, no user interaction, scope-changed to visitor browser, limited C/I impact.
Affected versionsJetWidgets For Elementor ≤ 1.0.21
Fixed version1.0.22 (per Crocoblock changelog on WordPress.org)
Exposure populationJetWidgets For Elementor reports ~100,000+ active installs per WordPress.org. Only sites allowing Contributor+ accounts to reach the widget editor are actually reachable.
Disclosure2026-07-01, credited via Wordfence Bug Bounty / Patchstack coordinated disclosure to Crocoblock.
ReporterIndependent researcher via Wordfence / Patchstack (name embargoed pending advisory publication).
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to MEDIUM (5.8/10)

The single most decisive factor is the Contributor-level authentication requirement combined with limited blast radius — the payload runs in a visitor's browser, not on the server, and cannot pivot to fleet-scale compromise. This is a WordPress presentation plugin, not an identity, hypervisor, or edge component, so no role-multiplier floor applies.

HIGH vulnerability class and impact model
HIGH affected/fixed version accuracy
MEDIUM installed-base exposure — depends on per-site registration policy

Why this verdict

  • Auth barrier holds: Contributor is not open-registration on the majority of production WordPress sites; the attacker must already have editorial access or a stolen credential.
  • Blast radius is per-site, not fleet: stored XSS in a page-builder widget compromises one WordPress site's admin session at worst — no lateral movement, no supply-chain pivot, no cross-tenant impact.
  • Role multiplier: N/A — JetWidgets is a presentation-layer Elementor add-on. It is not on the identity/hypervisor/backup/edge/CI catalog. There is no plausible deployment where the same bug ends in domain takeover or fleet compromise, so the role-floor rule does not raise the verdict.
  • No KEV, no PoC, no campaigns — EPSS will land low; opportunistic mass exploitation is unlikely because the auth gate defeats spray-and-pray.
  • Real-world friction: WAFs (Wordfence, Sucuri, Cloudflare) already block naive <script> injection in POST bodies; reasonable admin hygiene (don't preview untrusted drafts in a session with install_plugins) further shrinks the window.

Why not higher?

It's not HIGH because a Contributor account is a real gate on most production sites, the impact is scoped to one site's admin session, and there is no path to server-side code execution without a second bug. HIGH would require either unauthenticated reachability or a role-multiplier deployment — neither applies to an Elementor widget pack.

Why not lower?

It's not LOW because stored XSS in a widely-installed plugin (~100k installs) that specifically targets editorial staff — the people with install_plugins — is a credible path to full site takeover on multi-author blogs, membership sites, and agency-hosted WordPress. The vendor's 6.4 MEDIUM captures that correctly.

05 · Compensating Control

What to do — in priority order.

  1. Update JetWidgets For Elementor to 1.0.22 or later — Vendor patch is the clean fix. For MEDIUM verdicts there is no noisgate mitigation SLA — schedule this into your standard WordPress plugin update window and complete within the noisgate remediation SLA of 365 days. If you run managed hosting with auto-updates enabled, verify it lands within the next cycle.
  2. Audit and restrict Contributor+ role assignment — Confirm that open registration does not grant Contributor, Author, or Editor by default. Set default_role to subscriber in wp_options. Review existing Contributor accounts for staleness. This shrinks the reachable population for every authenticated WP plugin bug, not just this one.
  3. Deploy or tune a WordPress WAF virtual patch — Wordfence, Patchstack, and Sucuri will publish rule signatures for CVE-2026-11380 within days. Enable the rule feed and ensure it applies to /wp-admin/admin-ajax.php and REST endpoints. Buys coverage until the plugin update ships across your estate.
  4. Enforce a Content-Security-Policy on the WP frontend and admin — A CSP with script-src 'self' 'nonce-…' neutralizes inline stored XSS payloads even when the sink exists. Use a plugin like WP Content Security Policy or edge headers at Cloudflare. This is a structural defense against the entire class.
  5. Instruct editors/admins not to preview untrusted contributor drafts in a privileged session — Use a separate browser profile or an incognito window without WP auth cookies to review submissions. Removes step 4 of the attack path entirely.
What doesn't work
  • MFA on wp-login.php — helpful for keeping the attacker out, but does nothing once a legitimate Contributor account is the attacker.
  • Disabling XML-RPC — this bug is REST/admin-UI reachable; XML-RPC is not the sink.
  • HTTPS / HSTS — transport encryption doesn't stop server-stored script from executing in a legitimately-loaded page.
  • HttpOnly cookies alone — the payload runs in the admin's DOM and can call authenticated endpoints via fetch() without ever reading the cookie.
06 · Verification

Crowdsourced verification payload.

Run this on any Linux host with SSH access to your WordPress webroot(s), or wrap it in your config-management inventory to sweep the fleet. Invoke as ./check-cve-2026-11380.sh /var/www/html where the argument is the WordPress install root. No elevated privileges required beyond read access to wp-content/plugins/.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate verification: CVE-2026-11380 — JetWidgets For Elementor stored XSS
# Usage: ./check-cve-2026-11380.sh /path/to/wordpress
set -u

WP_ROOT="${1:-/var/www/html}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/jet-widgets-for-elementor"
FIXED_VERSION="1.0.22"

if [ ! -d "$WP_ROOT/wp-content/plugins" ]; then
  echo "UNKNOWN: $WP_ROOT does not look like a WordPress install"
  exit 2
fi

if [ ! -d "$PLUGIN_DIR" ]; then
  # Try alternate slug (some Crocoblock releases used jet-widgets)
  PLUGIN_DIR="$WP_ROOT/wp-content/plugins/jet-widgets"
fi

if [ ! -d "$PLUGIN_DIR" ]; then
  echo "PATCHED: JetWidgets For Elementor not installed at $WP_ROOT"
  exit 0
fi

# Extract version from the plugin header
HEADER_FILE=$(grep -rlE '^[[:space:]]*Plugin Name:.*Jet[[:space:]]*Widgets' "$PLUGIN_DIR" 2>/dev/null | head -n1)
if [ -z "$HEADER_FILE" ]; then
  echo "UNKNOWN: could not locate plugin header in $PLUGIN_DIR"
  exit 2
fi

INSTALLED=$(grep -iE '^[[:space:]]*\*?[[:space:]]*Version:' "$HEADER_FILE" | head -n1 | sed -E 's/.*Version:[[:space:]]*([0-9.]+).*/\1/')
if [ -z "$INSTALLED" ]; then
  echo "UNKNOWN: could not parse plugin version"
  exit 2
fi

# Semver compare: return 0 if $1 < $2
ver_lt() { [ "$1" = "$2" ] && return 1; [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]; }

if ver_lt "$INSTALLED" "$FIXED_VERSION"; then
  echo "VULNERABLE: JetWidgets For Elementor $INSTALLED at $PLUGIN_DIR (fixed in $FIXED_VERSION)"
  exit 1
else
  echo "PATCHED: JetWidgets For Elementor $INSTALLED at $PLUGIN_DIR (>= $FIXED_VERSION)"
  exit 0
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a legitimate MEDIUM — not urgent, not ignorable. Because the verdict is MEDIUM, there is no noisgate mitigation SLA — you go straight to the noisgate remediation SLA of 365 days to update JetWidgets For Elementor to 1.0.22 across your estate. Monday morning: inventory your WordPress fleet for the plugin (use the verification script), enable Wordfence/Patchstack virtual patching now as a zero-cost interim control, confirm your default_role is subscriber, and push the plugin update through your normal WordPress maintenance window over the next quarter. Do not let this jump the queue over any KEV or unauthenticated-RCE items on your board.

Sources

  1. Wordfence Threat Intelligence — CVE-2026-11380
  2. Patchstack database — JetWidgets For Elementor
  3. WordPress.org plugin page — JetWidgets For Elementor
  4. Crocoblock changelog
  5. NVD — CVE-2026-11380
  6. CWE-79: Improper Neutralization of Input During Web Page Generation (XSS)
  7. OWASP — Stored XSS
  8. CISA KEV catalog
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.