Skip to main content

LazyHTML EUVDEUVD-2026-86828

| CVE-2026-92106 LOW
Cross-site Scripting (XSS) (CWE-79)
2026-09-25 EEF
2.3
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit encoded payload inside <svg><style>
  2. Delivery
    lazy_html parses, decoding char references
  3. Exploit
    allowlist filter sees only a text node
  4. Execution
    serialize emits style text unescaped
  5. Persist
    victim browser re-parses as live <img onerror>
  6. Impact
    script executes in victim session

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires a consuming application that (1) uses lazy_html 0.1.0-0.1.12 to parse attacker-supplied HTML, (2) filters the resulting document or tree with an element/attribute allowlist, and (3) serializes it back to HTML for display to a victim. The specific technical trigger is a style or script element placed inside SVG or MathML foreign content (e.g., <svg><style>), where character references are decoded on parse but the element is serialized as an HTML raw-text element, emitting its text unescaped. Limiting factors: the payload must survive as a plain text node (which is precisely why filters miss it), a victim must view the rendered output (UI:P/passive), and applications that do not run untrusted HTML through a lazy_html parse-filter-serialize pipeline are unaffected. lazy_html on its own - without such a downstream serialization-for-display flow - is not exploitable.

Impact

This is a genuinely low real-world risk despite being a sanitizer-bypass XSS. The CVSS 4.0 base score is only 2.3 (vendor/CNA-assigned via EEF), and the vector AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N tells a coherent story: network-reachable, no privileges, but an Attack Requirement (AT:P) and passive User Interaction (UI:P) both apply, and impact is confined to the subsequent (victim browser) system at Low integrity/confidentiality with no availability effect. The AT:P is well-justified - exploitation only matters when a consuming application specifically uses lazy_html to parse untrusted HTML, sanitize/filter it, and re-serialize it for display; lazy_html is a parsing library, not a server, so it has no attack surface on its own. No EPSS score, no CISA KEV listing, and no public PoC are present in the intelligence provided - consistent with a low-severity library flaw disclosed responsibly through a GitHub Security Advisory (GHSA-8rqp-v692-v82q) with a patch already available. There is no signal conflict: every source (low CVSS, library-only footprint, absence of exploitation data) points the same direction. The one nuance defenders should note is that the true impact depends entirely on the downstream application - in a filtering pipeline that trusts lazy_html's serialized output as 'clean', this mutation XSS fully defeats element/attribute allowlist filters because the payload lives in a text node no filter inspects, which could elevate practical impact above the raw 2.3 in a specific vulnerable consumer.

Exploit ScenarioDerived

An Elixir/Phoenix application accepts user-submitted HTML (e.g., a comment or rich-text field), parses it with lazy_html, applies an element/attribute allowlist filter, and serializes the tree back to HTML for display to other users. An attacker submits HTML containing <svg><style>&lt;/style&gt;&lt;img src=x onerror=...&gt;</style></svg>; the encoded markup passes the filter as an inert text node but, on the serialize round-trip, the style element is emitted as raw text, so the browser re-parses it as a live <img onerror> and executes attacker script in the victim's session. No public PoC is identified in the provided data, though the advisory describes the mechanism precisely.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 25, 2026

Mutation XSS in the Elixir library LazyHTML 0.1.0 through 0.1.12 lets attacker-supplied markup slip past element and attribute allowlist filters and turn into live HTML when the filtered document is serialized for display. The defect is in LazyHTML.to_html/2 and LazyHTML.Tree.to_html/2, which decide whether to escape an element's text from the tag name alone, so a style or script element inside SVG or MathML foreign content is parsed with character references decoded yet serialized as an unescaped HTML raw-text element; encoded markup such as &lt;/style&gt;&lt;img src=x onerror=...&gt; inside <svg><style> therefore closes the element on re-parse and executes. Exploitation is unauthenticated and remote but conditional: the consumer application must parse untrusted HTML with lazy_html, filter the document or tree, and serialize the result to a victim who views it (user interaction required), which keeps real-world impact low (scope change, low confidentiality and integrity, no availability impact); no public exploit identified at time of analysis, and the vendor has shipped a fix in 0.1.13.

RemediationAI

Vendor-released patch: upgrade lazy_html to 0.1.13 or later, which supersedes the 0.1.0 through 0.1.12 range; the fixing change is visible in the upstream commit https://github.com/dashbitco/lazy_html/commit/f32c7fd6223225b68bc8691c78b6d4a77972f1d5, with context in GHSA-8rqp-v692-v82q, and dependency updates should be pinned in mix.lock so the patched version is actually resolved. If an immediate bump is not possible, the most direct compensating control is to stop relying on lazy_html alone as the last stage of an untrusted-HTML pipeline: either run a second-pass sanitizer over the final serialized string rather than over the parsed tree, accepting the cost of double parsing, or drop SVG and MathML foreign content entirely before serialization, which removes the <svg><style> and <mathm><style> vectors but breaks legitimate embedded diagrams and math rendering. A narrower option is to disallow style, script and other raw-text or escapable-raw-text elements in foreign content within the allowlist and to reject any document that places them outside the HTML namespace, at the cost of rejecting some benign input, while applications that never parse untrusted HTML, filter it, and re-serialize it for display can treat lazy_html as not exploitable in their pipeline. Re-parsing serialized output with the same vulnerable version and no additional escaping provides no protection, since the flaw is in the round-trip itself rather than in a single pass.

