CVE-2026-93990: Expat before 2.8.5 Malformed UTF-16 Acceptance via Unchecked Surrogate
Expat before 2.8.5 fails to validate that a high surrogate in UTF-16 input is followed by a low surrogate, allowing malformed UTF-16 sequences to be accepted. Attackers can supply UTF-16 encoded XML containing lone high surrogates that consume the following code unit, causing Expat to pass unpaired surrogates to applications built with XMLUNICODE and to silently replace input characters in other builds.
Other sources
Expat through 2.8.4 fails to validate low surrogates following high surrogates in UTF-16 input, allowing malformed UTF-16 sequences to be accepted. Attackers can craft UTF-16 encoded XML with lone high surrogates that consume following code units, hiding markup characters from the parser and enabling XML injection attacks.
— NVD
Expat through 2.8.4 Malformed UTF-16 Acceptance via Unchecked Surrogate
— Microsoft
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 3.12.15-1 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 2.8.5-1 - Upgrade
Upgrade
libexpatto a version that resolves this vulnerability.Fixed in 2.8.5
Event History
Frequently Asked Questions
Which Expat versions are affected?
Expat versions through 2.8.4 are affected.
What input must an attacker control to exploit this issue?
An attacker needs to supply crafted UTF-16 encoded XML containing lone high surrogates. The malformed sequence can consume subsequent code units and conceal markup characters from the parser.