Am I affected?

type your saxy version to check

Description

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.

Weaknesses & attack patterns

Weakness

CWE-91 · XML Injection in catalog → MITRE ↗

Attack patterns

CAPEC-250 · XML Injection MITRE ↗

Affected — Hex / saxy Hex.pm ↗ Repository ↗

≥ 0.7.0 < 1.7.0 affected
every other version: unaffected
cpe cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
version type semver
modules · source files · routines
modules 'Elixir.Saxy' · 'Elixir.Saxy.Encoder' · 'Elixir.Saxy.XML'
source files lib/saxy.ex · lib/saxy/encoder.ex · lib/saxy/xml.ex
routines 'Elixir.Saxy':encode!/2 · 'Elixir.Saxy':encode_to_iodata!/2 · 'Elixir.Saxy.XML':comment/1

Affected — GitHub / qcam/saxy Repository ↗

≥ 7266632 < 6d12ee1 affected
every other version: unaffected
cpe cpe:2.3:a:qcam:saxy:*:*:*:*:*:*:*:*
version type git
modules · source files · routines
modules 'Elixir.Saxy' · 'Elixir.Saxy.Encoder' · 'Elixir.Saxy.XML'
source files lib/saxy.ex · lib/saxy/encoder.ex · lib/saxy/xml.ex
routines 'Elixir.Saxy':encode!/2 · 'Elixir.Saxy':encode_to_iodata!/2 · 'Elixir.Saxy.XML':comment/1

Workarounds

Reject or rewrite the -- sequence in untrusted text before passing it to Saxy.XML.comment/1, for example by replacing -- with - -.

Alternatively, 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.

Configurations

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.

References

Credits

Peter Ullrich Finder Reporter Remediation developer Coordinator
Cẩm Huỳnh Remediation reviewer
Jonatan Männchen / EEF Analyst

CVSS breakdown

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
« All CVEs