GHSA-cx86-7xwp-w9wf

Suggest an improvement
Source
https://github.com/advisories/GHSA-cx86-7xwp-w9wf
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-cx86-7xwp-w9wf/GHSA-cx86-7xwp-w9wf.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-cx86-7xwp-w9wf
Aliases
Published
2026-09-18T16:58:50Z
Modified
2026-09-18T17:15:05Z
Severity
  • 6.1 (Medium) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N CVSS Calculator
Summary
Semantic MediaWiki affected by reflected XSS in `Special:Ask` via a forged cursor pagination token
Details

Reflected XSS via a forged cursor pagination token

Failure mode

Special:Ask accepts a cursor query parameter for keyset pagination (added in 7.0.0). The token is decoded by CursorEncoder, which is an unsigned base64url-encoded JSON blob, so its contents are fully attacker-controlled. When the cursor's sort anchor does not match the request's sort= / order=, QueryCreator::applyCursorIfRequested() builds an error message by interpolating the attacker-controlled sort_prop / sort_order values into a raw string via Query::addErrors().

Unlike SMW's message-key errors, this raw string bypasses the message layer's sanitisation (ProcessingErrorMsgHandler::normalizeAndDecodeMessages() passes a non-key, non-encoded string through unchanged). ErrorWidget::queryError() then assembles the errors and passes them to Html::errorBox(), whose first argument is emitted as raw HTML. The result is a reflected cross-site scripting vulnerability: a crafted cursor token containing markup in sort_prop (or sort_order) executes script in the victim's browser on the wiki origin.

No authentication or special permission is required. The payload is delivered via a crafted link, e.g. Special:Ask?q=...&p[cursor]=<forged token> where the token decodes to {"v":1,"sort_prop":"<script>...</script>"}. Confirmed executing in a browser; the responses carry no Content-Security-Policy, so inline script is not blocked.

Remediation

  • Output-encode the attacker-controlled sort_prop / sort_order values before they are interpolated into the error text in QueryCreator, so no raw user input enters the error stream.
  • Defense in depth: the format=debug output path that reflected the same error text was hardened separately in GHSA-q5fm-9mx6-44f4.

Maintenance note

Query error strings are rendered as raw HTML by ErrorWidget::queryError() via Html::errorBox(). Any error added through Query::addErrors() that embeds user-controlled text must be output-encoded (or use a message key); pagination and validation error text is attacker-influenced and must not be treated as trusted.

Database specific
{
    "cwe_ids": [
        "CWE-79"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-09-18T16:58:50Z",
    "nvd_published_at": null,
    "severity": "MODERATE"
}
References

Affected packages

Packagist / mediawiki/semantic-media-wiki

Package

Name
mediawiki/semantic-media-wiki
Purl
pkg:composer/mediawiki/semantic-media-wiki

Affected ranges

Type
ECOSYSTEM
Events
Introduced
7.0.0
Fixed
7.2.0

Affected versions

7.*
7.0.0
7.1.0

Database specific

last_known_affected_version_range
"<= 7.1.0"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/09/GHSA-cx86-7xwp-w9wf/GHSA-cx86-7xwp-w9wf.json"