java反序列化不安全,应禁用objectinputstream.readobject()、启用jdk序列化过滤器(如-djdk.serialfilter)、改用json/protobuf等安全格式,并对遗留逻辑实施白名单校验与沙箱隔离。

Java 对象序列化本身不安全,反序列化时若未加管控,攻击者可构造恶意字节流触发任意代码执行。关键不是“完全避免序列化”,而是**严格控制反序列化入口、限制可反序列化类、使用更安全的替代方案**。
禁用危险的反序列化操作
最直接有效的方式是:除非业务强依赖,否则不要调用 ObjectInputStream.readObject() 这类原生反序列化方法。尤其要避免对不可信输入(如网络请求体、文件上传、HTTP参数)直接反序列化。
- 检查所有使用
ObjectInputStream的地方,确认数据来源是否可信、是否经过白名单校验 - 在反序列化前添加日志和监控,记录类名与调用栈,便于事后溯源
- 考虑用
SecurityManager(JDK 8 及以前)或 JVM 启动参数(如-Djdk.serialFilter=...)设置全局反序列化过滤器
启用 JDK 内置序列化过滤器(JDK 9+ 推荐)
JDK 9 引入了 jdk.serialFilter 系统属性,可声明允许/禁止反序列化的类模式,是轻量级但有效的第一道防线。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 启动时添加参数:
-Djdk.serialFilter="maxdepth=5;maxarray=100000;java.lang.**;com.yourpackage.**;!*" - 规则中优先用白名单(如
com.example.model.**),结尾加;!*显式拒绝其余所有类 - 注意:该过滤器仅作用于
ObjectInputStream,不保护第三方库(如 Apache Commons Collections)的 gadget 链
用更安全的数据交换格式替代 Java 序列化
Java 原生序列化协议是封闭、不可读、易被滥用的二进制格式,生产环境应优先替换为 JSON、Protobuf 或 CBOR 等结构清晰、有明确 schema、默认不执行代码的格式。
- JSON(配合 Jackson/Gson):默认只解析为 POJO 或 Map/List,无自动执行逻辑;禁用
enableDefaultTyping()等危险配置 - Protobuf:需预定义 .proto 文件,天然杜绝未知类型注入,性能与安全性兼备
- 若必须保留对象语义,可用 Jackson 的
@JsonCreator+ 不可变构造器 + 封闭类型体系,避免反序列化到抽象类或接口
加固已有序列化逻辑(兜底措施)
当无法立即移除序列化(如老系统兼容、RMI 服务),需叠加多层防护:
- 自定义
ObjectInputStream子类,在resolveClass()中强制校验类名是否在预设白名单内 - 使用
SerialKiller或Jackson JDK Deserialization Guard等开源库做运行时拦截 - 将反序列化操作放在沙箱进程或容器中执行,限制其网络、文件、反射等敏感权限
- 定期扫描依赖项,排除含已知 gadget 类的旧版库(如 commons-collections3
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