Affected VersionsENISA

lazy_html 1dee15746c024916b3110af8b168c2f3b3065fbd <f32c7fd6223225b68bc8691c78b6d4a77972f1d5
lazy_html 0.1.0 <0.1.13

Affected Packages

euvd lazy_html fix: 0.1.13

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

This is a mutation XSS (mXSS) issue rooted in CWE-79, and its cause is a parser/serializer state mismatch rather than a missing check on any single tag or attribute. HTML parsing is context sensitive: inside SVG or MathML foreign content, the tokenizer treats style and script elements differently from the way it treats the same tag names in the HTML namespace, and character references in their text are decoded on the way in. lazy_html is an Elixir HTML parsing and serialization library that ships precompiled native code (its release workflow is built around elixir_make precompilation across Linux, macOS and Windows), and its serialization path (LazyHTML.to_html/2 and LazyHTML.Tree.to_html/2) selects the escaping strategy by tag name alone. That means a style or script element that arrived as SVG/MathML foreign content is written back out as if it were an ordinary HTML raw-text element, so its child text is emitted verbatim. The payload itself is a benign-looking plain text node at parse time, which is exactly why element and attribute filters in a sanitizing pipeline never see it; the danger only materializes on the second parse, when the previously inert encoded text closes the raw-text element and becomes live markup with event handlers. Affected artifacts are covered by CPE cpe:2.3:a:dashbitco:lazy_html across the 0.1.x range before 0.1.13, with vendor guidance in GHSA-8rqp-v692-v82q.

Know when Elixir gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (EEF) PRIMARY 2.3 LOW
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
vuln.today AI 4.7 MEDIUM

AC:H and UI:R reflect the required foreign-content round-trip and victim viewing; S:C because script runs in the victim browser; C:L/I:L, A:N for typical XSS impact.

3.1 AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
Low
Subsequent system: Integrity
Low
Subsequent system: Availability
None

DescriptionCVE.org

Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') vulnerability in dashbitco lazy_html allows mutation XSS via a parse and serialize round-trip of attacker-supplied HTML.

LazyHTML.to_html/2 and LazyHTML.Tree.to_html/2 decide whether to escape an element's text from its tag name alone. A style or script element inside SVG or MathML foreign content is parsed with character references decoded, but is serialized as an HTML raw-text element, so its text is emitted unescaped. Encoded markup such as &lt;/style&gt;&lt;img src=x onerror=...&gt; inside <svg><style> therefore closes the element on re-parse and becomes live markup. Applications that parse untrusted HTML with lazy_html, filter the document or tree, and serialize it for display are affected, since the payload is a plain text node that no element or attribute filter sees.

This issue affects lazy_html: from 0.1.0 before 0.1.13.

Threat Intelligence Overview

EPSS Score
0.5%
Top 57% exploitable
Prevalence
Low
Elixir-ecosystem HTML parsing library, niche language, limited production footprint
Data Quality
4 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

13
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +12
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

More in Elixir

View all
CVE-2026-54451 HIGH POC
8.2 Jul 15

Unbounded recursion in the Elixir `protobuf` Hex package (versions >= 0.8.0, < 0.16.1) lets unauthenticated remote attac

CVE-2026-91187 CRITICAL
9.3 Sep 24

Improper JWT signature verification in Dashbit's nimble_zta (0.1.2 up to but not including 0.1.3) lets an unauthenticate

CVE-2026-76949 CRITICAL
9.1 Sep 17

Session-swapping authentication bypass in the Elixir library AshAuthentication (versions 4.10.0 before 4.15.0 and 5.0.0-

CVE-2026-91039 CRITICAL
9.1 Sep 17

Authentication bypass in the Elixir library ash_authentication lets an attacker who operates one federated identity-prov

CVE-2026-88952 CRITICAL
9.1 Sep 17

Account takeover in AshAuthentication (Elixir/Ash) 4.14.0 through 4.14.x and 5.0.0-rc.10 through 5.0.0-rc.13 lets unauth

CVE-2026-77866 CRITICAL
9.0 Sep 15

Server-Side Request Forgery protection bypass in the Elixir safeurl library (versions 0.1.0 and later) allows unauthenti

CVE-2026-108529 HIGH
8.7 Oct 26

Unauthenticated remote CPU exhaustion in mtrudel Bandit's HTTP/2 server (versions before 1.14.0) is achievable by holdin

CVE-2026-110499 HIGH
8.7 Oct 26

Unbounded per-connection memory and CPU growth in the Elixir Bandit HTTP/2 server (0.3.6 up to 1.14.0) lets an unauthent

CVE-2026-111101 HIGH
8.7 Oct 26

Unauthenticated remote denial of service in the Elixir HTTP server Bandit (mtrudel/bandit) from 0.1.0 before 1.14.0 lets

CVE-2026-113436 HIGH
8.7 Oct 26

Unauthenticated remote attackers can consume disproportionate server CPU on Bandit (mtrudel/bandit, Elixir/Erlang) by se

CVE-2026-104635 HIGH
8.2 Oct 09

Memory-exhaustion denial of service in the elixir-protobuf library (protobuf) from 0.8.0 onward allows an unauthenticate

CVE-2026-94201 HIGH
8.2 Oct 05

Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy