CVE-2026-72832: Grav before 2.0.12 Stored XSS via quoted-attribute bypass
Summary
A page editor without admin.super can place an event handler after a > inside a quoted attribute. Grav accepts and stores the page, then executes the handler in the application origin when a visitor opens it.
Details
Security::detectXss() (system/src/Grav/Common/Security.php:253) anchors the onevents scan at < and uses [^>]?, which cannot cross the first literal >. When that character is inside a quoted value, the browser keeps the tag open and parses the later onerror attribute, so the detector and browser disagree. AdminController::savePage() relies on this detector when saving content from page editors outside the admin.super whitelist.
PoC
I reproduced this with getgrav/grav 2.0.11 (ad9709f865b09b68798fb1ac375b484a8cc1d892), Admin 1.10.52, and Quark 2 1.1.4.
1. Sign in as a user with admin.login and admin.pages, but without admin.super. 2. Create or edit /xsstest and save this page body:
html <img src=x title=">" onerror=alert(document.domain)>
3. Open /xsstest in a private browser window.
The save succeeds and the visitor sees an alert containing the site domain. With the body changed to <img src=x onerror=alert(1)>, the same endpoint rejects it with XSS issue detected and does not store it.
Impact
A page editor can execute JavaScript in the origin of every user who views the stored page, including unauthenticated visitors.
Anticipated objection and response
Although the detectXss() docblock describes it as a heuristic that cannot catch every XSS, this check is the storage-time boundary for page editors outside the default security.xsswhitelist of admin.super. The same endpoint rejects a plain handler but accepts this executable form, allowing a lower-trust editor to cross the boundary the check is intended to enforce.
Suggested fix
Prefer an HTML tokenizer or sanitizer that rejects event-handler attributes on parsed elements. If the existing tripwire remains, make its tag scan quote-aware instead of treating every > as a boundary. Add double-quoted and single-quoted regression cases plus the rejected plain-handler control.
Other sources
Grav versions from 1.5.2 through 2.0.12 contain a stored cross-site scripting vulnerability in the Security::detectXss() function (system/src/Grav/Common/Security.php). The event-handler scan is anchored at < and uses [^>]?, which cannot cross the first literal >; when a > appears inside a quoted attribute value the browser keeps the tag open and parses a subsequent event handler (e.g. onerror), so the detector and browser disagree. A page editor without admin.super privileges can save page content such as <img src=x title=">" onerror=alert(document.domain)>, which is accepted, stored, and executed in the site origin when any visitor (including unauthenticated users) views the page. Fixed in 2.0.13.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/getgrav/gravto a version that resolves this vulnerability.Fixed in 2.0.13 - Upgrade
Upgrade
getgrav/gravto a version that resolves this vulnerability.Fixed in 2.0.13 - Configuration
Update the storage-time XSS detector so the event-handler scan is quote-aware (do not treat the first literal '>' inside quoted attribute values as the end boundary), ensuring the detector cannot be bypassed by quoted-attribute payloads.
Grav Security::detectXss() (system/src/Grav/Common/Security.php) on_events scan quote-awareness = Reject/avoid treating every '>' as a hard boundary when it occurs inside quoted attribute values
Event History
Frequently Asked Questions
What is the severity of CVE-2026-72832?
The severity of CVE-2026-72832 is medium with a score of 5.4.
How do I fix CVE-2026-72832?
To fix CVE-2026-72832, upgrade Grav to version 2.0.12 or later.
What type of vulnerability is CVE-2026-72832?
CVE-2026-72832 is a stored cross-site scripting (XSS) vulnerability.
Which versions of Grav are affected by CVE-2026-72832?
Grav versions from 1.5.2 through 2.0.12 are affected by CVE-2026-72832.
What is the impact of CVE-2026-72832?
The impact of CVE-2026-72832 can lead to user information exposure and potential attacks on users.