Search

Find a vulnerability

Search criteria

    6 vulnerabilities by qcam

    CVE-2026-66295 (GCVE-0-2026-66295)

    Vulnerability from nvd – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    Processing instruction target and content emitted unescaped in Saxy encoder allows XML injection
    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.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 4aeb80e2acc318f57bd7453ad2eafd59101a90e0 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:processing_instruction/2"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:processing_instruction/2"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "4aeb80e2acc318f57bd7453ad2eafd59101a90e0",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe application must serialize a document containing a processing instruction whose target or content is derived from untrusted input, by passing a \u003ccode\u003e{:processing_instruction, name, content}\u003c/code\u003e node (typically built with \u003ccode\u003eSaxy.XML.processing_instruction/2\u003c/code\u003e) to \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e. Applications that never place dynamic data in processing instructions are not affected.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "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."
                }
              ],
              "value": "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."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSaxy\u0027s 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 \u003ccode\u003e\u0026lt;?\u003c/code\u003e and \u003ccode\u003e?\u0026gt;\u003c/code\u003e, so neither field is checked against the constraints the XML specification places on it.\u003c/p\u003e\n\u003cp\u003eBecause \u003ccode\u003e?\u0026gt;\u003c/code\u003e 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 \u003ccode\u003e\u0026lt;?\u003c/code\u003e keeps the encoder\u0027s 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 \u003ccode\u003eName\u003c/code\u003e production, which permits injection before the remainder of the processing instruction.\u003c/p\u003e\n\u003cp\u003eThe 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 \u003ccode\u003eSaxy.XML.processing_instruction/2\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Saxy\u0027s 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 `\u003c?` and `?\u003e`, so neither field is checked against the constraints the XML specification places on it.\n\nBecause `?\u003e` 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 `\u003c?` keeps the encoder\u0027s 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.\n\nThe 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "Saxy\u0027s 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 \u003c? and ?\u003e, so neither field is checked against the constraints the XML specification places on it.\n\nBecause ?\u003e 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 \u003c? keeps the encoder\u0027s 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.\n\nThe 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "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",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:45.577Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-f9r9-vrxq-g566"
            },
            {
              "name": "EEF CNA record for CVE-2026-66295",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66295.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66295",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66295"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 4aeb80e in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/4aeb80e2acc318f57bd7453ad2eafd59101a90e0"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Processing instruction target and content emitted unescaped in Saxy encoder allows XML injection",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDo not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing \u003ccode\u003e?\u0026gt;\u003c/code\u003e, and reject any target that does not match the XML \u003ccode\u003eName\u003c/code\u003e production or that equals \u003ccode\u003exml\u003c/code\u003e case-insensitively. Alternatively, carry the value in element content or an attribute instead, both of which the encoder escapes.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Do not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing `?\u003e`, 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."
                }
              ],
              "value": "Do not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing ?\u003e, 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."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66295",
        "datePublished": "2026-11-06T10:16:45.577Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:45.577Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66294 (GCVE-0-2026-66294)

    Vulnerability from nvd – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    XML injection in Saxy via unescaped CDATA section terminator
    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.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 71d99fae12f1d6596f5edb57b71f26ba854f4d33 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:cdata/1"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:cdata/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:cdata/1"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:cdata/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "71d99fae12f1d6596f5edb57b71f26ba854f4d33",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eXML injection in the Saxy XML encoder. \u003ccode\u003eSaxy.Encoder.cdata/1\u003c/code\u003e serializes a \u003ccode\u003e{:cdata, characters}\u003c/code\u003e node by wrapping the supplied characters between \u003ccode\u003e\u0026lt;![CDATA[\u003c/code\u003e and \u003ccode\u003e]]\u0026gt;\u003c/code\u003e and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters \u003ccode\u003e\u0026lt;\u003c/code\u003e, \u003ccode\u003e\u0026gt;\u003c/code\u003e, \u003ccode\u003e\u0026amp;\u003c/code\u003e, \u003ccode\u003e\"\u003c/code\u003e, and \u003ccode\u003e\u0027\u003c/code\u003e, 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 \u003ccode\u003e]]\u0026gt;\u003c/code\u003e substring is to split the section and rejoin it as \u003ccode\u003e]]]]\u0026gt;\u0026lt;![CDATA[\u0026gt;\u003c/code\u003e. Saxy neither performs that split nor rejects the substring.\u003c/p\u003e\n\u003cp\u003eAn application that renders untrusted text as CDATA, by building the node with \u003ccode\u003eSaxy.XML.cdata/1\u003c/code\u003e and serializing it with \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e, therefore lets an attacker terminate the section at a position of their choosing. Everything supplied after the \u003ccode\u003e]]\u0026gt;\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "XML injection in the Saxy XML encoder. `Saxy.Encoder.cdata/1` serializes a `{:cdata, characters}` node by wrapping the supplied characters between `\u003c![CDATA[` and `]]\u003e` and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters `\u003c`, `\u003e`, `\u0026`, `\"`, and `\u0027`, 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 `]]\u003e` substring is to split the section and rejoin it as `]]]]\u003e\u003c![CDATA[\u003e`. Saxy neither performs that split nor rejects the substring.\n\nAn 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 `]]\u003e` 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "XML injection in the Saxy XML encoder. Saxy.Encoder.cdata/1 serializes a {:cdata, characters} node by wrapping the supplied characters between \u003c![CDATA[ and ]]\u003e and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters \u003c, \u003e, \u0026, \", and \u0027, 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 ]]\u003e substring is to split the section and rejoin it as ]]]]\u003e\u003c![CDATA[\u003e. Saxy neither performs that split nor rejects the substring.\n\nAn 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 ]]\u003e 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "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",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:49.656Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-hq6g-j46w-wx72"
            },
            {
              "name": "EEF CNA record for CVE-2026-66294",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66294.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66294",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66294"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 71d99fa in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/71d99fae12f1d6596f5edb57b71f26ba854f4d33"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "XML injection in Saxy via unescaped CDATA section terminator",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eRender untrusted text as ordinary character data instead of CDATA, by passing a plain string or \u003ccode\u003eSaxy.XML.characters/1\u003c/code\u003e to the element builder. That encoder path escapes the XML metacharacters and preserves the same text content.\u003c/p\u003e\n\u003cp\u003eIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of \u003ccode\u003e]]\u0026gt;\u003c/code\u003e in the untrusted text with \u003ccode\u003e]]]]\u0026gt;\u0026lt;![CDATA[\u0026gt;\u003c/code\u003e and pass the result to \u003ccode\u003eSaxy.XML.cdata/1\u003c/code\u003e. Once the encoder wraps that payload, the output is the standard split encoding.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "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.\n\nIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of `]]\u003e` in the untrusted text with `]]]]\u003e\u003c![CDATA[\u003e` and pass the result to `Saxy.XML.cdata/1`. Once the encoder wraps that payload, the output is the standard split encoding."
                }
              ],
              "value": "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.\n\nIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of ]]\u003e in the untrusted text with ]]]]\u003e\u003c![CDATA[\u003e and pass the result to Saxy.XML.cdata/1. Once the encoder wraps that payload, the output is the standard split encoding."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66294",
        "datePublished": "2026-11-06T10:16:49.656Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:49.656Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66293 (GCVE-0-2026-66293)

    Vulnerability from nvd – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    XML comment injection in Saxy encoder via unescaped double hyphen
    Summary
    XML injection in the encoder of Saxy. Saxy.Encoder does not neutralize the -- sequence in XML comment content: escape_comment/2 returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single -, so neither an interior -- nor a full --> is escaped or rejected before the encoder wraps the content in the <!-- and --> delimiters. When an application serializes attacker-controlled text as a comment, through Saxy.XML.comment/1 or a raw {:comment, text} simple form child, the attacker can close the comment early with --> and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector. This issue affects saxy: from 0.7.0 before 1.7.0.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 6d12ee12b9e32e86ef598b3f3cafccd1840b2f41 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:comment/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:comment/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "6d12ee12b9e32e86ef598b3f3cafccd1840b2f41",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly applications that place untrusted text into an XML comment node are affected. The untrusted value must reach \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e or a raw \u003ccode\u003e{:comment, text}\u003c/code\u003e simple form child that is then serialized with \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e. Documents that are only parsed by Saxy never reach the encoder and are not a vector.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only applications that place untrusted text into an XML comment node are affected. The untrusted value must reach `Saxy.XML.comment/1` or a raw `{:comment, text}` simple form child that is then serialized with `Saxy.encode!/2` or `Saxy.encode_to_iodata!/2`. Documents that are only parsed by Saxy never reach the encoder and are not a vector."
                }
              ],
              "value": "Only applications that place untrusted text into an XML comment node are affected. The untrusted value must reach Saxy.XML.comment/1 or a raw {:comment, text} simple form child that is then serialized with Saxy.encode!/2 or Saxy.encode_to_iodata!/2. Documents that are only parsed by Saxy never reach the encoder and are not a vector."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eXML injection in the encoder of Saxy. \u003ccode\u003eSaxy.Encoder\u003c/code\u003e does not neutralize the \u003ccode\u003e--\u003c/code\u003e sequence in XML comment content: \u003ccode\u003eescape_comment/2\u003c/code\u003e returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single \u003ccode\u003e-\u003c/code\u003e, so neither an interior \u003ccode\u003e--\u003c/code\u003e nor a full \u003ccode\u003e--\u0026gt;\u003c/code\u003e is escaped or rejected before the encoder wraps the content in the \u003ccode\u003e\u0026lt;!--\u003c/code\u003e and \u003ccode\u003e--\u0026gt;\u003c/code\u003e delimiters.\u003c/p\u003e\n\u003cp\u003eWhen an application serializes attacker-controlled text as a comment, through \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e or a raw \u003ccode\u003e{:comment, text}\u003c/code\u003e simple form child, the attacker can close the comment early with \u003ccode\u003e--\u0026gt;\u003c/code\u003e and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "XML injection in the encoder of Saxy. `Saxy.Encoder` does not neutralize the `--` sequence in XML comment content: `escape_comment/2` returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single `-`, so neither an interior `--` nor a full `--\u003e` is escaped or rejected before the encoder wraps the content in the `\u003c!--` and `--\u003e` delimiters.\n\nWhen an application serializes attacker-controlled text as a comment, through `Saxy.XML.comment/1` or a raw `{:comment, text}` simple form child, the attacker can close the comment early with `--\u003e` and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "XML injection in the encoder of Saxy. Saxy.Encoder does not neutralize the -- sequence in XML comment content: escape_comment/2 returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single -, so neither an interior -- nor a full --\u003e is escaped or rejected before the encoder wraps the content in the \u003c!-- and --\u003e delimiters.\n\nWhen an application serializes attacker-controlled text as a comment, through Saxy.XML.comment/1 or a raw {:comment, text} simple form child, the attacker can close the comment early with --\u003e and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:42.053Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-mm3m-xwmf-v698"
            },
            {
              "name": "EEF CNA record for CVE-2026-66293",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66293.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66293",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66293"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 6d12ee1 in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/6d12ee12b9e32e86ef598b3f3cafccd1840b2f41"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "XML comment injection in Saxy encoder via unescaped double hyphen",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eReject or rewrite the \u003ccode\u003e--\u003c/code\u003e sequence in untrusted text before passing it to \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e, for example by replacing \u003ccode\u003e--\u003c/code\u003e with \u003ccode\u003e- -\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Reject or rewrite the `--` sequence in untrusted text before passing it to `Saxy.XML.comment/1`, for example by replacing `--` with `- -`.\n\nAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead."
                }
              ],
              "value": "Reject or rewrite the -- sequence in untrusted text before passing it to Saxy.XML.comment/1, for example by replacing -- with - -.\n\nAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66293",
        "datePublished": "2026-11-06T10:16:42.053Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:42.053Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66294 (GCVE-0-2026-66294)

    Vulnerability from cvelistv5 – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    XML injection in Saxy via unescaped CDATA section terminator
    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.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 71d99fae12f1d6596f5edb57b71f26ba854f4d33 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:cdata/1"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:cdata/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:cdata/1"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:cdata/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "71d99fae12f1d6596f5edb57b71f26ba854f4d33",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eXML injection in the Saxy XML encoder. \u003ccode\u003eSaxy.Encoder.cdata/1\u003c/code\u003e serializes a \u003ccode\u003e{:cdata, characters}\u003c/code\u003e node by wrapping the supplied characters between \u003ccode\u003e\u0026lt;![CDATA[\u003c/code\u003e and \u003ccode\u003e]]\u0026gt;\u003c/code\u003e and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters \u003ccode\u003e\u0026lt;\u003c/code\u003e, \u003ccode\u003e\u0026gt;\u003c/code\u003e, \u003ccode\u003e\u0026amp;\u003c/code\u003e, \u003ccode\u003e\"\u003c/code\u003e, and \u003ccode\u003e\u0027\u003c/code\u003e, 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 \u003ccode\u003e]]\u0026gt;\u003c/code\u003e substring is to split the section and rejoin it as \u003ccode\u003e]]]]\u0026gt;\u0026lt;![CDATA[\u0026gt;\u003c/code\u003e. Saxy neither performs that split nor rejects the substring.\u003c/p\u003e\n\u003cp\u003eAn application that renders untrusted text as CDATA, by building the node with \u003ccode\u003eSaxy.XML.cdata/1\u003c/code\u003e and serializing it with \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e, therefore lets an attacker terminate the section at a position of their choosing. Everything supplied after the \u003ccode\u003e]]\u0026gt;\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "XML injection in the Saxy XML encoder. `Saxy.Encoder.cdata/1` serializes a `{:cdata, characters}` node by wrapping the supplied characters between `\u003c![CDATA[` and `]]\u003e` and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters `\u003c`, `\u003e`, `\u0026`, `\"`, and `\u0027`, 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 `]]\u003e` substring is to split the section and rejoin it as `]]]]\u003e\u003c![CDATA[\u003e`. Saxy neither performs that split nor rejects the substring.\n\nAn 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 `]]\u003e` 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "XML injection in the Saxy XML encoder. Saxy.Encoder.cdata/1 serializes a {:cdata, characters} node by wrapping the supplied characters between \u003c![CDATA[ and ]]\u003e and passing the payload through byte for byte. The encoder\u0027s character-data and attribute-value paths escape the XML metacharacters \u003c, \u003e, \u0026, \", and \u0027, 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 ]]\u003e substring is to split the section and rejoin it as ]]]]\u003e\u003c![CDATA[\u003e. Saxy neither performs that split nor rejects the substring.\n\nAn 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 ]]\u003e 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "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",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:49.656Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-hq6g-j46w-wx72"
            },
            {
              "name": "EEF CNA record for CVE-2026-66294",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66294.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66294",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66294"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 71d99fa in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/71d99fae12f1d6596f5edb57b71f26ba854f4d33"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "XML injection in Saxy via unescaped CDATA section terminator",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eRender untrusted text as ordinary character data instead of CDATA, by passing a plain string or \u003ccode\u003eSaxy.XML.characters/1\u003c/code\u003e to the element builder. That encoder path escapes the XML metacharacters and preserves the same text content.\u003c/p\u003e\n\u003cp\u003eIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of \u003ccode\u003e]]\u0026gt;\u003c/code\u003e in the untrusted text with \u003ccode\u003e]]]]\u0026gt;\u0026lt;![CDATA[\u0026gt;\u003c/code\u003e and pass the result to \u003ccode\u003eSaxy.XML.cdata/1\u003c/code\u003e. Once the encoder wraps that payload, the output is the standard split encoding.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "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.\n\nIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of `]]\u003e` in the untrusted text with `]]]]\u003e\u003c![CDATA[\u003e` and pass the result to `Saxy.XML.cdata/1`. Once the encoder wraps that payload, the output is the standard split encoding."
                }
              ],
              "value": "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.\n\nIf a CDATA section is required, split the terminator in application code before building the node: replace every occurrence of ]]\u003e in the untrusted text with ]]]]\u003e\u003c![CDATA[\u003e and pass the result to Saxy.XML.cdata/1. Once the encoder wraps that payload, the output is the standard split encoding."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66294",
        "datePublished": "2026-11-06T10:16:49.656Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:49.656Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66295 (GCVE-0-2026-66295)

    Vulnerability from cvelistv5 – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    Processing instruction target and content emitted unescaped in Saxy encoder allows XML injection
    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.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 4aeb80e2acc318f57bd7453ad2eafd59101a90e0 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:processing_instruction/2"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.Encoder\u0027:encode_to_iodata/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:processing_instruction/2"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "4aeb80e2acc318f57bd7453ad2eafd59101a90e0",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eThe application must serialize a document containing a processing instruction whose target or content is derived from untrusted input, by passing a \u003ccode\u003e{:processing_instruction, name, content}\u003c/code\u003e node (typically built with \u003ccode\u003eSaxy.XML.processing_instruction/2\u003c/code\u003e) to \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e. Applications that never place dynamic data in processing instructions are not affected.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "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."
                }
              ],
              "value": "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."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eSaxy\u0027s 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 \u003ccode\u003e\u0026lt;?\u003c/code\u003e and \u003ccode\u003e?\u0026gt;\u003c/code\u003e, so neither field is checked against the constraints the XML specification places on it.\u003c/p\u003e\n\u003cp\u003eBecause \u003ccode\u003e?\u0026gt;\u003c/code\u003e 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 \u003ccode\u003e\u0026lt;?\u003c/code\u003e keeps the encoder\u0027s 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 \u003ccode\u003eName\u003c/code\u003e production, which permits injection before the remainder of the processing instruction.\u003c/p\u003e\n\u003cp\u003eThe 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 \u003ccode\u003eSaxy.XML.processing_instruction/2\u003c/code\u003e 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.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Saxy\u0027s 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 `\u003c?` and `?\u003e`, so neither field is checked against the constraints the XML specification places on it.\n\nBecause `?\u003e` 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 `\u003c?` keeps the encoder\u0027s 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.\n\nThe 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "Saxy\u0027s 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 \u003c? and ?\u003e, so neither field is checked against the constraints the XML specification places on it.\n\nBecause ?\u003e 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 \u003c? keeps the encoder\u0027s 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.\n\nThe 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.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "NONE",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "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",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:45.577Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-f9r9-vrxq-g566"
            },
            {
              "name": "EEF CNA record for CVE-2026-66295",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66295.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66295",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66295"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 4aeb80e in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/4aeb80e2acc318f57bd7453ad2eafd59101a90e0"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "Processing instruction target and content emitted unescaped in Saxy encoder allows XML injection",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eDo not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing \u003ccode\u003e?\u0026gt;\u003c/code\u003e, and reject any target that does not match the XML \u003ccode\u003eName\u003c/code\u003e production or that equals \u003ccode\u003exml\u003c/code\u003e case-insensitively. Alternatively, carry the value in element content or an attribute instead, both of which the encoder escapes.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Do not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing `?\u003e`, 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."
                }
              ],
              "value": "Do not place untrusted data in processing instructions. Where a dynamic value is unavoidable, validate it before building the node: reject any content containing ?\u003e, 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."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66295",
        "datePublished": "2026-11-06T10:16:45.577Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:45.577Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }

    CVE-2026-66293 (GCVE-0-2026-66293)

    Vulnerability from cvelistv5 – Published: 2026-11-06 10:16 – Updated: 2026-11-06 10:16
    VLAI
    Title
    XML comment injection in Saxy encoder via unescaped double hyphen
    Summary
    XML injection in the encoder of Saxy. Saxy.Encoder does not neutralize the -- sequence in XML comment content: escape_comment/2 returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single -, so neither an interior -- nor a full --> is escaped or rejected before the encoder wraps the content in the <!-- and --> delimiters. When an application serializes attacker-controlled text as a comment, through Saxy.XML.comment/1 or a raw {:comment, text} simple form child, the attacker can close the comment early with --> and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector. This issue affects saxy: from 0.7.0 before 1.7.0.
    CWE
    Assigner
    EEF CNA under the mitre root
    CNA scorecard A 97/100 over 351 records in the last 180 days details
    Impacted products
    Vendor Product Version
    qcam saxy Affected: 0.7.0 , < 1.7.0 (semver)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    qcam saxy Affected: 7266632e9407842f28ffac254c56dc41210a5690 , < 6d12ee12b9e32e86ef598b3f3cafccd1840b2f41 (git)
        cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
    Create a notification for this product.
    Show details on NVD website

    {
      "containers": {
        "cna": {
          "affected": [
            {
              "collectionURL": "https://repo.hex.pm",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "saxy",
              "packageURL": "pkg:hex/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:comment/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "1.7.0",
                  "status": "affected",
                  "version": "0.7.0",
                  "versionType": "semver"
                }
              ]
            },
            {
              "collectionURL": "https://github.com",
              "cpes": [
                "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*"
              ],
              "defaultStatus": "unaffected",
              "modules": [
                "\u0027Elixir.Saxy\u0027",
                "\u0027Elixir.Saxy.Encoder\u0027",
                "\u0027Elixir.Saxy.XML\u0027"
              ],
              "packageName": "qcam/saxy",
              "packageURL": "pkg:github/qcam/saxy",
              "product": "saxy",
              "programFiles": [
                "lib/saxy.ex",
                "lib/saxy/encoder.ex",
                "lib/saxy/xml.ex"
              ],
              "programRoutines": [
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy\u0027:encode_to_iodata!/2"
                },
                {
                  "name": "\u0027Elixir.Saxy.XML\u0027:comment/1"
                }
              ],
              "repo": "https://github.com/qcam/saxy",
              "vendor": "qcam",
              "versions": [
                {
                  "lessThan": "6d12ee12b9e32e86ef598b3f3cafccd1840b2f41",
                  "status": "affected",
                  "version": "7266632e9407842f28ffac254c56dc41210a5690",
                  "versionType": "git"
                }
              ]
            }
          ],
          "configurations": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eOnly applications that place untrusted text into an XML comment node are affected. The untrusted value must reach \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e or a raw \u003ccode\u003e{:comment, text}\u003c/code\u003e simple form child that is then serialized with \u003ccode\u003eSaxy.encode!/2\u003c/code\u003e or \u003ccode\u003eSaxy.encode_to_iodata!/2\u003c/code\u003e. Documents that are only parsed by Saxy never reach the encoder and are not a vector.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Only applications that place untrusted text into an XML comment node are affected. The untrusted value must reach `Saxy.XML.comment/1` or a raw `{:comment, text}` simple form child that is then serialized with `Saxy.encode!/2` or `Saxy.encode_to_iodata!/2`. Documents that are only parsed by Saxy never reach the encoder and are not a vector."
                }
              ],
              "value": "Only applications that place untrusted text into an XML comment node are affected. The untrusted value must reach Saxy.XML.comment/1 or a raw {:comment, text} simple form child that is then serialized with Saxy.encode!/2 or Saxy.encode_to_iodata!/2. Documents that are only parsed by Saxy never reach the encoder and are not a vector."
            }
          ],
          "cpeApplicability": [
            {
              "nodes": [
                {
                  "cpeMatch": [
                    {
                      "criteria": "cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*",
                      "versionEndExcluding": "1.7.0",
                      "versionStartIncluding": "0.7.0",
                      "vulnerable": true
                    }
                  ],
                  "negate": false,
                  "operator": "OR"
                }
              ],
              "operator": "AND"
            }
          ],
          "credits": [
            {
              "lang": "en",
              "type": "finder",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "reporter",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation developer",
              "value": "Peter Ullrich"
            },
            {
              "lang": "en",
              "type": "remediation reviewer",
              "value": "C\u1ea9m Hu\u1ef3nh"
            },
            {
              "lang": "en",
              "type": "analyst",
              "value": "Jonatan M\u00e4nnchen / EEF"
            },
            {
              "lang": "en",
              "type": "coordinator",
              "value": "Peter Ullrich"
            }
          ],
          "descriptions": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eXML injection in the encoder of Saxy. \u003ccode\u003eSaxy.Encoder\u003c/code\u003e does not neutralize the \u003ccode\u003e--\u003c/code\u003e sequence in XML comment content: \u003ccode\u003eescape_comment/2\u003c/code\u003e returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single \u003ccode\u003e-\u003c/code\u003e, so neither an interior \u003ccode\u003e--\u003c/code\u003e nor a full \u003ccode\u003e--\u0026gt;\u003c/code\u003e is escaped or rejected before the encoder wraps the content in the \u003ccode\u003e\u0026lt;!--\u003c/code\u003e and \u003ccode\u003e--\u0026gt;\u003c/code\u003e delimiters.\u003c/p\u003e\n\u003cp\u003eWhen an application serializes attacker-controlled text as a comment, through \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e or a raw \u003ccode\u003e{:comment, text}\u003c/code\u003e simple form child, the attacker can close the comment early with \u003ccode\u003e--\u0026gt;\u003c/code\u003e and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\u003c/p\u003e\n\u003cp\u003eThis issue affects saxy: from 0.7.0 before 1.7.0.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "XML injection in the encoder of Saxy. `Saxy.Encoder` does not neutralize the `--` sequence in XML comment content: `escape_comment/2` returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single `-`, so neither an interior `--` nor a full `--\u003e` is escaped or rejected before the encoder wraps the content in the `\u003c!--` and `--\u003e` delimiters.\n\nWhen an application serializes attacker-controlled text as a comment, through `Saxy.XML.comment/1` or a raw `{:comment, text}` simple form child, the attacker can close the comment early with `--\u003e` and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
                }
              ],
              "value": "XML injection in the encoder of Saxy. Saxy.Encoder does not neutralize the -- sequence in XML comment content: escape_comment/2 returns the comment binary unchanged in every clause and only appends a space when the comment ends in a single -, so neither an interior -- nor a full --\u003e is escaped or rejected before the encoder wraps the content in the \u003c!-- and --\u003e delimiters.\n\nWhen an application serializes attacker-controlled text as a comment, through Saxy.XML.comment/1 or a raw {:comment, text} simple form child, the attacker can close the comment early with --\u003e and inject arbitrary sibling markup into the serialized document. A downstream parser then sees elements, attributes, and text that the application never built. Where the document is rendered as HTML or SVG, the injected markup executes as stored cross-site scripting; where it is consumed by another XML processor, the attacker can forge data that the producing application never emitted. Documents that Saxy only parses are not a vector.\n\nThis issue affects saxy: from 0.7.0 before 1.7.0."
            }
          ],
          "impacts": [
            {
              "capecId": "CAPEC-250",
              "descriptions": [
                {
                  "lang": "en",
                  "value": "CAPEC-250 XML Injection"
                }
              ]
            }
          ],
          "metrics": [
            {
              "cvssV4_0": {
                "Automatable": "NOT_DEFINED",
                "Recovery": "NOT_DEFINED",
                "Safety": "NOT_DEFINED",
                "attackComplexity": "LOW",
                "attackRequirements": "PRESENT",
                "attackVector": "LOCAL",
                "baseScore": 2.1,
                "baseSeverity": "LOW",
                "privilegesRequired": "NONE",
                "providerUrgency": "NOT_DEFINED",
                "subAvailabilityImpact": "NONE",
                "subConfidentialityImpact": "LOW",
                "subIntegrityImpact": "LOW",
                "userInteraction": "NONE",
                "valueDensity": "NOT_DEFINED",
                "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N",
                "version": "4.0",
                "vulnAvailabilityImpact": "NONE",
                "vulnConfidentialityImpact": "NONE",
                "vulnIntegrityImpact": "LOW",
                "vulnerabilityResponseEffort": "NOT_DEFINED"
              },
              "format": "CVSS",
              "scenarios": [
                {
                  "lang": "en",
                  "value": "GENERAL"
                }
              ]
            }
          ],
          "problemTypes": [
            {
              "descriptions": [
                {
                  "cweId": "CWE-91",
                  "description": "CWE-91 XML Injection",
                  "lang": "en",
                  "type": "CWE"
                }
              ]
            }
          ],
          "providerMetadata": {
            "dateUpdated": "2026-11-06T10:16:42.053Z",
            "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
            "shortName": "EEF"
          },
          "references": [
            {
              "tags": [
                "vendor-advisory",
                "related"
              ],
              "url": "https://github.com/qcam/saxy/security/advisories/GHSA-mm3m-xwmf-v698"
            },
            {
              "name": "EEF CNA record for CVE-2026-66293",
              "tags": [
                "related"
              ],
              "url": "https://cna.erlef.org/cves/CVE-2026-66293.html"
            },
            {
              "name": "OSV record EEF-CVE-2026-66293",
              "tags": [
                "related"
              ],
              "url": "https://osv.dev/vulnerability/EEF-CVE-2026-66293"
            },
            {
              "name": "Introducing commit 7266632 in qcam/saxy",
              "tags": [
                "related"
              ],
              "url": "https://github.com/qcam/saxy/commit/7266632e9407842f28ffac254c56dc41210a5690"
            },
            {
              "name": "Fix commit 6d12ee1 in qcam/saxy",
              "tags": [
                "patch"
              ],
              "url": "https://github.com/qcam/saxy/commit/6d12ee12b9e32e86ef598b3f3cafccd1840b2f41"
            }
          ],
          "source": {
            "discovery": "EXTERNAL"
          },
          "title": "XML comment injection in Saxy encoder via unescaped double hyphen",
          "workarounds": [
            {
              "lang": "en",
              "supportingMedia": [
                {
                  "base64": false,
                  "type": "text/html",
                  "value": "\u003cp\u003eReject or rewrite the \u003ccode\u003e--\u003c/code\u003e sequence in untrusted text before passing it to \u003ccode\u003eSaxy.XML.comment/1\u003c/code\u003e, for example by replacing \u003ccode\u003e--\u003c/code\u003e with \u003ccode\u003e- -\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead.\u003c/p\u003e"
                },
                {
                  "base64": false,
                  "type": "text/markdown",
                  "value": "Reject or rewrite the `--` sequence in untrusted text before passing it to `Saxy.XML.comment/1`, for example by replacing `--` with `- -`.\n\nAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead."
                }
              ],
              "value": "Reject or rewrite the -- sequence in untrusted text before passing it to Saxy.XML.comment/1, for example by replacing -- with - -.\n\nAlternatively, stop emitting untrusted data as XML comments. Comments carry no semantic payload for consumers, so the text can usually be moved into an element or a CDATA section instead."
            }
          ]
        }
      },
      "cveMetadata": {
        "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "assignerShortName": "EEF",
        "cveId": "CVE-2026-66293",
        "datePublished": "2026-11-06T10:16:42.053Z",
        "dateReserved": "2026-07-24T14:10:01.114Z",
        "dateUpdated": "2026-11-06T10:16:42.053Z",
        "state": "PUBLISHED"
      },
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }