EEF-CVE-2026-66294

Source
https://cna.erlef.org/osv/EEF-CVE-2026-66294.html
Import Source
https://cna.erlef.org/osv/EEF-CVE-2026-66294.json
JSON Data
https://api.osv.dev/v1/vulns/EEF-CVE-2026-66294
Aliases
  • CVE-2026-66294
  • GHSA-hq6g-j46w-wx72
Published
2026-11-06T10:16:49Z
Modified
2026-11-06T10:41:07Z
Severity
  • 2.1 (Low) CVSS_V4 - CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:L/SA:N CVSS Calculator
Summary
XML injection in Saxy via unescaped CDATA section terminator
Details

Summary

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.

Workarounds

Render untrusted text as ordinary character data instead of CDATA, by passing a plain string or Saxy.XML.characters/1 to the element builder. That encoder path escapes the XML metacharacters and preserves the same text content.

If a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of ]]> in the untrusted text with ]]]]><![CDATA[> and pass the result to Saxy.XML.cdata/1. Once the encoder wraps that payload, the output is the standard split encoding.

Database specific
{
    "capec_ids": [
        "CAPEC-250"
    ],
    "cpe_ids": [
        "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
    ],
    "cwe_ids": [
        "CWE-91"
    ]
}
References
Credits
    • Peter Ullrich - FINDER
    • Peter Ullrich - REPORTER
    • Peter Ullrich - REMEDIATION_DEVELOPER
    • Cẩm Huỳnh - REMEDIATION_REVIEWER
    • Jonatan Männchen / EEF - ANALYST
    • Peter Ullrich - COORDINATOR

Affected packages

Hex / saxy

Package

Name
saxy
Purl
pkg:hex/saxy

Affected ranges

Type
SEMVER
Events
Introduced
0.7.0
Fixed
1.7.0

Affected versions

0.*
0.7.0
0.8.0
0.9.0
0.9.1
0.10.0
1.*
1.0.0
1.1.0
1.2.0
1.2.1
1.2.2
1.3.0
1.4.0
1.5.0
1.6.0
1.6.1

Database specific

source
"https://cna.erlef.org/osv/EEF-CVE-2026-66294.json"

Git / github.com/qcam/saxy

Affected ranges

Type
GIT
Repo
https://github.com/qcam/saxy
Events

Affected versions

v0.*
v0.10.0
v0.7.0
v0.8.0
v0.9.1
v1.*
v1.0.0
v1.1.0
v1.2.0
v1.2.1
v1.2.2
v1.3.0
v1.4.0
v1.5.0
v1.6.0
v1.6.1

Database specific

source
"https://cna.erlef.org/osv/EEF-CVE-2026-66294.json"