This is more a booby-trapped note slipped under the admin's door than a skeleton key to the building
CVE-2025-22326 is a reflected XSS in the WordPress 5centscdn plugin. The original CNA/NVD text said affected versions were through 24.8.16, but the later mirrored CVE JSON and Wordfence record now point to through 25.4.15; either way, the live WordPress plugin page still exposes 25.4.15 and there is no official fixed version published. That matters more than the exact cutoff: if this plugin exists in your fleet, treat every currently deployed copy as suspect.
The vendor-style 7.1/HIGH score overstates real enterprise urgency. This is still *reflected* XSS with user interaction required, no known exploitation, very low EPSS, CISA ADP marking it non-automatable with partial impact, and a tiny apparent exposure population (10+ active installs on WordPress.org). If an attacker can land the lure on the right WordPress operator, impact can be real, but at 10,000-host scale this is not the fire to run toward first.
4 steps from start to impact.
Find a site running the plugin
5centscdn, typically through passive fingerprinting, exposed plugin paths, or admin-link discovery. This is usually done with basic recon tooling, browser inspection, or WordPress enumeration rather than exotic exploit frameworks.- Target site is internet-reachable
- The
5centscdnplugin is installed and reachable through a reflected input sink
- The plugin has only
10+active installs on WordPress.org, so the reachable population is tiny - WordPress plugins are often not reliably fingerprintable from outside
- Many enterprises do not expose WordPress admin paths broadly
Build a malicious reflected-XSS URL with Burp Suite or manual tampering
- A vulnerable parameter or route is reachable
- The payload survives application and server normalization
- Reflected XSS is brittle; payloads often break on encoding, nonce checks, or plugin-specific routing
- If the sink is in an admin view, the attack implicitly requires a logged-in privileged user
Land the link on the right user
- A user clicks the link
- The user is using a browser session that can reach the vulnerable page
- If the vulnerable sink is admin-side, the victim is authenticated to WordPress
- This is user-interaction-required and therefore not wormable
- Security awareness, mail filtering, browser isolation, and plain user skepticism cut the hit rate hard
- If the admin is not logged in when they click, the exploit chain may die
Execute browser-side actions with BeEF-style JS or custom script
- The payload executes in the target origin
- The victim session has enough privileges to matter
- HttpOnly cookies, CSP, nonce scoping, and short-lived sessions reduce what the script can do
- Impact depends heavily on victim role; a low-privilege victim may yield almost nothing
- No evidence this CVE is being used in active campaigns
The supporting signals.
| In-the-wild status | No confirmed active exploitation found in the sources reviewed. CISA ADP enrichment mirrored by OpenCVE marks Exploitation: none and Automatable: no. |
|---|---|
| Proof-of-concept availability | No widely circulated public PoC turned up in primary/public searches. This is also the kind of bug that is trivial to reproduce once the vulnerable parameter is known, so lack of PoC is only mild friction. |
| EPSS | User-provided EPSS is 0.00328 — low enough that this does not look like a likely near-term mass-exploitation candidate. |
| KEV status | Not KEV-listed. CISA's weekly bulletin included the CVE on 2025-01-13, but that is a publication roundup, not exploitation evidence. |
| CVSS vector meaning | AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L means remote and unauthenticated on paper, but the decisive limiter is UI:R: the attacker still needs a victim click, and often a privileged WordPress session to make impact matter. |
| Affected versions | There is source drift: NVD/CISA bulletin text says through 24.8.16, while later mirrored CVE JSON and Wordfence say through 25.4.15. Treat all deployed versions up to 25.4.15 as vulnerable or at least untrustworthy. |
| Fixed version | No official fix available in Patchstack/Wordfence, and the WordPress plugin page still shows 25.4.15 as the latest listed release. |
| Exposure population | WordPress.org shows only 10+ active installations for the plugin. BuiltWith shows 230 websites using 5centsCDN technology broadly, but that is CDN usage, not proof of this plugin being installed. |
| Disclosure timeline | Patchstack published on 2025-01-03; NVD published on 2025-01-07. The reporting credit goes to João Pedro S Alcântara (Kinorth). |
noisgate verdict.
The single biggest reason this drops to LOW is that it is a reflected, user-interaction-required XSS in a plugin with a very small apparent deployment base. That combination kills scale: attackers need the plugin, the right route, the right victim, and a successful lure before they get any meaningful blast radius.
Why this verdict
- User interaction is the choke point: reflected XSS only matters if a victim follows the attacker-crafted link, which sharply lowers real-world exploit volume compared with server-side bugs.
- Likely privileged-victim dependency: in WordPress plugin XSS, the useful target is usually an authenticated admin/operator session, which implies social engineering plus timing, not drive-by mass exploitation.
- Tiny reachable population: WordPress.org reports only
10+active installs, so even if the technical bug is real, the enterprise exposure pool is narrow. - No exploitation pressure: no KEV listing, no confirmed campaigns, and a very low EPSS all push downward from the vendor's 7.1 baseline.
- Non-automatable per CISA ADP enrichment: that matters operationally because non-automatable reflected XSS does not scale like scanner-friendly RCE or auth bypass.
Why not higher?
There is no evidence of active exploitation, no known public campaign, and no mass-reachable unauthenticated server-side execution path. The exploit chain depends on a lure and likely a privileged browser session, which makes this a poor candidate for broad opportunistic abuse across enterprise fleets.
Why not lower?
It still should not be ignored if you have the plugin installed, because a successful XSS against a WordPress administrator can turn into site-level abuse, content injection, or malicious configuration changes. The lack of an official fix also means this is not a paperwork-only issue; if the plugin exists, you need an explicit risk decision.
What to do — in priority order.
- Remove or disable the plugin where unused — Because no official fix is available, elimination is the cleanest control. For a LOW verdict there is no SLA (treat as backlog hygiene), but if you find the plugin on production internet-facing sites, remove it in the next normal CMS change window rather than waiting for an upstream patch that may never land.
- Restrict WordPress admin access — Limit
/wp-adminand related admin routes to trusted source IPs, VPN, or identity-aware access where practical. This does not cure the bug, but it reduces the chance that a crafted link can reach a logged-in privileged victim; for LOW, fold this into normal hardening backlog. - Deploy virtual patching or WAF filtering — If you run Patchstack, Wordfence, or a tuned WAF in front of WordPress, use it to block suspicious reflected payloads and high-risk query patterns. This is especially useful when the vendor has no fixed version; for LOW, deploy as backlog hygiene unless the site is especially sensitive.
- Harden admin browsers — Use secure web gateways, URL rewriting, browser isolation for high-risk admins, and keep WordPress operators out of day-to-day browsing while authenticated. This attacks the actual exploit path — the click and the browser session — rather than treating the CVSS number as destiny.
- Watch for anomalous admin actions — Review WordPress logs for sudden plugin/theme changes, unexpected content edits, new admin users, or cache/CDN configuration changes originating from legitimate admin accounts. This is your best chance to spot successful browser-side abuse after the fact.
MFAon the WordPress login does not stop an already-authenticated admin browser from executing injected JavaScript after the click.- Updating WordPress core alone does not fix a vulnerable plugin sink.
- A generic external vulnerability scan may miss this entirely because plugin identification and reflected-XSS route discovery are often incomplete.
- Waiting for a vendor patch is not a strategy here because no official fixed version is published.
Crowdsourced verification payload.
Run this on the target WordPress host or from a config-management shell with filesystem access to the WordPress install. Invoke it as bash check-cve-2025-22326.sh /var/www/html and use an account that can read wp-content/plugins; root is not required if the plugin files are readable.
#!/usr/bin/env bash
# check-cve-2025-22326.sh
# Detect likely exposure to CVE-2025-22326 in the WordPress 5centsCDN plugin.
# Usage: bash check-cve-2025-22326.sh /path/to/wordpress
# Exit codes:
# 0 = PATCHED (plugin absent / not affected)
# 1 = VULNERABLE
# 2 = UNKNOWN
set -u
WP_ROOT="${1:-}"
PLUGIN_DIR=""
MAIN_PHP=""
README=""
VERSION=""
if [[ -z "$WP_ROOT" ]]; then
echo "UNKNOWN - missing WordPress root path argument"
exit 2
fi
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/5centscdn"
README="$PLUGIN_DIR/readme.txt"
if [[ ! -d "$PLUGIN_DIR" ]]; then
echo "PATCHED - plugin directory not present"
exit 0
fi
# Try common plugin entry file names first.
for f in "$PLUGIN_DIR/5centscdn.php" "$PLUGIN_DIR/index.php"; do
if [[ -f "$f" ]]; then
MAIN_PHP="$f"
break
fi
done
# Fallback: first PHP file in the plugin root.
if [[ -z "$MAIN_PHP" ]]; then
MAIN_PHP=$(find "$PLUGIN_DIR" -maxdepth 1 -type f -name '*.php' | head -n 1)
fi
# Extract version from plugin header or readme stable tag/changelog.
if [[ -n "$MAIN_PHP" && -f "$MAIN_PHP" ]]; then
VERSION=$(grep -iE '^\s*Version:\s*' "$MAIN_PHP" | head -n 1 | sed -E 's/^\s*Version:\s*//I' | tr -d '\r')
fi
if [[ -z "$VERSION" && -f "$README" ]]; then
VERSION=$(grep -iE '^\s*Stable tag:\s*' "$README" | head -n 1 | sed -E 's/^\s*Stable tag:\s*//I' | tr -d '\r')
fi
if [[ -z "$VERSION" && -f "$README" ]]; then
VERSION=$(grep -E '^=\s*[0-9]+\.[0-9]+\.[0-9]+\s*=$' "$README" | head -n 1 | sed -E 's/^=\s*([^ ]+)\s*=$/\1/' | tr -d '\r')
fi
if [[ -z "$VERSION" ]]; then
echo "UNKNOWN - plugin present but version could not be determined"
exit 2
fi
# Version comparison helper using sort -V.
version_le() {
local a="$1"
local b="$2"
[[ "$(printf '%s\n%s\n' "$a" "$b" | sort -V | head -n 1)" == "$a" ]]
}
# Public sources disagree on cutoff (24.8.16 vs 25.4.15). Use the broader, later public record.
# There is no official fixed version, so >25.4.15 is UNKNOWN rather than PATCHED.
if version_le "$VERSION" "25.4.15"; then
echo "VULNERABLE - detected 5centsCDN version $VERSION (public records indicate <= 25.4.15 is affected; no official fix published)"
exit 1
fi
echo "UNKNOWN - detected 5centsCDN version $VERSION, but no authoritative fixed version is published"
exit 2
If you remember one thing.
wp-content/plugins/5centscdn and make an explicit keep/remove decision. For a LOW noisgate rating there is no noisgate mitigation SLA — treat as backlog hygiene and go straight to removal, disablement, or documented acceptance in the next normal change window; there is likewise noisgate remediation SLA beyond backlog hygiene because there is no published vendor fix to target. If the plugin is absent, close the ticket; if it is present on a production internet-facing site, do not let it sit unowned waiting for a patch that may not come.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.