Servers and applications
GHSA-2qxw-wm6h-5jr7
Stored XSS: a registered user's channel About text is entity-decoded by feedHtmlDescription() and rendered unescaped by feed/rss-style.xsl (disable-output-escaping), so the public channel RSS page /channel/<name>/feed runs script on the site origin
- Severity
- Medium 5.4
- Published
- 11 Nov 2026
- Last changed
- 11 Nov 2026
- Added to UpHeron
- 11 Nov 2026
- Weakness
- Cross-site scripting (CWE-79)
- Attack
- Over the network · Needs a user account · Needs someone to click or open something
- Attacker can
- Read some data · Change some data
- CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N- Sources
- Project advisories (GitHub)
Description
Any registered user can store an XSS payload in their channel About field. The payload runs in the browser of anyone who opens that user's public channel feed (/channel//feed). The feed page is served from the AVideo origin, and the RSS button on the channel page links to it.
User::setAbout() stores the About text HTML-escaped (xss_esc()), for example <img src=x onerror=...>. Three things undo that escaping:
- feed/index.php copies the About text into the channel .
- feedHtmlDescription() (feed/index.php:143) calls html_entity_decode() up to three times, so the stored entities become a real tag. Its own filters do not remove it. The on*= regex only matches quoted values ("..." / '...'), so onerror=alert(1) with no quotes and pass, and javascript: URLs are never checked.
- The response is text/xml with <?xml-stylesheet href=".../feed/rss-style.xsl"?>. rss-style.xsl prints description with disable-output-escaping="yes" (lines 32 and 41).
Affected software
| Software | Affected versions |
|---|---|
AVideoServers and applications · github:wwbn/avideo |
|
References
- GitHub Advisory Database https://github.com/advisories/GHSA-2qxw-wm6h-5jr7
- github.com https://github.com/WWBN/AVideo/security/advisories/GHSA-2qxw-wm6h-5jr7