A logged-in shopper can scribble JavaScript on a niche e-commerce plugin's form, and the vendor called it medium
CVE-2026-57329 is a stored/reflected Cross-Site Scripting flaw (CWE-79) in the WooCommerce Designer Pro plugin, affecting all versions ≤ 1.9.34. An attacker who already holds a Subscriber-level account on the target WordPress site can inject script payloads via plugin-controlled input that doesn't sanitize before rendering. The CVSS vector (AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L) tells the whole story: network reachable, but requires *low privilege* auth, *user interaction*, and only yields *low* impact across the triad — with a scope change because the script runs in another user's browser session.
Vendor severity of MEDIUM (6.5) is generous. This is a Subscriber-authenticated XSS in a paid third-party WooCommerce add-on with a small installed base — *not* the core WooCommerce platform, not unauthenticated, not in a Critical path. The realistic worst case is hijacking a shop admin who happens to view the attacker's payload. For most operators of 10,000 hosts this is a hygiene patch, not a fire drill.
4 steps from start to impact.
Acquire Subscriber account on target site
PR:L. The attacker registers as a normal shop customer (most WooCommerce stores allow self-service registration) or compromises an existing low-privilege account. No admin, no editor — just a subscriber-level cookie. Tooling here is trivial: curl, Burp Suite, or just a browser.- Target site runs WooCommerce Designer Pro ≤ 1.9.34
- Customer self-registration is enabled (default for WooCommerce shops)
- Sites that disable customer self-registration force the attacker to compromise an existing credential first
- Plugin is a paid commercial add-on with a far smaller install base than core WooCommerce
Inject XSS payload into vulnerable plugin field
<svg onload=…>, <img src=x onerror=…>) wrapped in BeEF or a custom JS stager. The payload is stored server-side, ready to render in another user's browser.- Identified injectable field within Designer Pro flow
- No edge WAF doing payload filtering (Cloudflare/Sucuri/Wordfence rules)
- Modern managed WordPress hosts (WP Engine, Kinsta) ship generic XSS WAF rules that catch naive payloads
- CSP headers — if set — block inline script execution
Lure a higher-privileged user to view the payload
UI:R is mandatory. The attacker needs a shop admin, store manager, or other elevated user to navigate to the page that renders the stored payload — usually the order-review or design-management screen inside wp-admin. Tooling: BeEF hook, custom JS to exfiltrate wp_session_tokens or chain into REST-API calls as the viewer.- Victim user has access to the admin view that renders attacker-controlled content
- Victim is authenticated and clicks through to the affected page
- Admins on busy stores may not review individual subscriber-submitted designs within the patch window
- WordPress core has SameSite cookie defaults and nonce checks that limit blind CSRF chaining
Execute in admin's browser, attempt session takeover
fetch() to call wp-admin/admin-ajax.php and wp-json/wp/v2/users to create a new administrator account, exfiltrate the auth cookie, or pivot to a plugin-install endpoint for code execution. Scope change (S:C) is reflected here — impact crosses from the subscriber session boundary into the admin's.- WP nonces obtainable from admin DOM (usually true)
- Admin user has
manage_optionsorinstall_pluginscapability
- Two-factor auth on admin actions (rare but increasing) blocks silent account creation
- File-edit-disabled hardening (
DISALLOW_FILE_MODS) breaks the pivot-to-RCE step
The supporting signals.
| In-the-wild exploitation | None observed. No campaign attribution; not on CISA KEV; no GreyNoise tagged traffic. |
|---|---|
| Public PoC | No public PoC repository at time of writing. Patchstack typically withholds payload details for ≥30 days post-disclosure. |
| EPSS | Expected <0.5% — typical for authenticated XSS in low-install-base WordPress plugins. |
| KEV status | Not listed. Unlikely to be added — XSS rarely meets CISA's RCE/active-exploitation bar. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L → 6.5. Note: PR:L + UI:R are the load-bearing constraints; remove either and severity stays MEDIUM. |
| Affected versions | WooCommerce Designer Pro ≤ 1.9.34. |
| Fixed version | Verify with vendor advisory — 1.9.35 or later expected. No distro backports (commercial WP plugin). |
| Exposure population | Designer Pro is a paid CodeCanyon-style add-on; installed base estimated in the low tens of thousands of sites globally — *far* below core WooCommerce's ~6M install footprint. |
| Disclosure date | 2026-06-29 via Patchstack coordinated disclosure program. |
| Reporter | Independent researcher via Patchstack mVDP — confirm specific credit on the Patchstack database entry. |
noisgate verdict.
Downgraded one bucket because the single most decisive factor is the compounding friction of PR:L + UI:R + S:C on a small-install-base commercial plugin — the attacker needs an account, needs a privileged victim to click, and the bug lives in an add-on that no high-value-role deployment depends on. Blast radius is bounded to a single shop's admin session, with no role-multiplier path to identity, hypervisor, or supply chain.
Why this verdict
- Authentication required (
PR:L): the attacker must hold a subscriber account. Self-registration is common on shops, but this still gates the population of viable targets and provides forensic attribution. - User interaction required (
UI:R): a higher-privileged victim must navigate to the affected page. Stored XSS in admin contexts is real, but the time-to-impact is bounded by admin workflow cadence. - Narrow installed base: Designer Pro is a niche commercial WooCommerce add-on. Per-site impact is bounded; there is no aggregate fleet exposure comparable to core WooCommerce or Elementor.
- Role multiplier — workstation/LOB shop role: chain succeeds; outcome is *single-shop admin hijack* → site defacement / customer-data scrape. Local-to-tenant blast radius only.
- Role multiplier — high-value role: N/A. Designer Pro does not run on domain controllers, hypervisors, IdPs, PAM, backup admin servers, or CI/CD. There is no canonical high-value-role deployment, so the CRITICAL/HIGH role floor does not apply.
- No KEV, no public PoC, no active exploitation: zero upgrade pressure from threat-intel signals.
Why not higher?
MEDIUM would be defensible if Designer Pro were widely deployed core software or if the bug were unauthenticated. Neither is true — PR:L plus a small installed base plus no exploitation evidence plus no role-multiplier path keeps this below the MEDIUM threshold for an enterprise patch backlog.
Why not lower?
IGNORE would be wrong: it *is* a real XSS with stored impact on the admin session, and S:C confirms scope crosses the privilege boundary. Some shops do allow open subscriber registration, making opportunistic exploitation feasible. LOW correctly reflects that this is real but non-urgent.
What to do — in priority order.
- Deactivate WooCommerce Designer Pro on any site not actively using it — Most stores install it during a campaign and forget — deactivating eliminates the attack surface entirely. No mitigation SLA at LOW; treat as opportunistic hardening alongside the next maintenance window.
- Enforce a WAF rule blocking known XSS payload signatures on plugin endpoints — Cloudflare / Wordfence / Sucuri all ship generic stored-XSS rule packs. Push the ruleset to block
<script>,onerror=,onload=, andjavascript:in Designer Pro submission paths. - Require 2FA for all administrator and shop-manager accounts — Even if the XSS fires in an admin browser, 2FA on high-impact actions (plugin install, user creation) limits the pivot path. Use WP 2FA or Wordfence Login Security.
- Set a restrictive Content-Security-Policy header on /wp-admin/ — Block inline-script execution and restrict
script-srcto first-party. Designer Pro's payload becomes inert even if injected. Roll out behind report-only mode first to catch breakage. - Audit existing subscriber-submitted content for stored payloads — Use
wp db searchor a SQL query against postmeta/options tables for<script,onerror=,onload=,<svg/onload. If the plugin shipped vulnerable for months, payloads may already be staged.
- Disabling customer self-registration alone — attackers can buy compromised WooCommerce credentials on dark-web markets for under $5; this slows but does not stop the chain.
- Network-edge IPS signatures — XSS payloads in legitimate POST bodies look indistinguishable from product customization data; rule false-positive rates are unacceptable on shop traffic.
- Database-level WAFs — the input is sanitized (or not) at the PHP layer; DB-tier controls cannot inspect serialized HTML payloads in postmeta.
Crowdsourced verification payload.
Run this on each WordPress host as root or the www-data user with read access to the WordPress install. Invoke with the document root as the argument: ./check_cve_2026_57329.sh /var/www/html. Exits 1 = VULNERABLE, 0 = PATCHED, 2 = UNKNOWN (plugin not installed or version unreadable).
#!/usr/bin/env bash
# CVE-2026-57329 — WooCommerce Designer Pro XSS (<= 1.9.34)
# Usage: ./check_cve_2026_57329.sh /path/to/wordpress
set -u
WP_ROOT="${1:-/var/www/html}"
PLUGIN_DIR="${WP_ROOT}/wp-content/plugins/woocommerce-designer-pro"
FIXED_VERSION="1.9.35"
if [[ ! -d "${WP_ROOT}" ]]; then
echo "UNKNOWN: WordPress root ${WP_ROOT} not found"
exit 2
fi
if [[ ! -d "${PLUGIN_DIR}" ]]; then
echo "PATCHED: WooCommerce Designer Pro not installed at ${PLUGIN_DIR}"
exit 0
fi
# Locate the plugin's main PHP header file (any *.php at top level with 'Version:' header)
MAIN_FILE=$(grep -lE '^[[:space:]]*\*?[[:space:]]*Version:' "${PLUGIN_DIR}"/*.php 2>/dev/null | head -n1)
if [[ -z "${MAIN_FILE}" ]]; then
echo "UNKNOWN: cannot locate plugin header file in ${PLUGIN_DIR}"
exit 2
fi
INSTALLED_VERSION=$(grep -iE '^[[:space:]]*\*?[[:space:]]*Version:' "${MAIN_FILE}" | head -n1 | sed -E 's/.*Version:[[:space:]]*([0-9][0-9A-Za-z.\-]*)\b.*/\1/I')
if [[ -z "${INSTALLED_VERSION}" ]]; then
echo "UNKNOWN: could not parse version from ${MAIN_FILE}"
exit 2
fi
# Semantic version compare — installed < fixed ?
ver_lt() {
[[ "$1" == "$2" ]] && return 1
local IFS=.
local a=($1) b=($2)
local len=$(( ${#a[@]} > ${#b[@]} ? ${#a[@]} : ${#b[@]} ))
for ((i=0; i<len; i++)); do
local x=${a[i]:-0} y=${b[i]:-0}
# strip non-numeric trailers
x=${x%%[!0-9]*}
y=${y%%[!0-9]*}
x=${x:-0}; y=${y:-0}
if (( 10#$x < 10#$y )); then return 0; fi
if (( 10#$x > 10#$y )); then return 1; fi
done
return 1
}
if ver_lt "${INSTALLED_VERSION}" "${FIXED_VERSION}"; then
echo "VULNERABLE: WooCommerce Designer Pro ${INSTALLED_VERSION} <= 1.9.34 (CVE-2026-57329). Upgrade to >= ${FIXED_VERSION}."
exit 1
fi
echo "PATCHED: WooCommerce Designer Pro ${INSTALLED_VERSION} >= ${FIXED_VERSION}"
exit 0
If you remember one thing.
Sources
- Patchstack vulnerability database
- WPScan WordPress plugin vulnerability index
- WooCommerce official security advisories
- WooCommerce GitHub Security Advisories
- MITRE CWE-79: Improper Neutralization of Input During Web Page Generation
- FIRST EPSS scoring
- CISA Known Exploited Vulnerabilities Catalog
- CVE Details — WooCommerce vendor page
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.