← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2025-22315 · CWE-79 · Disclosed 2025-01-07

Improper Neutralization of Input During Web Page Generation

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is a booby-trapped draft in the newsroom, not a drive-by shot through the lobby

CVE-2025-22315 is a stored XSS in the WPDeveloper Typing Text WordPress plugin affecting all versions through 1.2.7. In practical terms, a user with Contributor-level access or higher can place a malicious payload into plugin-controlled content so that JavaScript runs later when someone else loads the affected page. Public sources show the plugin's latest listed version is still 1.2.7 and Wordfence still marks the issue unpatched, so there is no clean vendor-fixed target version to anchor on today.

The vendor-style 6.5/MEDIUM label is too generous for enterprise prioritization because the attack begins with authenticated low-privilege CMS access and ends only if a victim actually views the poisoned content. That means this is post-initial-access, narrow-population, and workflow-dependent. The danger is real on sites that let many semi-trusted users publish or submit content, but for most enterprise fleets this is not remotely wormable, not internet-sprayable, and not a Monday-morning fire drill.

"Real risk exists, but it starts after you already lost a contributor account."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Acquire a Contributor account with a browser or credential theft kit

The attacker first needs a valid WordPress account with Contributor or higher rights. That usually means stolen credentials, a compromised contractor account, SSO abuse, or an already-landed foothold rather than a fresh external exploit. Tooling is mundane here: a browser, Burp Suite, or any password-spray/credential-reuse workflow.
Conditions required:
  • WordPress site is reachable
  • Attacker has valid credentials
  • Account has Contributor+ privileges
Where this breaks in practice:
  • This is not unauthenticated remote; it presumes prior compromise or insider access
  • MFA/SSO and tighter role assignment cut off a large share of real deployments
  • Many enterprise WordPress estates do not grant Contributor broadly
Detection/coverage: Version scanners will not see this step; identity telemetry, SSO logs, and WordPress auth/audit logs are the right control plane.
STEP 02

Inject payload into Typing Text content using Burp Suite or the Gutenberg editor

With Contributor access, the attacker adds a Typing Text block or modifies content that the plugin renders without sufficient sanitization/output escaping. The weaponized input can be inserted directly through the editor UI or replayed via an intercepted POST request in Burp Suite.
Conditions required:
  • Plugin typing-text is installed
  • Version is <= 1.2.7
  • Contributor can create or edit content that uses the vulnerable block/plugin path
Where this breaks in practice:
  • The vulnerable plugin is niche, with roughly 600+ active installs in WordPress.org metadata
  • Some editorial workflows require review before publication
  • If the plugin is installed but not actually used in content creation, the reachable attack surface shrinks further
Detection/coverage: SCA/WP plugin version checks can flag exposure, but most scanners will not validate exploitability in the content workflow. WAFs are inconsistent against stored editor payloads.
STEP 03

Wait for a privileged user to view the poisoned page

The XSS only pays off if an Editor, Administrator, or another user with useful browser session context opens the affected page or preview. This is the main practical brake: user interaction is required, and not just any user interaction, but the right user in the right workflow.
Conditions required:
  • Injected content is saved and viewable
  • A victim browses the affected page or preview
  • Victim session has meaningful privileges
Where this breaks in practice:
  • No victim view means no exploit
  • Moderation queues and limited reviewer pools slow or prevent triggering
  • If only anonymous visitors see the page, impact is usually reputational/phishing rather than admin takeover
Detection/coverage: CSP reports, browser console telemetry, and web server logs around preview/admin review paths may help, but native WordPress detection is weak.
STEP 04

Use same-origin JavaScript to perform admin actions or steal action tokens

Once the script runs in a privileged browser context, the attacker can abuse the victim's authenticated session to make same-origin requests, read page data, or capture nonces and workflow secrets. In the worst case that can become plugin/theme changes, user creation, or other admin-side actions depending on what protections and browser controls are in place.
Conditions required:
  • Victim has elevated permissions
  • Browser executes injected JavaScript
  • Relevant admin actions are reachable from the victim context
Where this breaks in practice:
  • HttpOnly may block direct cookie theft, forcing the attacker into action-for-action abuse instead
  • Strong CSP, restricted admin plugins, and hardened browser settings can reduce blast radius
  • This compromises one site/tenant at a time, not the broader network
