XStream工具修复拒绝服务漏洞CVE-2024-47072
XStream是一款自由软件,可以在BSD许可证许可下分发,作为一个 Java 类库,用来将对象序列化成XML (JSON)或反序列化为对象。
一、基本情况
XStream 是一款应用于在 Java 对象和 XML 之间相互转换的工具,能够实现 Java 对象序列化为 XML 或 JSON 格式,也可以反其道行之。
Xstream 是一种 OXMapping 技术,可以用来处理 XML 文件序列化的框架,可以将 JavaBean 序列化,也可以将 XML 文件进行反序列化。
无论是序列化还是反序列化,这一过程都不需要其它辅助类和映射文件,这使得 XML 序列化不再繁索,从而简化数据存储、传输和恢复。
栋科技漏洞库关注到 XStream 中修复一个堆溢出拒绝服务漏洞,其影响1.4.20(包括)之前所有版本,该漏洞被追踪为CVE-2024-47072。
二、漏洞分析
CVE-2024-47072漏洞CVSS3.1评分7.5,由于受操纵二进制输入流堆栈溢出,导致XStream 堆栈溢出错误终止应用程序并引发拒绝服务。
简单来说,XStream 1.4.21之前版本中,当 XStream 配置为使用 BinaryStreamDriver 时,在反序列化某些特定输入的时候存在处理不当。
攻击者可以通过构造特定的二进制数据流作为输入,导致在反序列化时进入无限递归,从而触发栈溢出使应用程序崩溃并导致服务中断。
如此即可造成拒绝服务,而BinaryStreamDriver 是 XStream 提供的一种驱动,使用一种优化的二进制格式来进行序列化与反序列化操作。
BinaryStreamDriver 这种自己优化的序列化格式,使用字符串值的 ids 作为重复数据删除,而这些 id 的映射是在编组的时候动态创建的。
在解组时,读取器的实现是在读取映射令牌后,仅使用简单的一次性递归来处理数据流下一个正常令牌,这本身是一个非常正常的过程。
然而,攻击者可以特殊构造特定的二进制数据,通过输入被操纵的输入数据,可能触发无限递归从而导致堆栈溢出,从而导致拒绝服务。
来自 Trail Of Bits 的 Alexis Challande 发现了该漏洞并向负责任的向XStream报告,并提供了重现该问题所需的信息,官方对此表示感谢。
1、CVE-2024-47072漏洞复现(仅参考)
准备操作的数据并使用 BinaryDriver 将其作为 XStream 实例的输入提供:
final byte[] byteArray = new byte[36000];
for (int i = 0; i < byteArray.length / 4; i++) {
byteArray[i * 4] = 10;
byteArray[i * 4 + 1] = -127;
byteArray[i * 4 + 2] = 0;
byteArray[i * 4 + 3] = 0;
}
XStream xstream = new XStream(new BinaryStreamDriver());
xstream.fromXML(new ByteArrayInputStream(byteArray));
一旦数据被解组,就会进入无限递归,并且执行线程会因堆栈溢出错误而中止。
2、处理意见
XStream 1.4.21 已对漏洞进行修补,通过检测二进制输入流中导致堆栈溢出的操作,并引发 InputManipulationException,建议用户升级。
如果 XStream 配置为使用 BinaryStreamDriver,则无法升级的用户可能会在调用 XStream 的客户端代码中捕获 StackOverflowError。
三、影响范围
XStream < 1.4.21
四、修复建议
目前该漏洞已经修复,受影响用户可升级到以下版本:
xstream >= 1.4.21 - 1.1
xstream-benchmark >= 1.4.21 - 1.1
xstream-javadoc >= 1.4.21 - 1.1
xstream-parent >= 1.4.21 - 1.1
五、参考链接
https://x-stream.github.io/CVE-2024-47072.html
https://github.com/x-stream/xstream/security/advisories/GHSA-hfq9-hggm-c56q