type
status
date
slug
summary
tags
category
icon
password
后经调查,黑客是利用了 Apache Struts 的 CVE-2017-5638 漏洞。
戏剧性的是,该漏洞于今年 3 月份就已被披露,其危险系数定为最高分 10 分,Apache 随后发布的 Struts 2.3.32 和 2.5.10.1 版本特针对此漏洞进行了修复。而 Equifax 在漏洞公布后的两个月内都没有升级 Struts 版本,导致 5 月份黑客利用这个漏洞进行攻击,泄露其敏感数据。
Equifax 的一个管理面板使用的用户名和密码都是“admin”。
由于管理面板能被随意访问,获取数据库密码就轻而易举了——虽然管理面板会加密数据库密码之类的东西,但是密钥却和管理面板保存在了一起。虽然是如此重要的征信机构,但 Equifax 的安全意识之弱可见一斑。
Apache Struts 漏洞相关Apache Struts 是世界上最流行的 Java Web 服务器框架之一,它最初是 Jakarta 项目中的一个子项目,并在 2004 年 3 月成为 Apache 基金会的顶级项目。
远程代码执行高危漏洞
XStream 是一个用于 Java 对象与 XML 数据互相转换(序列化和反序列化)的开源库。它能够简化 Java 对象到 XML 格式的映射,并可以反向将 XML 转换为 Java 对象。这种双向转换功能让 XStream 在数据持久化、数据传输和配置文件管理等场景中得到了广泛应用。
1. XStream 的主要功能与特点
- 对象与 XML 之间的序列化和反序列化:
- XStream 可以将复杂的 Java 对象(包括嵌套类、集合和泛型)轻松地序列化为 XML 表示形式。
- 它能够将 XML 数据反序列化为对应的 Java 对象,并且可以保持对象的属性、类型和层次结构。
- 灵活的映射机制:
- XStream 提供了灵活的配置机制,可以通过注解或代码配置来定制 XML 与 Java 类之间的映射方式。
- 可以使用别名(Alias)来替换类名或字段名,从而生成更加易读的 XML 结构。
- JSON 支持:
- XStream 除了支持 XML 之外,还支持将 Java 对象转换为 JSON 格式,并支持将 JSON 解析为 Java 对象。
- 易于使用:
- XStream 的 API 设计简洁明了,开发者只需几行代码即可完成对象到 XML 以及 XML 到对象的转换。
- 支持基于字段而非 getter/setter 的序列化,使其非常适合老旧的类库或无法更改的类。
- 支持自定义转换器(Converter):
- XStream 允许开发者定义自定义的转换器来处理复杂的对象映射场景,例如自定义格式的日期类型、加密字段等。
2. XStream 的应用场景
XStream 在以下几种场景中尤为常用:
- 配置文件管理:
- 通过 XStream 可以将复杂的配置文件(XML 格式)直接映射为 Java 对象,以便在应用程序中使用。
- 反之,应用程序的配置变更也可以轻松序列化为 XML 形式并保存。
- 数据持久化:
- XStream 常用于将 Java 对象持久化为 XML 文件,尤其适合轻量级的数据持久化需求(如简单的数据缓存、会话管理)。
- 数据传输与集成:
- 在 Web 服务或微服务架构中,可以使用 XStream 将对象转换为 XML 进行跨系统数据传递。
- 由于其对 JSON 的支持,也可以用作 RESTful API 的数据序列化工具。
- 测试数据生成:
- XStream 可以生成结构化的 XML 文档,便于开发者创建测试数据或将测试结果序列化以便调试和分析。
3. XStream 的用法示例
以下是 XStream 的简单用法示例,展示如何将 Java 对象转换为 XML,并将 XML 反序列化为 Java 对象。
4. XStream 的安全风险与防范
虽然 XStream 功能强大且使用便捷,但它曾因安全问题而广受诟病,特别是在 反序列化 过程中存在严重的远程代码执行(RCE)漏洞。这些漏洞源自于 XStream 在反序列化 XML 时会动态解析和实例化对象,如果 XML 中包含恶意数据,攻击者可以利用这些漏洞在目标系统上执行任意代码。
4.1. 安全风险的原因
- 类加载机制问题:
- XStream 反序列化 XML 时,会根据 XML 数据中定义的类名和字段信息动态加载 Java 类。如果 XML 中包含未受信任的类(如某些有副作用的类或反序列化时会执行系统命令的类),就会引发严重的安全问题。
- Gadget Chains(小工具链攻击):
- 攻击者可以通过在 XML 中构造特殊的对象链(gadget chain),引导 XStream 在反序列化过程中触发某些类的恶意代码(例如利用某些危险的类库或接口如
java.lang.Runtime
、javax.management.MBeanServer
)。
- 无保护的反序列化:
- XStream 的默认配置会在反序列化时自动加载 XML 中定义的所有对象类型,并且不会对这些类进行安全检查。这使得攻击者可以轻松利用 XStream 来触发各种反序列化攻击。
4.2. 安全防护措施
为了防止 XStream 被利用进行远程代码执行或反序列化攻击,开发者需要对其进行严格的安全配置:
- 启用白名单机制:
- XStream 从 1.4.7 版本开始引入了类白名单机制,可以使用
xstream.allowTypes()
方法来限制允许反序列化的类。 - 示例:
- 这种方式可以有效防止未授权的类被加载和反序列化。
- 使用
XStream.setupDefaultSecurity()
: setupDefaultSecurity()
方法可以启用 XStream 的默认安全配置,包括限制对某些危险类(如java.io.File
、java.net.Socket
)的访问。- 示例:
- 拒绝危险类:
- 使用
xstream.denyTypes()
显式拒绝某些危险类的反序列化(如java.lang.Runtime
、java.io
等)。
- 在受信任的环境中使用:
- 避免在公开环境(如网络输入、用户输入)中直接使用 XStream 进行反序列化,尽量使用安全的上下文(如本地文件、受信任的内部数据源)。
5. 总结
XStream 是一个非常强大且易用的对象序列化工具,特别适合在 Java 项目中进行 XML 和 JSON 数据的转换。然而,由于其潜在的安全风险,开发者在使用时需要特别注意反序列化的安全问题。通过启用白名单机制、设置安全策略、拒绝不可信数据源,可以有效降低 XStream 被利用的风险。
- Author:NotionNext
- URL:https://tangly1024.com/article/Equifax%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E5%A7%8B%E6%9C%AB
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts