当前位置: 首页 > news >正文

Java 反序列化漏洞

Java 反序列化漏洞详解

Java 反序列化漏洞(Java Deserialization Vulnerability)是 Java 应用中一种高危安全漏洞,曾导致多个重大安全事件(如 Apache Commons Collections 漏洞、WebLogic、Jenkins 等被攻破)。它允许攻击者通过构造恶意的序列化数据,在目标系统上执行任意代码(Remote Code Execution, RCE)。


一、什么是序列化与反序列化?

🔹 序列化(Serialization)

将 Java 对象转换为字节流,便于存储或网络传输。

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("obj.ser"));
out.writeObject(myObject);
out.close();

🔹 反序列化(Deserialization)

将字节流恢复为 Java 对象。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("obj.ser"));
MyObject obj = (MyObject) in.readObject();
in.close();

⚠️ 问题出在 readObject():它会自动调用对象的构造函数、初始化方法,甚至触发恶意代码执行


二、反序列化漏洞的原理

✅ 漏洞核心:

如果应用反序列化了不可信的数据(如用户输入、网络请求、文件上传),攻击者可以构造恶意对象,在反序列化过程中触发任意代码执行。


🔍 关键机制:readObject() 的自动调用

某些类在反序列化时会自动执行代码,例如:

  • java.util.PriorityQueue
  • org.apache.commons.collections.map.LazyMap
  • javax.management.BadAttributeValueExpException

这些类的 readObject() 方法在恢复对象时,会调用对象的 toString()equals()hashCode() 等方法。如果这些方法被恶意重写,就可能执行命令。


三、经典案例:Apache Commons Collections 漏洞(CVE-2015-4852)

这是最著名的 Java 反序列化漏洞之一。

攻击链(Gadget Chain)原理:

  1. 攻击者构造一个 LazyMap 对象,其 transformer 是一个 InvokerTransformer,可执行任意方法。
  2. LazyMap 放入 HashMapPriorityQueue
  3. 当反序列化时,某些类(如 BadAttributeValueExpException)会调用 toString()
  4. toString() 触发 LazyMap.get() → 调用 transformer.transform() → 执行 Runtime.getRuntime().exec("malicious command")

🧨 结果:攻击者可在服务器上执行任意命令,如下载木马、提权、挖矿等。


四、反序列化漏洞的利用条件

条件说明
1. 应用使用 ObjectInputStream.readObject()常见于 RMI、JMX、Spring、Hibernate、Redis 存储对象等
2. 输入数据来自不可信源如 HTTP 请求、文件上传、消息队列
3. 类路径中存在“利用链”(Gadget Chains)如 Apache Commons Collections、Groovy、Jython 等第三方库

五、常见攻击场景

场景说明
RMI(Remote Method Invocation)RMI 服务默认使用 Java 序列化,易受攻击
JMX(Java Management Extensions)JMX 接口暴露时可能被利用
Spring 框架Spring 某些组件(如 Spring REST)支持序列化对象传输
Redis / Memcached 存储 Java 对象如果反序列化缓存对象,可能被注入
文件上传反序列化用户上传 .ser 文件,服务器读取

六、如何检测反序列化漏洞?

✅ 1. 代码审计

查找是否使用:

ObjectInputStream.readObject();
ObjectInputStream.readUnshared();

✅ 2. 依赖检查

检查 pom.xmlbuild.gradle 是否包含:

  • commons-collections:commons-collections
  • groovy, jython, xstream 等存在 gadget 的库

✅ 3. 使用工具扫描

  • ysoserial:生成恶意 payload 的工具(用于测试)
  • Burp Suite + Java Deserialization Scanner 插件
  • Checkmarx、Fortify 等 SAST 工具

七、防御措施(最佳实践)

✅ 1. 避免反序列化不可信数据

  • 不要从网络、文件、用户输入中反序列化对象
  • 使用 JSON、XML 等数据格式替代

✅ 2. 使用 serialVersionUID 并校验完整性

private static final long serialVersionUID = 123456789L;

但不能防止恶意对象,仅防版本错乱。

✅ 3. 自定义 readObject() 方法

在敏感类中重写 readObject(),加入校验逻辑:

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {in.defaultReadObject();// 添加校验if (this.username == null || this.username.contains(";")) {throw new InvalidObjectException("Invalid input");}
}

