Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify site with Critical CSS + API key enabled
-
DeliverySend frontend request with script in REQUEST_URI path
-
ExploitPayload enqueued via ao_ccss_enqueue() and stored
-
ExecutionAdmin/user views injected queue page
-
ImpactScript executes in victim browser session
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation is gated on a specific non-default configuration: Autoptimize's Critical CSS feature must be active AND a valid Critical CSS API key must be configured - per the description this is the precondition that allows unauthenticated frontend requests to trigger queue entries via ao_ccss_enqueue(). On default installs where Critical CSS is disabled or no API key is set, the unauthenticated injection path is not reachable. The stored payload (an attacker-controlled REQUEST_URI path) executes when a user/administrator accesses the injected page, specifically the Critical CSS settings queue view; realized impact therefore also depends on a privileged user viewing that page. Affected versions are all releases up to and including 3.1.15.1. |
| Impact | The vendor-provided CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N, 7.2 HIGH) describes unauthenticated, network-reachable stored XSS with a scope change (script executes in the context of any user viewing the injected page). No EPSS score, CISA KEV listing, or public POC is provided in the input, so by the precision rules this is 'no public exploit identified at time of analysis' - a theoretical-but-credible issue rather than one with confirmed active exploitation. The raw 7.2 is tempered by a significant real-world gating condition the description itself states: exploitation requires the optional Critical CSS feature to be enabled AND a valid API key configured, which is the only path by which unauthenticated frontend requests reach ao_ccss_enqueue() and persist an attacker-controlled REQUEST_URI. Against Autoptimize's large install base that configuration is a minority deployment, so the effective population is much smaller than the headline PR:N suggests. The confidentiality/integrity impact is correctly rated Low (C:L/I:L) - classic reflected-into-stored XSS consequences (session/cookie theft, UI manipulation) rather than full account or data compromise. Net: a legitimate HIGH-severity-on-paper finding but moderate real-world priority, with the API-key/Critical-CSS precondition and absence of exploitation signals being the key risk reducers. |
| Exploit ScenarioDerived | An unauthenticated attacker identifies a WordPress site running Autoptimize ≤3.1.15.1 with the Critical CSS feature active and an API key configured, then issues crafted frontend HTTP requests whose REQUEST_URI path contains a malicious script payload. The payload is enqueued via ao_ccss_enqueue() and stored unsanitized, later rendering in the Critical CSS admin settings queue view so the script executes in an administrator's browser when they review the queue. No public POC is referenced in the provided data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 01, 2026
Stored cross-site scripting in the Autoptimize WordPress plugin (all versions up to and including 3.1.15.1) lets an unauthenticated attacker plant arbitrary JavaScript in the Critical CSS settings queue by supplying a malicious REQUEST_URI path that the plugin stores without sanitization and later renders without escaping. The injection path is only reachable when the non-default Critical CSS feature is active and a valid Critical CSS API key is configured, which is what allows unauthenticated frontend requests to create queue entries through ao_ccss_enqueue(); the payload then fires when a privileged user opens the affected admin queue view, giving a scope change and low-integrity/confidentiality impact rather than full site takeover. Assessment notes the effective CVSS vector as AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N, requiring victim interaction (a user viewing the injected page) despite the vendor's UI:N rating, and no public exploit code has been identified at time of analysis and the issue is not in CISA KEV.
RemediationAI
The upstream project has published a fix in the Trac changeset referenced by the advisory (changeset 3713884 in the autoptimize repository), so the correct action is to apply that upstream fix or upgrade to the first Autoptimize release that contains it; a released, tagged patched version could not be independently confirmed from the supplied data, so verify the version banner after updating. Because the changeset reference is a commit rather than a confirmed tagged release, treat the fix as 'upstream fix available (commit); released patched version not independently confirmed' and confirm with the vendor changelog. If immediate updating is not possible, the most effective compensating control is to deactivate the Critical CSS feature or clear the configured Critical CSS API key, which removes the unauthenticated queue-entry path entirely; the trade-off is loss of automatic above-the-fold CSS generation and the associated page-speed benefit. As a secondary measure, restrict access to the WordPress admin Critical CSS queue screen (for example via IP allowlisting or an admin-area access rule) so the stored payload cannot be rendered, though this does not remove the injection itself and may break legitimate administrative workflows. Review the Critical CSS queue for attacker-supplied entries and clear them as part of cleanup, since previously stored payloads persist until removed. Advisory and technical detail: https://www.wordfence.com/threat-intel/vulnerabilities/id/1704cffa-75ed-415e-864f-de7ff8eea8dc?source=cve and the fix at https://plugins.trac.wordpress.org/changeset?reponame=&old=3713884%40autoptimize&new=3713884%40autoptimize.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Autoptimize is a WordPress performance plugin from OptimizingMatters that aggregates, minifies and caches CSS/JS and supports a Critical CSS subsystem for above-the-fold rendering optimization. The defect is a classic CWE-79 improper neutralization of input during web page generation, specifically a stored variant: unauthenticated frontend requests are captured by Autoptimize's Critical CSS enqueue logic (ao_ccss_enqueue() in classes/autoptimizeCriticalCSSEnqueue.php, around lines 57 and 218), which derives a queue key/path from the request URI without adequate sanitization. The stored value is later emitted into the admin Critical CSS queue UI without output escaping (classes/critcss-inc/admin_settings_queue.php line 82 and the JavaScript template classes/critcss-inc/admin_settings_queue.js.php line 125), so attacker-controlled markup executes in the browser context of whoever loads that page. The CVSS scope change (S:C) reflects that the injected script runs in the administrator's session rather than the attacker's origin, and the CPE cpe:2.3:a:optimizingmatters:autoptimize:*:*:*:*:*:*:*:* confirms the plugin package itself, with every release through 3.1.15.1 affected. The critical prerequisite is environmental, not credential-based: the Critical CSS feature must be enabled and a working Critical CSS API key configured, because that configuration is what wires unauthenticated frontend traffic into the queue-building routine.
Know when Autoptimize gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
Unauthenticated network injection (PR:N, AV:N) but stored payload only fires when a user views the injected queue page, so UI:R; cross-context script execution gives S:C with C:L/I:L.
Primary rating from Vendor (Wordfence).
CVSS VectorVendor: Wordfence
DescriptionCVE.org
The Autoptimize plugin for WordPress is vulnerable to Stored Cross-Site Scripting via REQUEST_URI Path in all versions up to, and including, 3.1.15.1 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. Exploitation requires the Critical CSS feature to be active with a valid API key configured, as this is the precondition for unauthenticated frontend requests to trigger queue entries via ao_ccss_enqueue().
Executive ViewAI
Autoptimize, a widely deployed WordPress performance plugin, mishandles the request path stored in its Critical CSS queue in all versions up to and including 3.1.15.1, letting an unauthenticated visitor plant JavaScript that later runs in the browser of a logged-in administrator who opens that queue view. The exposure is limited to the subset of WordPress estates that have the non-default Critical CSS feature enabled with a configured API key, but for those sites it places privileged administrator sessions - and anything reachable from them - at risk, and no vendor patch is available yet, so protection currently depends on configuration and monitoring.
No vendor-released patch identified at time of analysis. Interim mitigations: disable the non-default Critical CSS feature or remove its API key, which removes the unauthenticated injection path; deactivate or remove the plugin where Critical CSS is not needed; restrict and monitor wp-admin access (network allowlists, VPN, MFA); deploy WAF or virtual patching rules that reject script markup in request URIs; review the Critical CSS queue and related database entries for injected payloads; and invalidate administrator sessions and rotate credentials for users who accessed the affected admin view.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
More in Autoptimize
View allThe Autoptimize WordPress plugin before 2.7.8 attempts to delete malicious files (such as .php) form the uploaded archiv
Unauthenticated stored cross-site scripting affects the Autoptimize (before 3.1.15), Clearfy Cache (before 2.4.2), and S
The Autoptimize WordPress plugin before 2.7.8 attempts to remove potential malicious files from the extracted archive up
The ao_ccss_import AJAX call in Autoptimize Wordpress Plugin 2.7.6 does not ensure that the file provided is a legitimat
The Autoptimize WordPress plugin before 3.1.7 does not sanitise and escape the settings imported from a previous export,
The Autoptimize WordPress plugin before 3.1.1 does not sanitise and escape some of its settings, which could allow high
The Autoptimize WordPress plugin before 2.7.8 does not check for malicious files such as .html in the archive uploaded v
The Autoptimize WordPress plugin before 2.8.4 was missing proper escaping and sanitisation in some of its settings, allo
A Stored Cross-Site Scripting (XSS) vulnerability exists in the Autoptimize WordPress plugin through version 3.1.14, cau
The Autoptimize WordPress plugin contains a Stored Cross-Site Scripting (XSS) vulnerability in the lazy-loading image pr
Stored cross-site scripting in the Autoptimize WordPress plugin (all versions up to and including 3.1.15.1) allows unaut
EUVD-2026-90560
GHSA-v9f4-5xpx-364q
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB