{
  "title": "svg-sanitizer: UTF-16 input bypasses DOCTYPE stripping (incomplete fix of GHSA-9rjx-3jch-6vjf)",
  "category": "security",
  "type": "xss",
  "severity": "medium",
  "cvss": {
    "vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N",
    "score": 6.1
  },
  "ecosystem": "php",
  "project": {
    "owner": "darylldoyle",
    "repo": "svg-sanitizer",
    "url": "https://github.com/darylldoyle/svg-sanitizer"
  },
  "affected_versions": [
    "enshrined/svg-sanitize <= 1.0.0"
  ],
  "status": "published",
  "disclosure": {
    "channel": "pvr",
    "ghsa_id": "GHSA-vjg7-f2wj-gqqh",
    "cve_id": null,
    "url": "https://github.com/darylldoyle/svg-sanitizer/security/advisories/GHSA-vjg7-f2wj-gqqh",
    "reported_at": "2026-10-08T11:13:23+03:00",
    "published_at": "2026-10-19T15:09:19+03:00",
    "accepted_at": "2026-10-16T18:04:00+03:00"
  },
  "summary": "The fixes for GHSA-9rjx-3jch-6vjf (stored XSS through DTD entities) and GHSA-v383-3rw5-q8rf (crash through DTD attribute declarations) removed <!DOCTYPE ...> by searching the raw input bytes. libxml detects UTF-16 input from its byte order mark, and in UTF-16 the DOCTYPE bytes are interleaved with zero bytes, so the search found nothing and the internal DTD reached the parser. This brought back the DTD-based bypasses those fixes were meant to stop. Fixed in 1.1.0.",
  "discovered_at": "2026-10-04T00:00:00+03:00",
  "public": true,
  "credit": "ucsurf",
  "updated_at": "2026-10-19T15:20:00+03:00",
  "pr": null,
  "id": "security/php/darylldoyle__svg-sanitizer/2026-10-04-utf16-bom-bypass-removedoctype",
  "patched_versions": [
    "enshrined/svg-sanitize 1.1.0"
  ]
}
