EEF-CVE-2026-66295

    Dashboard / Vulnerabilities / EEF-CVE-2026-66295

    EEF-CVE-2026-66295

    Published: 6 Nov 2026Last Modified: 6 Nov 2026

    Summary: Processing instruction target and content emitted unescaped in Saxy encoder allows XML injection

    Details: ## Summary Saxy's XML encoder writes the target and the content of a processing instruction into the output document verbatim, without validation or escaping. The encoder builds the construct by concatenating both fields between `<?` and `?>`, so neither field is checked against the constraints the XML specification places on it. Because `?>` terminates a processing instruction, a target or content value containing that sequence closes the construct at a position the attacker chooses. Everything the attacker writes after it is emitted as ordinary markup at document level, which allows arbitrary elements, attributes, and further processing instructions to be injected into the serialized document. Appending a matching `<?` keeps the encoder's own terminator well-formed, so the result still parses and the injection is silent rather than a visible corruption. The target is additionally unconstrained by the XML `Name` production, which permits injection before the remainder of the processing instruction. The result is XML injection into a serialized document: the tree the application asks Saxy to encode and the tree a downstream parser reads back are no longer the same. Character data, attribute values, and comments are all escaped by the encoder, so processing instructions are the one construct that passes user bytes through untouched. Since `Saxy.XML.processing_instruction/2` is a documented public builder, an application inherits the flaw without misusing the API. The consequences depend on what consumes the XML: forged records in a feed or export read by another system, injected stylesheet or rendering directives, or active content where the output is served to a browser as XML or SVG. This issue affects saxy: from 0.7.0 before 1.7.0. ## Workarounds Do not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing `?>`, and reject any target that does not match the XML `Name` production or that equals `xml` case-insensitively. Alternatively, carry the value in element content or an attribute instead, both of which the encoder escapes. ## Configurations The application must serialize a document containing a processing instruction whose target or content is derived from untrusted input, by passing a `{:processing_instruction, name, content}` node (typically built with `Saxy.XML.processing_instruction/2`) to `Saxy.encode!/2` or `Saxy.encode_to_iodata!/2`. Applications that never place dynamic data in processing instructions are not affected.

    Affected packages

    Package

    Name: saxy

    Purl: pkg:hex/saxy

    Affected ranges

    Type: SEMVER

    Events:

    Introduced- 0.7.0
    Fixed -1.7.0

    Affected versions

    0.10.0

    Common Vulnerability Scoring System

    Attack Vector
    Network
    Adjacent
    Local
    Physical
    Privileges Required
    None
    Low
    High
    User Interaction
    None
    Required
    Scope
    Unchanged
    Changed
    Confidentiality
    None
    Low
    High
    Integrity
    None
    Low
    High
    Availability
    None
    Low
    High
    EEF-CVE-2026-66295 | CVE-DB