GitHub Advisoryadvisory · Packagist

GHSA-3h6j-9x8m-rg3g Graby has stored XSS via iframe srcdoc Attribute in htmLawed Sanitization Config

LOW Published 2026-03-31 Modified 2026-03-31 Official page ↗
Ecosystem
Packagist
Packages
j0k3r/graby
Severity
Low
CVSS vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N/E:P
Weaknesses
CWE-79
Reviewed
2026-03-31

Affected packages

• Packagist j0k3r/graby: < 2.5.1 → fixed in 2.5.1

Description

Summary Graby's `cleanupXss()` function configures htmLawed with conflicting settings: `safe=1` (which removes ``) combined with `'elements' => '*+iframe-meta'` (which re-enables ``). htmLawed does not sanitize the `srcdoc` attribute, allowing injection of arbitrary JavaScript that executes when the content is rendered via `|raw` in templates. Root Cause `src/Graby.php` lines 1038-1048: ```php htmLawed($html, [ 'safe' => 1, // removes 'elements' => '*+iframe-meta', // re-adds , overrides safe=1 'deny_attribute' => 'style', // srcdoc is NOT denied ]); ``` The `safe=1` and `+iframe` combination is a conflict: `safe` mode is designed to strip dangerous elements, but the elements override re-enables `` without also blocking the dangerous `srcdoc` attribute. Proof of Concept Input to `cleanupXss()`: ```html ``` Output (unchanged — htmLawed passes it through): ```html ``` When rendered via `{{ content|raw }}` in a template, `srcdoc` executes in an `about:srcdoc` frame with the same origin as the page. Confirmed via Puppeteer/Chromium headless: `alert(document.domain)` fires. Validated on Wallabag (which uses Graby) via Docker: entry created via API with iframe-only content body triggers Readability failure → falls through to `cleanupXss()` path. Impact • Stored XSS in any application rendering Graby-sanitized content via `|raw` • In Wallabag: affects both authenticated views and public share pages (unauthenticated) • No CSP headers in default Wallabag config — no secondary mitigation Suggested Fix Either remove `+iframe` from the elements config to keep iframes blocked: ```php 'elements' => '*-iframe-meta', ``` Or explicitly deny the `srcdoc` attribute: ```php 'deny_attribute' => 'style srcdoc', ``` Credit Discovered by @tikket1, 2026-03-25. Redirected from wallabag/wallabag advisory by @j0k3r.

Related

Weakness · CWE (1)

  • CWE-79 Improper Neutralization of Input During Web Page Generation weakness

References