Java 序列化安全:Jackson 反序列化漏洞防护与自定义模块开发

一、Jackson 反序列化漏洞风险

Jackson 反序列化漏洞主要源于恶意 JSON 数据滥用多态类型处理机制,例如:

{
  "@class": "com.attacker.ExploitClass",
  "payload": "..."
}

攻击者通过 @class 属性指定任意类进行实例化,可能导致:

  1. 远程代码执行(RCE):实例化 Runtime.exec() 等危险类
  2. 拒绝服务(DoS):构造深度嵌套对象耗尽资源
  3. 敏感数据泄露:访问内部类属性

二、核心防护措施
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); // 控制对象嵌套深度
}


四、最佳实践组合
  1. 深度防御策略

    • 网络层:WAF 过滤恶意请求
    • 代码层:白名单 + 深度限制
    • 运行时:SecurityManager 沙箱环境
  2. 安全审计工具

    mvn org.sonatype.ossindex:ossindex-maven-plugin:audit
    

  3. 性能影响评估:

    • 白名单机制增加约 $O(n)$ 时间复杂度($n$ 为属性数量)
    • 深度限制降低递归风险

关键建议:优先使用 DTO(Data Transfer Object)模式而非直接反序列化领域模型,通过显式转换层隔离风险。定期使用 OWASP ZAP 进行渗透测试,确保防护措施有效性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