避免序列化安全漏洞的核心在于将反序列化操作视为“不可信输入”,并遵循**“不反序列化不可信数据”**的原则。如果必须处理外部数据,应严格限制可反序列化的类、使用安全替代方案(如 JSON)以及实施严格的输入校验。
以下是具体的防御策略,按优先级排列:
这是最根本的解决方案。如果可能,永远不要反序列化来自网络、文件上传或用户输入的字节流。
Jackson、Gson),且配置为禁止解析多态类型或执行任意代码。不要依赖黑名单(黑名单很难维护且容易被绕过),而是使用白名单。
resolveClass 方法,只允许特定的安全类被反序列化。// 示例:只允许特定类通过
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (!desc.getName().equals("com.example.SafeClass")) {
throw new InvalidClassException("Unauthorized deserialization attempt", desc.getName());
}
return super.resolveClass(desc);
}
enableDefaultTyping(多态类型处理),因为它允许攻击者指定任意类进行实例化。readObject、readExternal 或 finalize 方法,除非经过严格审计。如果数据必须在网络上传输,不要只依赖序列化本身的安全性。
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 使用无状态协议 | 尽量使用无状态的 API(如 RESTful),避免传递包含复杂对象状态的序列化数据。 | Web 服务开发 |
| 替换序列化机制 | 使用 Protocol Buffers、FlatBuffers 或 MessagePack 等二进制格式,它们通常比原生序列化(如 Java Serialization)更安全且高效。 | 高性能 RPC 或存储 |
| 深度防御 | 即使使用了白名单,也要在反序列化后对对象进行校验(如检查字段范围、类型)。 | 所有场景 |
| 日志与监控 | 记录所有反序列化失败的尝试,并监控异常行为。 | 运维安全 |
ObjectInputFilter API,允许更细粒度地控制反序列化过程。Apache Commons Collections 等历史上存在大量反序列化 Gadget 的库,或者升级到已修复的版本。unserialize() 处理用户输入。json_decode() 替代。json 模块替代。最安全的做法是彻底放弃对不可信数据进行原生反序列化。如果业务必须,请务必配置严格的白名单过滤器,并结合签名验证和安全替代格式(如 JSON + 强类型校验)来构建防御体系。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。