This is a bad backstage pass, not someone kicking in the front door
CVE-2025-22293 is a stored/DOM-style XSS issue in the WordPress gutentor plugin. Current public tracking converges on affected versions <= 3.4.3, with 3.4.4 listed as the fix; earlier CVE metadata originally said <= 3.4.0, then NVD shows that record was later updated to <= 3.4.3. Exploitation requires an authenticated WordPress user at Contributor+ level to place attacker-controlled content into Gutentor-managed page elements so script runs when another user views the injected page.
The vendor/CNA-style 6.5 MEDIUM score is defensible in a vacuum, but it overstates enterprise urgency. The decisive friction is attacker position: this is not unauthenticated internet exploitation, it is post-login abuse of a specific WordPress role on a specific plugin, with no KEV entry, very low EPSS, and no strong evidence of active campaigns. For most enterprises, the reachable population is the subset of sites that both run Gutentor and allow low-privilege content authors.
4 steps from start to impact.
Get a Contributor foothold
- Target site runs WordPress with the Gutentor plugin installed
- Attacker has authenticated access as Contributor or higher
- The relevant editor/plugin features are available to that role
- Many enterprise WordPress sites have no Contributor accounts at all
- SSO, MFA, and closed registration sharply reduce reachable population
- Contributor abuse usually implies an earlier identity-control failure or insider access
Inject script through a Gutentor block
Burp Suite, the attacker submits crafted content that the plugin fails to sanitize or safely escape. Public descriptions disagree on UI:R versus UI:N, but both agree the core problem is authenticated content injection into a stored page context. The weapon is not exotic: it is ordinary editor access plus a short payload.- A vulnerable Gutentor version
<= 3.4.3is installed - The attacker can create or edit content that uses affected Gutentor functionality
- Input reaches the vulnerable rendering path
- Not every site uses the affected widget/path in normal workflows
- Some editorial review processes block unpublished or unapproved content
- WAFs are inconsistent at stopping stored XSS embedded in authenticated CMS traffic
Wait for a higher-value viewer
fetch()-based exfil are enough.- A victim user visits the infected page
- The victim browser executes inline or referenced attacker script
- The payload can reach useful tokens or privileged workflows
- If only anonymous visitors view the page, impact may be limited to defacement or client-side abuse
- Hardened cookie settings, CSP, and admin separation reduce post-XSS leverage
- Unpublished drafts or low-traffic pages may never get a privileged viewer
Pivot to site-level abuse
- An admin/editor context is successfully reached
- WordPress nonces or privileged actions are accessible from the browser context
- The site lacks secondary controls such as strict CSP or approval gates
- Cross-site scripting does not automatically become server RCE
- Separate admin hosts, short session lifetime, and least-privilege roles can contain impact
- Many enterprises can reimage or restore a marketing site quickly if abuse is confined there
The supporting signals.
| In-the-wild status | No reviewed source showed active exploitation for this CVE, and it is not present in CISA KEV. |
|---|---|
| Proof-of-concept availability | No public weaponized GitHub PoC was surfaced in reviewed sources. That said, exploit development is low-complexity for anyone with a test site and a proxy like Burp Suite because the primitive is authenticated content injection. |
| EPSS | User-supplied EPSS is 0.00152, which is very low and consistent with niche, low-priority exploitation. |
| KEV status | Not KEV-listed as checked against the CISA Known Exploited Vulnerabilities Catalog. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L from the CNA/NVD record implies network reachability but requires authenticated low privilege and user interaction, which is exactly why the raw score overstates broad enterprise urgency. |
| Affected versions | Current public consensus is Gutentor <= 3.4.3 affected. Note the CVE record originally said <= 3.4.0; NVD change history shows later expansion to <= 3.4.3. |
| Fixed version | 3.4.4 is the listed patched release. The WordPress plugin changelog for 3.4.4 on 2025-01-20 notes security fixes; distro backport guidance is not applicable here because this is a WordPress plugin, not an OS package. |
| Exposure population | WordPress.org shows 30,000+ active installations for Gutentor. That is meaningful plugin reach, but unlike an appliance CVE, external search engines cannot reliably fingerprint a site's Gutentor version from the internet. |
| Scanning / exposure data | Shodan/Censys/FOFA-style counting is weak here: they can find WordPress sites, but not reliably confirm the plugin or version without deeper application inspection. Treat the WordPress.org install count as the best public exposure proxy. |
| Disclosure / credit | Publicly disclosed on 2025-01-07; credited to João Pedro Soares de Alcântara (Kinorth) in Wordfence/Patchstack tracking. |
noisgate verdict.
The single most important downgrading factor is that exploitation requires authenticated Contributor+ access on a site that specifically uses the vulnerable plugin path. That makes this a post-auth content-abuse bug with a constrained blast radius, not a broad internet compromise opportunity.
Why this verdict
- Downgrade for attacker position: exploitation starts at authenticated
Contributor+, which already implies prior credential compromise, insider access, or open author registration. - Downgrade for exposure fraction: only organizations running WordPress, using Gutentor, and permitting low-privilege content authors are meaningfully exposed; that is a narrow slice of a 10,000-host enterprise.
- Downgrade for threat evidence: no KEV listing, very low EPSS, and no solid public evidence of active campaign use in reviewed sources.
Why not higher?
This is not unauthenticated RCE, not a perimeter bypass, and not a one-packet internet-wide wormable issue. The chain depends on a low-privilege CMS foothold plus a victim viewing the poisoned content, which compounds real-world friction fast.
Why not lower?
It is still a real stored XSS bug in a plugin with 30,000+ installs, and Contributor is not an especially rare role on publishing-heavy sites. If an attacker can land on a multi-author site, stored XSS can absolutely become admin-session theft or site takeover, so dismissing it as IGNORE would be sloppy.
What to do — in priority order.
- Inventory Gutentor immediately — Identify every WordPress instance running
gutentorand pull exact plugin versions. Because this is a LOW verdict, there is no mitigation SLA; do this in normal backlog hygiene and use it to separate<= 3.4.3from patched estates. - Clamp down Contributor access — Review who actually has Contributor/Author roles, disable public registration where unused, and remove dormant accounts. This directly attacks the exploit precondition and should be done as routine identity hygiene since there is no formal mitigation SLA for LOW findings.
- Enforce MFA and SSO for WordPress admins and authors — MFA will not fix the vulnerable code, but it materially reduces the easiest path to exploitation: stolen content-author credentials. Roll this out on vulnerable sites during the normal maintenance cycle.
- Add a restrictive CSP where practical — A sane Content Security Policy can reduce exploit reliability and token exfil paths for stored XSS, especially on admin and editor surfaces. Deploy as defense-in-depth in the same maintenance window if your theme/plugin stack tolerates it.
- Patch to 3.4.4 or later — Move vulnerable instances off
<= 3.4.3to the vendor-fixed release or newer. For a LOW verdict this is backlog hygiene, not an emergency, but it should still land on your standard plugin update cadence.
- Perimeter firewalls alone do not help, because the exploit rides over normal HTTPS after a legitimate WordPress login.
- Version-agnostic vulnerability scans often miss WordPress plugin issues; they can find the site but not reliably prove the Gutentor version.
- MFA by itself is not a complete answer; it reduces stolen-credential risk but does nothing against malicious insiders or already-authenticated contributors.
Crowdsourced verification payload.
Run this on the target WordPress host or inside the container/VM that serves the site. Invoke it as bash check_cve_2025_22293.sh /var/www/html and use an account with read access to the WordPress files; root is not required unless your web root is locked down.
#!/usr/bin/env bash
# check_cve_2025_22293.sh
# Detect whether the WordPress Gutentor plugin version is vulnerable to CVE-2025-22293.
# Usage: bash check_cve_2025_22293.sh /path/to/wordpress
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
WP_ROOT="${1:-}"
PLUGIN_DIR=""
VERSION=""
if [ -z "$WP_ROOT" ]; then
echo "UNKNOWN: missing WordPress root path"
exit 2
fi
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/gutentor"
if [ ! -d "$PLUGIN_DIR" ]; then
echo "UNKNOWN: Gutentor plugin directory not found at $PLUGIN_DIR"
exit 2
fi
extract_version() {
local file="$1"
if [ -f "$file" ]; then
awk -F': ' 'BEGIN{IGNORECASE=1} /^Version:/ {print $2; exit}' "$file" | tr -d '\r'
fi
}
# Try the main plugin file first, then readme.txt
for candidate in \
"$PLUGIN_DIR/gutentor.php" \
"$PLUGIN_DIR/readme.txt"; do
VERSION="$(extract_version "$candidate")"
if [ -n "$VERSION" ]; then
break
fi
done
if [ -z "$VERSION" ] && command -v wp >/dev/null 2>&1; then
VERSION="$(wp plugin get gutentor --field=version --path="$WP_ROOT" 2>/dev/null | tr -d '\r')"
fi
if [ -z "$VERSION" ]; then
echo "UNKNOWN: could not determine Gutentor version"
exit 2
fi
# Normalize version string to first token that looks like digits.digits
VERSION="$(echo "$VERSION" | sed -E 's/^([^0-9]*)([0-9]+(\.[0-9]+)+).*/\2/')"
if [ -z "$VERSION" ]; then
echo "UNKNOWN: parsed version is empty"
exit 2
fi
# version <= 3.4.3 is vulnerable; >= 3.4.4 is patched
if [ "$(printf '%s\n' "$VERSION" "3.4.3" | sort -V | head -n1)" = "$VERSION" ] && [ "$VERSION" != "3.4.4" ]; then
if [ "$VERSION" = "3.4.3" ] || [ "$(printf '%s\n' "$VERSION" "3.4.3" | sort -V | tail -n1)" = "3.4.3" ]; then
echo "VULNERABLE: Gutentor version $VERSION (<= 3.4.3)"
exit 1
fi
fi
if [ "$(printf '%s\n' "$VERSION" "3.4.4" | sort -V | head -n1)" = "3.4.4" ] || [ "$VERSION" = "3.4.4" ]; then
echo "PATCHED: Gutentor version $VERSION (>= 3.4.4)"
exit 0
fi
# Fallback logic
if [ "$(printf '%s\n' "$VERSION" "3.4.3" | sort -V | head -n1)" = "$VERSION" ]; then
echo "VULNERABLE: Gutentor version $VERSION (<= 3.4.3)"
exit 1
else
echo "PATCHED: Gutentor version $VERSION (> 3.4.3)"
exit 0
fi
If you remember one thing.
gutentor <= 3.4.3, then split them by whether they allow Contributor/Author accounts or public registration. For this LOW verdict there is no noisgate mitigation SLA and no noisgate remediation SLA — treat it as backlog hygiene, patch on the normal plugin maintenance cadence, and document any internet-facing multi-author sites you choose to accelerate because their attacker precondition is easier to satisfy than a locked-down corporate brochure site.Sources
- WordPress.org plugin page and changelog for Gutentor
- Wordfence vulnerability entry for CVE-2025-22293
- Patchstack advisory for CVE-2025-22293
- NVD entry and change history for CVE-2025-22293
- CISA Known Exploited Vulnerabilities Catalog
- OpenCVE record reflecting CNA metadata for CVE-2025-22293
- WordPress.org support discussion on CVE-2025-22293
- FIRST EPSS documentation
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.