✅ 4. 使用 ObjectInputFilter(Java 9+)

限制可反序列化的类:

ObjectInputStream ois = new ObjectInputStream(inputStream);
ois.setObjectInputFilter(filterInfo -> {if (filterInfo.serialClass() == null) return -1;String name = filterInfo.serialClass().getName();if (name.equals("com.example.TrustedClass")) {return 1;}return -1; // 拒绝其他类
});

✅ 5. 使用安全的替代序列化方式

  • JSON:Jackson、Gson
  • Protobuf:Google Protocol Buffers
  • Kryo(需配置安全反序列化)
  • MessagePack

✅ 6. 升级依赖库

  • 升级 commons-collections 到 3.2.2+ 或 4.1+
  • 使用最新版本的 Spring、Hibernate 等框架

✅ 7. 启用 WAF 或 IPS 防护

  • 配置 Web 应用防火墙(如 ModSecurity)检测恶意序列化特征
  • 使用 RASP(运行时应用自我保护)工具

八、真实漏洞案例

漏洞影响产品CVSS 评分
CVE-2015-4852Apache Commons Collections9.8(Critical)
CVE-2017-3241Oracle WebLogic RMI9.8
CVE-2016-4437JBoss Marshalling9.8
CVE-2020-2551Oracle Coherence9.8

✅ 总结

问题回答
什么是 Java 反序列化漏洞?攻击者通过构造恶意序列化数据,在反序列化时执行任意代码
危害是什么?远程代码执行(RCE),服务器被完全控制
常见利用链?Commons Collections、Groovy、Jython 等
如何防御?1. 避免反序列化不可信数据
2. 使用 ObjectInputFilter
3. 升级依赖
4. 使用 JSON 等安全格式

📌 一句话总结
Java 反序列化漏洞是“信任字节流”的代价——永远不要反序列化不可信的数据,否则你的服务器就是攻击者的“命令行”。

http://www.dtcms.com/a/364879.html

相关文章:

  • 专题四_前缀和_一维前缀和
  • JAVA 十二幕啦啦啦啦啦啦啦啊啦啦啦啦a
  • AI IDE+AI 辅助编程,真能让程序员 “告别 996” 吗?
  • 【Java】对于XML文档读取和增删改查操作与JDBC编程的读取和增删改查操作的有感而发
  • 面试题:JVM与G1要点总结
  • 告别 Hadoop,拥抱 StarRocks!政采云数据平台升级之路
  • 海思HI3516CV610-20S,HI3516CV610专为安防市场超高清智慧视觉SoC硬件设计的一款开发板
  • MongoDB 聚合查询超时:索引优化与分片策略的踩坑记录
  • Prometheus监控预警系统深度解析:架构、优劣、成本与竞品
  • CryptMsgGetParam函数分析之CMSG_INNER_CONTENT_TYPE_PARAM
  • 110个作品涨粉210万!用Coze智能体工作流1分钟生成爆款名著金句视频,无需剪辑,附详细教程
  • 【FastDDS】Layer DDS之Domain (01-overview)
  • 限流式保护器+安全用电云平台如何为企业安全用电做双重防护的?
  • 机器学习从入门到精通 - 手撕线性回归与梯度下降:从数学推导到Scikit-Learn实战
  • Scikit-learn Python机器学习 - 特征预处理 - 处理缺失值:SimpleImputer
  • 深度学习与 OpenCV 的深度羁绊:从技术协同到代码实践
  • 苍穹外卖项目实战(日记十四)-记录实战教程及问题的解决方法-(day3课后作业) 菜品停售启售功能
  • centos 压缩命令
  • 解决CentOS 镜像列表服务已下线或迁移导致镜像服务和仓库停止维护解决方案
  • Python:AI开发第一语言的全面剖析
  • Linux之centos 系统常用命令详解(附实战案例)
  • pytorch gpu版本安装(最新保姆级安装教程)
  • 【常用SQL语句和语法总结】
  • Keras/TensorFlow 中 `fit()` 方法参数详细说明
  • leetcode_234 回文链表
  • 如何画时序图、流程图
  • try-catch:异常处理的最佳实践与陷阱规避
  • 2025年互联网行业专业认证发展路径分析
  • RoPE频率缩放机制:解密大语言模型上下文扩展的核心算法
  • 无人机散热模块技术要点分析