Detection/coverage: EDR has little visibility into in-browser same-origin abuse. WordPress audit plugins may show odd admin-side changes after the trigger.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo evidence of active exploitation found in the sources reviewed; not in CISA KEV.
PoC availabilityNo public PoC located in reviewed sources. Exploitation does not require special tooling beyond a browser or Burp Suite once a Contributor account exists.
EPSSUser-supplied EPSS is 0.00139. Third-party mirrors show it staying very low, which matches the narrow attack preconditions.
KEV statusNot KEV-listed as of the reviewed CISA sources; no federal urgency signal.
CVSS vector reality checkVendor/CNA vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L. The decisive terms are PR:L and UI:R: attacker already needs access, then still needs a victim view.
NVD enrichment deltaNVD later enriched the record to 5.4 MEDIUM with A:N, which is directionally closer to reality than the original 6.5 because availability impact from this bug is weak.
Affected versionsAll versions through 1.2.7 are listed as affected.
Fixed versionNo authoritative patched version found. WordPress.org still shows 1.2.7 as the listed version in reviewed metadata, and Wordfence marks the issue Unpatched.
Exposure populationWordPress.org metadata shows about 600+ active installations. That's a small exposure pool, and there is no reliable Shodan/Censys fingerprint for this specific block plugin, so internet-scale discoverability is limited.
Disclosure and researcherPublicly disclosed 2025-01-07; researcher attribution in Wordfence is SavPhill (Savphill).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (3.8/10)

The single biggest downgrade factor is that exploitation requires authenticated Contributor access, which means this starts after the attacker already has a foothold or a trusted user account. From there, the chain still depends on a privileged victim loading poisoned content, so the reachable population and trigger rate are both low in real enterprise operations.

HIGH Attack-path friction from `PR:L` + `UI:R`
MEDIUM Current patch status appears to be unpatched
MEDIUM Blast-radius estimate for typical enterprise WordPress deployments

Why this verdict

  • Starts post-compromise: PR:L is not a minor checkbox here; it means the attacker already has a WordPress account with content-authoring rights.
  • Needs the right victim: stored XSS only matters when an editor/admin actually views the page, preview, or moderation item.
  • Small exposure pool: the plugin shows roughly 600+ active installs, so even successful internet discovery does not translate into mass enterprise risk.

Why not higher?

This is not an unauthenticated edge-service bug, not a one-packet exploit, and not broadly automatable across enterprise fleets. The chain compounds multiple narrowing prerequisites: niche plugin presence, authenticated Contributor access, vulnerable content path usage, and a privileged victim view.

Why not lower?

It is still stored XSS in a CMS, and those bugs can become account compromise or admin-side action abuse once triggered. The fact that sources indicate no known patch also keeps it above IGNORE for teams that actually run this plugin.

05 · Compensating Control

What to do — in priority order.

  1. Remove the plugin where it is not business-critical — Because no authoritative patched version is visible in reviewed sources, removal is the cleanest control. For a LOW verdict there is no formal mitigation SLA; treat this as backlog hygiene and remove it in the next normal change cycle, prioritizing any internet-facing sites with many contributor accounts.
  2. Restrict Contributor and Author roles — This bug lives or dies on low-privileged content-authoring access. Reduce the number of accounts that can create or edit content, enforce MFA/SSO, and review dormant contributor accounts; for LOW, there is no formal mitigation SLA, so fold this into routine IAM cleanup.
  3. Require editorial review before publication — A moderation queue adds real friction by preventing attacker-controlled content from going live or reaching admins automatically. There is no formal mitigation SLA for LOW, but this is worthwhile on shared or contractor-managed WordPress estates during the next policy update window.
  4. Harden browser-side script execution for admin users — A tight CSP, isolated admin workstations, and browser hardening reduce what a stored XSS can do after trigger. There is no formal mitigation SLA for LOW; apply where your CMS administrators already use hardened profiles.
  5. Monitor WordPress admin actions after content edits — If the XSS lands, the visible follow-on is usually odd admin-side behavior: new users, plugin changes, or content modifications. Add WordPress audit logging and alerting as backlog hygiene, especially on sites with external contributors.
What doesn't work
  • A perimeter WAF alone is unreliable here because the payload can be stored through legitimate editor workflows and rendered later.
  • Network segmentation does little once the attacker is already inside the CMS with valid credentials; this is an application-layer trust problem.
  • Cookie HttpOnly alone is not enough; same-origin JavaScript can still drive privileged actions even if it cannot directly read every cookie.
