CVE-2026-72832: Grav: Stored XSS via quoted-attribute bypass in detectXss
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.
— NVD
Grav: Stored XSS via quoted-attribute bypass in detectXss
— Packagist
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 - Compensating control
Replace the heuristic event-handler check with an HTML tokenizer or sanitizer that rejects event-handler attributes on parsed elements; alternatively, make the existing tripwire quote-aware so it does not treat a '>' inside a quoted attribute value as the tag boundary.
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.