XML injection in Saxy via unescaped CDATA section terminator
Key facts
- Attack vector
- Local
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- Present
- Impact type
- —
- Confidentiality · integrity · availability
- None · Low · None
- Fix status
- Fixed
Attack profile from CVSS 4.0 · CNA. Fix status from CNA.
Summary
The Saxy XML encoder for Elixir, from 0.7.0 before 1.7.0, does not neutralize the ]]> sequence in CDATA sections. Saxy.Encoder.cdata/1 wraps supplied text in CDATA markers without splitting the section, so a terminator in untrusted text ends the section early. A local user with low privileges can inject arbitrary sibling elements and attributes (CWE-91) into documents an application generates from untrusted text, when that text is placed in a CDATA node. Applications that never place untrusted text in CDATA nodes are not affected.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the CNA
XML injection in the Saxy XML encoder. Saxy.Encoder.cdata/1 serializes a {:cdata, characters} node by wrapping the supplied characters between <![CDATA[ and ]]> and passing the payload through byte for byte. The encoder's character-data and attribute-value paths escape the XML metacharacters <, >, &, ", and ', but the CDATA path applies no neutralization at all. XML provides no character escaping mechanism inside a CDATA section, so the only correct way to represent a ]]> substring is to split the section and rejoin it as ]]]]><![CDATA[>. Saxy neither performs that split nor rejects the substring. An application that renders untrusted text as CDATA, by building the node with Saxy.XML.cdata/1 and serializing it with Saxy.encode!/2 or Saxy.encode_to_iodata!/2, therefore lets an attacker terminate the section at a position of their choosing. Everything supplied after the ]]> is emitted outside any CDATA context and is parsed as markup, so a single attacker-controlled text field becomes attacker-controlled document structure: arbitrary sibling elements and attributes that the application never built. Downstream consumers of the serialized document accept the injected markup as genuine. Services that generate SOAP envelopes, RSS or Atom feeds, sitemaps, SVG, or XML exports from user-supplied content can have trusted fields forged or overridden. Applications that never place untrusted text in a CDATA node are not affected. This issue affects saxy: from 0.7.0 before 1.7.0.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
Remediation
Upgrade saxy to version 1.7.0 or later, which fixes the issue for the saxy package.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
- Fix · CNA saxy (qcam) Fixed in 1.7.0
Fixed in the same release
Records fixed by the same vendor advisory or release, as the CNA lists them.
- Release ·
qcam saxy 1.7.0
3 records Highest priority Priority LOW 3 LOW
Other records, highest priority first
- TI-2026-85813 Unescaped processing instructions in Saxy encoder allow XML injectionPriority LOW 10
- TI-2026-85811 XML comment injection in Saxy encoder lets attackers inject markupPriority LOW 10
Timeline
- 2026-11-06 Threatist record created from CVE-2026-66294
- 2026-11-06 Alias added: GHSA-w2hc-m8qc-7hgm
References
More qcam vulnerabilities
- TI-2026-85813 Unescaped processing instructions in Saxy encoder allow XML injection CVSS 4.0LOW 2.1
- TI-2026-85811 XML comment injection in Saxy encoder lets attackers inject markup CVSS 4.0LOW 2.1
Sources
- CVE-2026-66294 · CVE Program
- CVE-2026-66294 · NVD
- FIRST EPSS
- GHSA-w2hc-m8qc-7hgm · GitHub Advisory Database · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences