league/commonmark security advisory
CVE-2026-71478: League/commonmark: AttributesExtension href/src unsafe-link filter bypass via embedded control bytes
CVE-2026-71478 is a medium-severity XSS vulnerability in the PHP package league/commonmark (CVSS 6.1), published 6 August 2026. The advisory does not name a fixed version. It can be exploited without an account.
medium 6.1 published 2026-08-06 · updated 2026-10-24
- Affected versions
- >= 1.5.0, <= 2.8.3
- Fixed in
- not stated
- Newest release
- 2.10.7
- Severity
- Medium · CVSS 6.1
- Type
- Cross-site scripting (XSS)
CWE-79, CWE-86, CWE-692 - Exploited in the wild
- Not on the CISA KEV list
checked 2026-11-04
Is your league/commonmark version affected?
Who can exploit CVE-2026-71478
- Access: No account. Anyone who can send a request to an app that uses the affected code.
- Interaction: A user also has to do something, such as open a link or a page the attacker prepared.
CVSS vector (scored by GitHub): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
How to fix CVE-2026-71478 in league/commonmark
- Find the installed version:
composer show league/commonmark. If you never required it yourself,composer why league/commonmarkshows which package pulls it in. - Update it:
composer update league/commonmark --with-all-dependencies. - If Composer will not go that high, your composer.json constraint is holding it back. Widen it (for example
"league/commonmark": "^2.10.7"if you can take that version), or upgrade the package that requires it. - Run
composer audit. It reads the same advisory data and should no longer list CVE-2026-71478. - Commit composer.lock and deploy it. On the server, run
composer install --no-devfrom the lock file, notcomposer update.
If you cannot upgrade yet
- Escape output in your own templates and add a Content-Security-Policy that blocks inline scripts.
- Limit who can save the content the advisory names (for example rich text, SVG or form fields).
- If your app does not use the affected feature, note that in your audit, but still plan the upgrade.
The CVE-2026-71478 advisory
league/commonmark is a PHP library for parsing and rendering CommonMark Markdown. From 1.5.0 until 2.9.0, the AttributesExtension's href and src unsafe-link filter can be bypassed by embedding control bytes, such as a tab, carriage return, line feed, or leading C0 control character, in a javascript: URL that browsers discard before parsing the scheme, causing the browser to still execute the script even when the unsafe-link filter is enabled. This issue is fixed in 2.9.0.
References
- GitHub advisory GHSA-29pj-957v-52mc github.com
- Fix commit 493a5aa github.com
- Release 2.9.0 github.com
Other league/commonmark advisories
- medium League/commonmark: DisallowedRawHtml bypassed when a disallowed tag name ends the raw-HTML literal 2026-09-30
- high League/commonmark: Quadratic-time denial of service in the GitHub Flavored Markdown Table extension block-start scan 2026-09-30
- high League/commonmark: Denial of service via distinctly-named attributes in the Attributes extension 2026-09-01
- high League/commonmark: Denial of service in the SmartPunct and Attributes extensions 2026-09-01
- high League/commonmark XSS: on* event-handler filter in AttributesExtension bypassed with a U+000C form feed 2026-09-01
- high League/commonmark: Denial of service via crafted code fences, reference links, and emphasis delimiters 2026-09-01
Related
Need help patching or upgrading? Laskyr does PHP and Laravel security fixes and upgrades. Tell us what you run and we reply with a plan and a price.
Ask about a fixWhere this data comes from
- Affected and fixed versions: the Packagist security advisories API (GitHub Advisory Database and FriendsOfPHP), the same data
composer audituses. Synced 2026-11-03. - Description, score, weakness and references: NIST National Vulnerability Database (NVD), checked 2026-11-04. This product uses data from the NVD API but is not endorsed or certified by the NVD.
- Exploited-in-the-wild status: the CISA Known Exploited Vulnerabilities catalog, checked 2026-11-04.
- Compiled by Daniel Lasek at Laskyr from the sources above. The summary, “who can exploit it”, “how to fix it” and hardening sections are our plain-English reading of the record and are generated from it. The quoted description is the record's own text. Spot an error? Tell us.