CVE-2026-48760

CVE-2026-48760 is a medium-severity security vulnerability in symfony/html-sanitizer (composer), affecting versions >= 6.1.0, < 6.4.41. It is fixed in 6.4.41, 7.4.13, 8.0.13.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

Symfony: HtmlSanitizer URL Parser Deny Gates Underinclusive: Percent-Encoded BiDi Marks and Unicode Whitespace Bypass Visual-Spoofing Defense

Description

Symfony\Component\HtmlSanitizer\TextSanitizer\UrlSanitizer::parse() rejects URLs containing raw Unicode explicit-direction BiDi formatting characters (U+202A–U+202E, U+2066–U+2069) as a defense against visual-spoofing of the rendered href. The check covers only the raw UTF-8 forms of those code points: the percent-encoded forms (%E2%80%AE for U+202E, %E2%81%A6 for U+2066, etc.) are not matched by the deny regex, survive league/uri's parse/build cycle, and are re-emitted unchanged in the sanitized URL. Any downstream consumer that decodes the link before display, phishing-detection filters that compare urldecode($href) against a domain allow-list, audit-log dashboards that show a decoded form for readability, hover-tooltip previews, federated/syndicated content where the decoder lives on the consuming side, restores the BiDi character and the visual spoof that the original defense was filed to prevent.

The same UrlSanitizer::parse() carries an ASCII-only /\s/ whitespace check (no /u modifier) intended as a backstop against malformed URLs. Without the /u modifier, PCRE's \s matches only ASCII whitespace, so Unicode whitespace characters, NBSP (U+00A0), the zero-width no-break space / BOM (U+FEFF), line/paragraph separators (U+2028, U+2029), ogham space (U+1680), the U+2000–U+200A en/em quad family, narrow / medium / ideographic spaces (U+202F, U+205F, U+3000) and NEL (U+0085), pass through unchanged in both raw and percent-encoded forms. In hostname positions they enable lookalike spoofs (example<NBSP>.com); in path/query/fragment they enable allow-list drift when a downstream consumer strips whitespace before comparison.

Resolution

UrlSanitizer::parse() now denies BiDi formatting marks together with Unicode whitespace and the zero-width no-break space, in both the raw input and the percent-decoded form of each parsed URL component (user, pass, host, path, query, fragment). ASCII space remains tolerated in path/query/fragment via the existing percent-encoding step.

The patches for this issue are available here for branch 6.4 (and forward-ported to 7.4, 8.0 and 8.1).

Credits

Symfony would like to thank Scott Arciszewski (Trail of Bits) for reporting the issue and Nicolas Grekas for providing the fix.

Impact

Affected versions

symfony/html-sanitizer (>= 6.1.0, < 6.4.41) symfony/html-sanitizer (>= 7.0.0, < 7.4.13) symfony/html-sanitizer (>= 8.0.0, < 8.0.13) symfony/symfony (>= 6.1.0, < 6.4.41) symfony/symfony (>= 7.0.0, < 7.4.13) symfony/symfony (>= 8.0.0, < 8.0.13)

Security releases

symfony/html-sanitizer → 6.4.41 (composer) symfony/html-sanitizer → 7.4.13 (composer) symfony/html-sanitizer → 8.0.13 (composer) symfony/symfony → 6.4.41 (composer) symfony/symfony → 7.4.13 (composer) symfony/symfony → 8.0.13 (composer)

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

Upgrade the following packages to resolve this vulnerability:

symfony/html-sanitizer to 6.4.41 or later; symfony/html-sanitizer to 7.4.13 or later; symfony/html-sanitizer to 8.0.13 or later; symfony/symfony to 6.4.41 or later; symfony/symfony to 7.4.13 or later; symfony/symfony to 8.0.13 or later

Kodem Kai can prioritize this vulnerability in your dependency tree and generate a fix recommendation.

Frequently Asked Questions

  1. What is CVE-2026-48760? CVE-2026-48760 is a medium-severity security vulnerability in symfony/html-sanitizer (composer), affecting versions >= 6.1.0, < 6.4.41. It is fixed in 6.4.41, 7.4.13, 8.0.13.
  2. Which packages are affected by CVE-2026-48760?
    • symfony/html-sanitizer (composer) (versions >= 6.1.0, < 6.4.41)
    • symfony/symfony (composer) (versions >= 6.1.0, < 6.4.41)
  3. Is there a fix for CVE-2026-48760? Yes. CVE-2026-48760 is fixed in 6.4.41, 7.4.13, 8.0.13. Upgrade to this version or later.
  4. Is CVE-2026-48760 exploitable, and should I be worried? Whether CVE-2026-48760 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  5. What actually determines whether CVE-2026-48760 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  6. How do I fix CVE-2026-48760?
    • Upgrade symfony/html-sanitizer to 6.4.41 or later
    • Upgrade symfony/html-sanitizer to 7.4.13 or later
    • Upgrade symfony/html-sanitizer to 8.0.13 or later
    • Upgrade symfony/symfony to 6.4.41 or later
    • Upgrade symfony/symfony to 7.4.13 or later
    • Upgrade symfony/symfony to 8.0.13 or later

Other vulnerabilities in symfony/html-sanitizer

Stop the waste.
Protect your environment with Kodem.