06 · Verification

Crowdsourced verification payload.

Run this on the target WordPress host or in a mounted webroot on an auditor workstation. Invoke it as bash check_typing_text_cve_2025_22315.sh /var/www/html or point it straight at the plugin directory; it needs read access only and no root privileges unless your webroot is restricted.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_typing_text_cve_2025_22315.sh
# Detects exposure to CVE-2025-22315 in the WPDeveloper Typing Text WordPress plugin.
# Exit codes:
#   0 = PATCHED (plugin absent/removed)
#   1 = VULNERABLE (version <= 1.2.7)
#   2 = UNKNOWN (cannot determine, or version > 1.2.7 with no trusted patch baseline)

set -u

TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
  echo "UNKNOWN - usage: $0 <wordpress-root-or-plugin-dir>"
  exit 2
fi

PLUGIN_DIR=""
if [[ -d "$TARGET/wp-content/plugins/typing-text" ]]; then
  PLUGIN_DIR="$TARGET/wp-content/plugins/typing-text"
elif [[ -d "$TARGET/typing-text" ]]; then
  PLUGIN_DIR="$TARGET/typing-text"
elif [[ -d "$TARGET" && "$(basename "$TARGET")" == "typing-text" ]]; then
  PLUGIN_DIR="$TARGET"
else
  echo "PATCHED - plugin directory not found (typing-text not installed or already removed)"
  exit 0
fi

read_version() {
  local file
  for file in \
    "$PLUGIN_DIR/typing-text.php" \
    "$PLUGIN_DIR/plugin.php" \
    "$PLUGIN_DIR/readme.txt"; do
    if [[ -f "$file" ]]; then
      local v
      v=$(grep -Eim1 '^(Version|Stable tag):' "$file" | sed -E 's/^[^:]+:[[:space:]]*//I' | tr -d '\r')
      if [[ -n "$v" ]]; then
        echo "$v"
        return 0
      fi
    fi
  done
  return 1
}

normalize_version() {
  echo "$1" | grep -Eo '[0-9]+(\.[0-9]+){1,3}' | head -n1
}

RAW_VERSION="$(read_version 2>/dev/null || true)"
VERSION="$(normalize_version "$RAW_VERSION")"

if [[ -z "$VERSION" ]]; then
  echo "UNKNOWN - plugin found at $PLUGIN_DIR but version could not be parsed"
  exit 2
fi

AFFECTED_MAX="1.2.7"

if [[ "$VERSION" == "$AFFECTED_MAX" ]]; then
  echo "VULNERABLE - Typing Text version $VERSION detected at $PLUGIN_DIR"
  exit 1
fi

# sort -V compares semantic-ish dotted versions available on GNU coreutils.
LOWEST=$(printf '%s\n%s\n' "$VERSION" "$AFFECTED_MAX" | sort -V | head -n1)
if [[ "$LOWEST" == "$VERSION" ]]; then
  echo "VULNERABLE - Typing Text version $VERSION detected at $PLUGIN_DIR (<= $AFFECTED_MAX)"
  exit 1
fi

# Sources reviewed did not provide a trusted patched version. If a newer version exists locally,
# report UNKNOWN rather than assuming it is fixed.
echo "UNKNOWN - Typing Text version $VERSION detected at $PLUGIN_DIR; no authoritative patched version confirmed in reviewed sources"
exit 2
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: query your fleet for wp-content/plugins/typing-text, identify which sites actually use the plugin, and check whether those sites also allow Contributor/Author access for contractors, marketers, or community users. Because this is a LOW reassessment, there is no noisgate mitigation SLA and no noisgate remediation SLA beyond backlog hygiene; if the plugin is unnecessary, remove it in the next routine change window, and if it is necessary, tighten low-privilege publishing roles and review workflows while you watch for any vendor patch or repository update.

Sources

  1. NVD CVE-2025-22315
  2. Wordfence advisory for CVE-2025-22315
  3. Wordfence plugin overview for Typing Text
  4. WordPress.org plugin page for Typing Text
  5. Patchstack Typing Text vulnerability history
  6. CISA weekly vulnerability bulletin SB25-013
  7. FIRST EPSS API documentation
  8. OpenCVE record mirror for CVE-2025-22315
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.