---
id: "CVE-2026-118784"
page: "https://infrastack.ai/live/CVE-2026-118784"
kind: "vulnerability"
aliases: ["CVE-2026-118784"]
title: "WPSpeed WordPress plugin: stored XSS via author archive pages"
severity: "medium"
cvss: 6.4
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["package", "self-hosted", "wordpress", "wpspeed"]
not_affected_if: ["no-subscriber-registration", "plugin-not-installed", "pretty-permalinks"]
published_at: "2026-11-07T10:17:06+00:00"
first_seen_at: "2026-11-07T10:46:40+00:00"
updated_at: "2026-11-07T10:48:37+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-118784", "first_seen_at": "2026-11-07T10:46:40+00:00"}]
exploit_sources: []
---

# WPSpeed WordPress plugin: stored XSS via author archive pages

Link for people: https://infrastack.ai/live/CVE-2026-118784 (this .md is for agents)

The WPSpeed plugin for WordPress, up to and including 2.6.10, decodes HTML entities across author archive pages, so a Subscriber can store a display name that runs script in other visitors' browsers. An attacker gets script execution in the context of any logged-out visitor who opens the attacker's author archive.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check the installed WPSpeed plugin version in the WordPress admin plugins list or in the plugin's main file header against `2.6.10`
- Check whether the LightImages image optimizer option `img_processing_entity_decode` is enabled (default on)
- Check whether the site uses plain permalinks, which the flaw depends on

## Fix

- WPSpeed plugin: versions above `2.6.10` (fixed version not stated in the sources)

## Timeline

- 2026-11-07T10:46:40+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-118784

## From the sources

The WPSpeed plugin for WordPress is vulnerable to Stored Cross-Site Scripting in versions up to, and including, 2.6.10 This is due to a combination of two issues in the LightImages HTML optimizer: (1) Dispatcher::runOptimize() decides whether the current request is the site's home page by comparing only the URL path from REQUEST_URI against the path of the home URL, so on a plain-permalinks install the author archive URL /?author=<ID> is treated as the home page and the LightImages optimizer runs on it; and (2) LightImages::optimize() calls html_entity_decode() across the entire serialized DOMDocument output under the default-enabled img_processing_entity_decode setting, converting any entity-encoded markup present as plain text in the page (including WordPress's rendered author title) into live HTML. This makes it possible for authenticated attackers, with Subscriber-level access and above, to store entity-encoded markup in their own nickname/display_name through the normal profile endpoint and have that markup rehydrated into executing script when any logged-out visitor loads their author archive.

---

_Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai_
