在当今高度互联的互联网应用生态中,Java 作为企业级开发的核心语言之一,广泛应用于金融、电商、政务等关键领域。然而,伴随着其强大的功能和丰富的第三方库支持,Java 反序列化漏洞(Java Deserialization Vulnerability)也成为了黑客攻击的重要突破口。

根据CSDN、FreeBuf、php中文网等权威技术平台披露的信息,自2015年 Apache Commons Collections 漏洞爆发以来,包括 WebLogic、Jenkins、JBoss、Spring、Fastjson 等在内的多个知名框架和中间件均曾因反序列化问题被攻破,造成严重的安全事件。
本文将从零开始,系统性地解析 Java 反序列化漏洞的特征、原理、常见利用链及实战防护方案,帮助开发者和安全研究人员全面理解这一高危漏洞,提升系统安全性。
什么是Java序列化与反序列化?
在探讨“漏洞”之前,我们必须先了解其基础机制——序列化(Serialization)与反序列化(Deserialization)。
序列化:将 Java 对象转换为字节流的过程,便于对象在网络上传输或持久化存储到文件/数据库。
反序列化:将字节流还原为 Java 对象的操作,由
ObjectInputStream的readObject()方法完成。
⚠️ 核心风险点:
readObject()方法不仅恢复对象状态,还会自动调用类的构造函数、初始化方法,甚至触发某些特殊方法(如readObject()自定义逻辑),这正是反序列化漏洞的根源所在。
Java反序列化漏洞的本质特征
Java 反序列化漏洞并非单一的技术缺陷,而是一类基于特定条件组合的安全风险。其典型特征可归纳为以下三点:
✅ 特征一:存在可控的不可信数据输入源
这是漏洞利用的前提。如果应用程序对反序列化的数据来源缺乏校验,则极易被攻击者操控。常见的风险场景包括:
用户上传
.ser文件并被服务器读取RMI(远程方法调用)服务接收外部连接请求
JMX 接口暴露在公网
Redis / Memcached 中存储了可被反序列化的 Java 对象
Spring、Dubbo 等框架通过网络传输序列化对象
JSON 库(如 Fastjson、Jackson)开启
@type或enableDefaultTyping功能
🔍 判断依据:只要你的系统从用户输入、网络接口或第三方服务中读取并反序列化对象,就可能存在风险。
✅ 特征二:调用了危险的 readObject() 方法
这是漏洞触发的关键执行点。以下代码模式是典型的“危险信号”:
即使没有显式调用 readObject(),一些框架底层也会隐式使用该机制处理数据流。例如:
Java RMI 默认端口 1099,完全基于反序列化通信
Spring 框架中的某些组件(如 JtaTransactionManager)曾因反序列化导致远程代码执行
Dubbo 在传输对象时若未启用安全协议,也可能成为攻击入口
📌 SEO关键词提示:Java反序列化漏洞、readObject安全问题、RMI反序列化攻击、Fastjson漏洞特征
✅ 特征三:类路径中存在“利用链”(Gadget Chain)
这是实现远程代码执行(RCE)的核心要素。所谓“Gadget链”,是指在目标系统的类路径(classpath)中存在的、可在反序列化过程中自动触发恶意行为的一系列类和方法调用链条。
常见且经典的 Gadget 链包括:
| 利用链 | 所属库 | 漏洞描述 |
|---|---|---|
| CommonsCollections1-6 | Apache Commons Collections | 通过 InvokerTransformer + LazyMap 构造命令执行链 |
| Fastjson ≤ 1.2.47 | Alibaba Fastjson | 利用 @type 字段指定恶意类(如 TemplatesImpl)加载并执行字节码 |
| Jackson ≤ 2.x(启用DefaultTyping) | FasterXML Jackson | 使用 @class 指定恶意类,绕过类型限制 |
| XStream、Groovy、Jython | 第三方库 | 存在多种反序列化利用链,常被用于 bypass 检测 |
💡 示例说明:以 Commons Collections 为例,攻击者构造一个
PriorityQueue,其中包含一个被篡改的transformer,当反序列化时触发toString()→get()→transform()调用链,最终执行Runtime.getRuntime().exec("calc")。
真实世界中的反序列化攻击案例回顾
以下是近年来影响广泛的几个经典案例,充分体现了反序列化漏洞的危害性:
| CVE 编号 | 影响产品 | CVSS评分 | 攻击后果 |
|---|---|---|---|
| CVE-2015-4852 | Apache Commons Collections | 9.8(严重) | 远程代码执行,波及WebLogic、Jenkins等 |
| CVE-2017-3241 | Oracle WebLogic RMI | 9.8 | 攻击者可通过T3协议发送恶意序列化包 |
| CVE-2016-4437 | JBoss Marshalling | 9.8 | 利用JBoss反序列化机制获取服务器控制权 |
| CVE-2020-2551 | Oracle Coherence | 9.8 | 无需认证即可远程执行任意代码 |
| Fastjson历史漏洞 | 多数使用该库的Java项目 | 高危 | 多次爆出远程代码执行漏洞 |
这些案例表明,一旦核心中间件或常用库存在反序列化漏洞,其影响范围极广,可能引发整个系统的沦陷。
如何检测Java反序列化漏洞?(安全自查清单)
作为开发者或安全工程师,你可以通过以下方式主动识别潜在风险:
✅ 1. 代码审计
搜索项目中是否出现:
ObjectInputStream.readObject()ObjectInputStream.readUnshared()JSON.parse()(Fastjson)mapper.readValue()(Jackson 启用 DefaultTyping)
✅ 2. 依赖检查
审查 pom.xml 或 build.gradle 文件,重点关注以下库版本:
建议定期使用 Dependency-Check、SonarQube 等工具扫描依赖库的安全性。
✅ 3. 工具辅助测试
ysoserial:生成反序列化 payload 的神器
Burp Suite + Java Deserialization Scanner 插件:用于拦截和分析 HTTP 请求中的序列化数据
Checkmarx、Fortify:静态代码分析工具,可自动发现反序列化风险点
Java反序列化漏洞的七大防御策略(最佳实践)
面对如此高危的漏洞,单一防护手段难以奏效。我们需要采取“组合拳”式的纵深防御策略。
✅ 1. 禁止反序列化不可信数据
最根本的解决办法:不要反序列化来自用户或外部系统的对象。优先使用结构化数据格式替代,如:
JSON(推荐使用 Gson、Jackson 安全配置)
XML
Protocol Buffers
MessagePack
✅ 2. 使用 ObjectInputFilter(Java 9+)
Java 9 引入了内置的反序列化过滤机制,可限制允许反序列化的类:
✅ 3. 升级第三方依赖库
确保所有第三方库均为最新安全版本:
Apache Commons Collections ≥ 3.2.2
Fastjson ≥ 1.2.83(官方已修复多数漏洞)
Jackson Databind ≥ 2.13.x
📢 注意:Fastjson 自 1.2.24 版本起默认开启 autotype,后续多个版本仍存在绕过漏洞,强烈建议迁移到更安全的 JSON 库。
✅ 4. 自定义 readObject() 方法进行校验
对于必须序列化的敏感类,应重写 readObject() 添加完整性校验:
✅ 5. 启用 WAF 和 IPS 防护
部署 Web 应用防火墙(如 ModSecurity)或入侵防御系统(IPS),配置规则检测常见的反序列化特征码(如 ac ed 00 05 开头的十六进制流)。
✅ 6. 使用 RASP(运行时应用自我保护)
集成 RASP 工具(如 OpenRASP),可在运行时动态监控 readObject() 调用,并阻断可疑行为。
✅ 7. 替代序列化方案
考虑使用更安全的序列化框架,例如:
Kryo(需配置白名单)
Protobuf(Google 出品,无反射执行风险)
Hessian(需谨慎使用)
反序列化不是魔法,而是安全隐患
Java 反序列化漏洞的本质,是信任边界失控 + 自动化对象重建机制 + 第三方库缺陷三者叠加的结果。它允许攻击者通过精心构造的字节流,在目标服务器上执行任意代码,危害等级极高。
📌 核心要点回顾:
反序列化漏洞特征 = 不可信输入 +
readObject()+ Gadget链常见利用工具有 ysoserial,常见链有 CC、Fastjson、Jackson
防御需多管齐下:禁用不可信反序列化、升级依赖、使用过滤器、WAF防护
🔐 安全忠告:永远不要相信用户的输入,即使是“看起来像数据”的序列化流。安全编码应贯穿开发全生命周期。
常见问题解答(FAQ)
Q:Fastjson现在还安全吗?
A:Fastjson 经历多次重大漏洞后,官方持续修复。建议升级至 1.2.83 或更高版本,并关闭 autotype 功能。但从长远看,推荐迁移至 Jackson 或 Gson。
Q:JSON反序列化也会有反序列化漏洞吗?
A:会!Fastjson 和 Jackson 若配置不当(如启用 @type 或 enableDefaultTyping),同样可能被利用,本质仍是反序列化漏洞的一种表现形式。
Q:如何防止内部系统之间的反序列化攻击?
A:即使在内网,也应遵循最小权限原则。建议启用双向TLS认证、添加消息签名、使用白名单机制限制可反序列化的类。





















