justhtml
A pure Python HTML5 parser that just works. No C extensions to compile. No system dependencies to install. No complex API to learn.
Activity
- Latest release
- 2w ago
- Total releases
- 90
- Cadence
- ~3 days
- Last 12 months
- 90
Reach
- Stars
- 1.2k
Details
- License
- custom
- First release
- Nov 30, 2025
| Version | Released | |
|---|---|---|
3.11.2
patch
| ||
3.11.1
patch
| ||
3.11.0
minor
| ||
3.10.1
patch
| ||
3.10.0
minor
| ||
3.9.0
minor
| ||
3.8.0
minor
| ||
3.7.0
minor
| ||
3.6.1
patch
| ||
3.6.0
minor
| ||
3.5.0
minor
| ||
3.4.0
minor
| ||
3.3.0
minor
| ||
3.2.0
minor
| ||
3.1.0
minor
| ||
3.0.0
major
| ||
2.4.1
patch
| ||
2.4.0
minor
| ||
2.3.0
minor
| ||
2.2.0
minor
| ||
2.1.0
minor
| ||
2.0.0
major
| ||
1.23.0
minor
| ||
1.22.0
minor
| ||
1.21.0
minor
1 CVE
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev | ||
1.20.0
minor
1 CVE
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev | ||
1.19.0
minor
1 CVE
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev | ||
1.18.0
minor
1 CVE
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev | ||
1.17.0
minor
2 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev | ||
1.16.0
minor
3 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.15.0
minor
4 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.14.0
minor
5 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.13.0
minor
6 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.12.0
minor
6 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.11.0
minor
8 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.10.0
minor
8 CVEs
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.9.1
patch
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.9.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.8.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.7.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.6.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.5.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.4.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.3.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.2.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.1.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
1.0.0
major
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
0.40.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
0.39.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
| ||
0.38.0
minor
9 CVEs
CVE-2026-9769
PYSEC-2026-3854
GHSA-v7cf-c9rm-wm3j
Sep 10, 2026
Uncontrolled recursion DoS in JustHTML() via deeply nested HTML
High
Network
Low
None
Summaryjusthtml through 1.9.1 allows denial of service via deeply nested HTML. During parsing, Details
When the DOM tree depth exceeds CPython's default recursion limit (1000), this raises an unhandled
Deeply nested DOM trees can be produced by nesting Additional recursive functions are affected on already-parsed deep trees:
Note: the library already uses iterative traversal in several comparable functions (e.g., PoC
Test environment: CPython 3.14.3, macOS ARM64 (Apple Silicon), justhtml 1.9.1, default recursion limit (1000) | Input | Size | Result |
|-------|------|--------|
| The error occurs with both ImpactAn attacker who can supply HTML for parsing can trigger an unhandled Suggested FixConvert the recursive tree traversal functions to iterative implementations using an explicit stack. Example for
The same conversion should be applied to Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 42 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.10.0
References
Updated Sep 10, 2026 · Source: OSV.dev
CVE-2026-77088
GHSA-jf6w-2mvx-633j
Jun 25, 2026
justhtml: to_markdown() code-span blank-line breakout enables XSS
6.1
/ 10
Medium
Network
Low
None
Required
Changed
Low
Low
None
justhtml: to_markdown() code-span blank-line breakout enables XSSSummaryIn Details
The inline code-span helper only sizes the backtick fence; it never accounts for block boundaries:
The element's text is taken verbatim (
A Markdown inline code span is an inline construct and cannot span a block boundary: a blank line ends the paragraph, the opening backticks are left unmatched (literal), and everything after the blank line is parsed as ordinary Markdown — independent of fence length. Because CommonMark passes raw inline HTML through by default, text such as Reachability with default settings: Two in-repo asymmetries confirm this is an unguarded path rather than intended behavior:
PoCSelf-contained, runs entirely in Docker against the pinned PyPI release. Static by default: the rendered HTML is parsed to show a live handler-bearing element materializes; no JavaScript is executed on the default path.
Build and run:
Observed output (
The exploit is byte-identical to the inert control plus a single blank line
( Optional execution confirmation (
ImpactThis is a cross-site scripting vulnerability (CWE-79). It affects any application that follows the documented pipeline: sanitize untrusted HTML with An attacker only needs to control HTML text inside a Severity: CVSS 3.1 6.1 (Moderate),
Recommended fixDo not represent text containing a block boundary as an inline code span. In Resources
Affected versions
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.20.0
+ 44 more Show less
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.40.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.18.0
1.19.0
1.2.0
1.20.0
1.21.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.22.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-4671
GHSA-r8cj-3554-33mr
May 08, 2026
justhtml introduces denial-of-service hardening
Low
Summary
These issues are availability concerns. They do not allow script execution, data disclosure, or sanitizer bypass by themselves. Affected versions
Fixed version
ImpactCSS selector handlingApplications that evaluate attacker-controlled selector strings, or that run selector-based transform pipelines over attacker-controlled documents, could consume disproportionate CPU or memory. The affected selector patterns included oversized selectors, large selector lists, oversized compound selectors, long combinator chains, deeply nested functional pseudo-classes such as Programmatically constructed malformed DOM graphs could also trigger non-terminating or duplicate traversal in some selector paths, including cyclic/shared child graphs, cyclic parent chains, and cyclic text traversal for LinkificationAttacker-controlled text containing punctuation-heavy input or URL candidates ending in long runs of unmatched closing brackets could cause repeated rescanning and consume disproportionate CPU when linkification was enabled. Default configurationOrdinary sanitization of parsed HTML with the default The main risk areas are:
Fixes in 1.18.0
CWE mapping
Recommended actionUpgrade to If users cannot upgrade immediately:
CreditDiscovered during an internal security review of Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
+ 50 more Show less
0.2.0
0.20.0
0.21.0
0.22.0
0.23.0
0.24.0
0.25.0
0.26.0
0.27.0
0.28.0
0.29.0
0.3.0
0.30.0
0.31.0
0.32.0
0.33.0
0.34.0
0.35.0
0.36.0
0.37.0
0.38.0
0.39.0
0.4.0
0.40.0
0.5.0
0.5.1
0.5.2
0.6.0
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
1.7.0
1.8.0
1.9.0
1.9.1
Fixed in
1.18.0
References Updated Aug 24, 2026 · Source: OSV.dev
CVE-2026-6827
GHSA-vrx2-77f2-ww34
Apr 22, 2026
justhtml has sanitization bypass in custom policies and programmatic DOM
Medium
Network
Low
None
Summary
Most of these issues affected advanced or custom configurations rather than the default safe path. Affected versions
Fixed version
ImpactCustom SVG / MathML sanitization policiesCustom policies that preserved foreign namespaces could allow dangerous content to survive sanitization, including:
These issues affected:
Preserved
|