Weakness is CWE-79 Improper Neutralization of Input During Web Page Generation.
A Markdown audio or video embed renders itselement as raw HTML.
The media URL is concatenated unescaped into that raw HTML.
The URL fragment is reflected without any encoding.
A payload like .
It injects arbitrary HTML including a script-executing
The maintainer has been closing this class.
GHSA-r7fx-8g49-7hhr covered attribute().
GHSA-pmf8-g7c8-7v54 / CVE-2026-55890 covered style() in 2.0.0-rc.9.
GHSA-ffmg-hfvg-jhg9 covered resize() in 2.0.0-rc.10.
All three guarded image style/attribute sinks.
The aba291a5 audit scoped itself to sinks reaching style attribute.
It did not cover audio/videorawHtml sink.
That sink reaches full script execution rather than CSS injection.
Root cause is Parsedown rawHtml emitted verbatim, unescaped.
AudioMediaTrait.php L43-52 and VideoMediaTrait.php L58-67 concatenate $location.
$location includes URL fragment stored with no encoding.
MediaObjectTrait::urlHash() L240-249 only strips leading .
Excerpts.php L188 decodes media URL with htmlspecialchars_decode(urldecode(…)).
This undoes Parsedown escaping.
Excerpts.php L321-323 routes fragment to urlHash().
So “, <, >, =, (, ) survive into raw.
GFM tagfilter ParsedownGravTrait::filterDisallowedRawHtml() L528-535 escapes < only for |textarea|style|xmp|iframe|noembed|noframes|script|plaintext.
They inject as live markup.
The __call querystring passthrough rawurlencodes values.
The fragment never passes through it.
Event-handler values such as onload=alert(1) keep = ( ) and execute.
Image render path is unaffected.
Image src goes into htmlspecialchars-escaped attribute, not rawHtml.
This is why the audio/video source rawHtml sink is reliable.
CVE-2026-55890 is referenced as a prior style() sink in the same class.
CVE-2026-42841 is referenced as the sibling script-XSS advisory anchor.
No separate CVE for this audio/video source sink is provided in the .
DailyCVE Form:
Platform: Grav CMS
Version: 2.0.13 develop HEAD
Vulnerability : Audio/Video rawHtml XSS
Severity: Medium ~6.9 CVSS
date: Not provided
protected function sourceParsedownElement(array $attributes, $reset = true)
{
$location = $this->url($reset);
return [
'name' => 'audio',
'rawHtml' => '<source src="' . $location . '">Your browser does not support the audio tag.',
'attributes' => $attributes
];
}
Expected output:
<audio controls="controls" alt="sound"><source src="/user/pages/03.poc/sound.mp3?loading=auto&decoding=auto&fetchpriority=auto"><svg/onload=alert(1)>">Your browser does not support the audio tag.</audio>
Open http://127.0.0.1:8390/poc
SVG onload fires and executes alert(1)
document.body.innerHTML='XSS_…' variant rewrites page
Protection: from this CVE
Escape $location with htmlspecialchars() before concatenating intorawHtml in AudioMediaTrait::sourceParsedownElement() and VideoMediaTrait::sourceParsedownElement().
Buildthrough Parsedown’s escaped-attribute mechanism instead of raw string.
Encode URL fragment in MediaObjectTrait::urlHash() rather than passing verbatim.
Apply output encoding to any other rawHtml media sink.
Do not rely on GFM tagfilter for
Impact:
Arbitrary JavaScript executes with no interaction in session of any user who views page embedding crafted audio/video file.
Attacker is page-content author, Grav back-end user with page-edit rights below super-admin.
Injected
Viewer can be published-page visitor confirmed at runtime.
Viewer can be logged-in administrator who views page.
Secure, high-velocity infrastructure and disruptive technological engineering. Contact our engineering team for high-tier development and proprietary systems: [email protected]
💎 Smart Architecture | 🛡️ Secure by Design | ⭐ Trusted by Thousands
Sources:
Reported By: github.com
Extra Source Hub:
Undercode
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent may adversely affect certain features and functions.
We do not sell your personal data. If you wish to exercise your rights under applicable privacy laws, please visit our Do Not Sell My Personal Information page.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.