Java 序列化漏洞(如反序列化远程代码执行,典型如 Apache Commons Collections、Fastjson、Jackson 等历史漏洞)本质上是不可信数据被反序列化为危险对象导致的。避免这类问题可以从“不用 / 少用”“安全配置”“输入控制”“依赖治理”几个层面来做。
最彻底的办法:不用 ObjectInputStream
java.io.Serializable 做跨系统数据交换示例(推荐):
// 使用 Jackson
ObjectMapper mapper = new ObjectMapper();
MyObj obj = mapper.readValue(json, MyObj.class);
ObjectInputFilter(Java 9+)ObjectInputStream ois = new ObjectInputStream(in);
ois.setObjectInputFilter(info -> {
if (info.serialClass() != null &&
info.serialClass().getName().startsWith("com.myapp.")) {
return ObjectInputFilter.Status.ALLOWED;
}
return ObjectInputFilter.Status.REJECTED;
});
✅ 只允许可信类
❌ 禁止 java.lang.Runtime、ProcessBuilder 等
高危场景:
✅ 正确做法:
Fastjson(高风险)
// 危险
JSON.parseObject(json);
// 安全
JSON.parseObject(json, Myclass.class);
✅ 建议:
autoTypemvn dependency-checkObjectMapper mapper = new ObjectMapper();
mapper.disable(DEFAULT_VIEW_INCLUSION);
mapper.disable(AUTO_DETECT_SETTERS);
避免:
@JsonTypeInfo 使用类名✅ 禁用 ObjectInputStream 处理外部数据
✅ 使用 JSON + 明确类型
✅ 所有反序列化必须白名单
✅ 第三方库及时升级
✅ 不可信数据一律视为“字符串”
如果你愿意,我可以:
你当前用的是哪种序列化方式?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。