Java 序列化安全:Jackson 反序列化漏洞防护与自定义模块开发
·
Java 序列化安全:Jackson 反序列化漏洞防护与自定义模块开发
一、Jackson 反序列化漏洞风险
Jackson 反序列化漏洞主要源于恶意 JSON 数据滥用多态类型处理机制,例如:
{
"@class": "com.attacker.ExploitClass",
"payload": "..."
}
攻击者通过 @class 属性指定任意类进行实例化,可能导致:
- 远程代码执行(RCE):实例化
Runtime.exec()等危险类 - 拒绝服务(DoS):构造深度嵌套对象耗尽资源
- 敏感数据泄露:访问内部类属性
二、核心防护措施
1. 禁用多态类型处理
ObjectMapper mapper = new ObjectMapper();
// 禁用Default Typing
mapper.deactivateDefaultTyping();
2. 类白名单控制
使用 SimpleTypeResolverBuilder 限制可反序列化的类:
SimpleTypeResolverBuilder builder = new SimpleTypeResolverBuilder();
builder.allowSubTypes("com.safe.DomainModel");
mapper.setDefaultTyping(builder);
3. 注解级防护
在敏感类上添加 @JsonIgnoreProperties(ignoreUnknown = true):
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private String name;
// getters/setters
}
4. 版本升级策略
- 使用 Jackson ≥ 2.10 版本(启用
jackson-databind安全模块) - 定期检查 CVE 漏洞公告
三、自定义安全模块开发
1. 创建反序列化验证器
public class SafeDeserializer extends StdDeserializer<Object> {
private static final Set<String> ALLOWED_CLASSES = Set.of(
"com.app.User", "com.app.Product"
);
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) {
String className = p.getParsingContext().getCurrentName();
if (!ALLOWED_CLASSES.contains(className)) {
throw new InvalidTypeException("Unauthorized class: " + className);
}
return super.deserialize(p, ctxt);
}
}
2. 注册安全模块
SimpleModule securityModule = new SimpleModule();
securityModule.addDeserializer(Object.class, new SafeDeserializer());
mapper.registerModule(securityModule);
3. 深度嵌套对象防护
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper()
.enable(JsonParser.Feature.STRICT_DEPTH_LIMIT)
.setMaxDepth(100); // 控制对象嵌套深度
}
四、最佳实践组合
-
深度防御策略:
- 网络层:WAF 过滤恶意请求
- 代码层:白名单 + 深度限制
- 运行时:SecurityManager 沙箱环境
-
安全审计工具:
mvn org.sonatype.ossindex:ossindex-maven-plugin:audit -
性能影响评估:
- 白名单机制增加约 $O(n)$ 时间复杂度($n$ 为属性数量)
- 深度限制降低递归风险
关键建议:优先使用 DTO(Data Transfer Object)模式而非直接反序列化领域模型,通过显式转换层隔离风险。定期使用 OWASP ZAP 进行渗透测试,确保防护措施有效性。
更多推荐


所有评论(0)