GitHub Advisoryadvisory · PyPI

GHSA-vrx2-77f2-ww34 justhtml has sanitization bypass in custom policies and programmatic DOM

MEDIUM Published 2026-04-22 Modified 2026-04-22 Official page ↗
Ecosystem
PyPI
Packages
justhtml
Severity
Moderate
CVSS vector
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:H/VA:N/SC:N/SI:L/SA:N
Weaknesses
CWE-436, CWE-471, CWE-79, CWE-835
Reviewed
2026-04-22

Affected packages

• PyPI justhtml: < 1.17.0 → fixed in 1.17.0

Description

Summary `justhtml` `1.17.0` fixes multiple security issues in sanitization, serialization, and programmatic DOM handling. Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions • `justhtml` ``, MathML ``, SVG `` / ``, and MathML text integration points • mutation-XSS parser-differential payloads that looked inert in memory but became active HTML after reparse • SVG `filter="url(...)"` attributes that could trigger external fetches These issues affected: • `JustHTML(..., sanitize=True)` with custom foreign-namespace policies • `sanitize()` / `sanitize_dom()` • low-level terminal `Sanitize(...)` transform execution Preserved `` handling Constructor-time sanitization and explicit `Sanitize(...)` transforms did not fully match `sanitize()` / `sanitize_dom()` when custom policies preserved ``. That could leave resource-loading CSS such as `@import` or `background-image:url(...)` in sanitized output from HTML string input. Programmatic DOM serialization Programmatic `script`, `style`, and `Comment(...)` nodes could still serialize into active markup in some edge cases. This could affect applications that build or mutate DOM trees directly before calling `to_html()` or `to_markdown(html_passthrough=True)`. Cache mutation and DOM cycle handling Two lower-severity hardening fixes were included: • compiled sanitize-pipeline caches could be mutated after warming and weaken later sanitization • parent/child cycles in programmatic DOM trees could cause infinite loops in operations such as `to_html()` and `sanitize_dom()` Default configuration Most of the issues above did not affect ordinary parsed HTML with the default `JustHTML(..., sanitize=True)` configuration. The main risk areas were: • custom policies that preserve SVG or MathML • custom policies that preserve `` • programmatic DOM construction or mutation • low-level direct sanitizer/transform APIs Recommended action Upgrade to `justhtml` `1.17.0`. If users cannot upgrade immediately: • avoid preserving SVG or MathML for untrusted input • avoid preserving `` for untrusted input • avoid mutating programmatic DOM trees with untrusted `script`, `style`, or comment content • avoid mutating warmed policy internals or sanitizer caches Credit Discovered during an internal security review of `justhtml`.

Related

Weakness · CWE (4)

  • CWE-436 Interpretation Conflict weakness
  • CWE-471 Modification of Assumed-Immutable Data (MAID) weakness
  • CWE-79 Improper Neutralization of Input During Web Page Generation weakness
  • CWE-835 Loop with Unreachable Exit Condition weakness

References