Fastjson 高危 RCE(CVE-2026-16723):如何用观测云快速发现并完成修复
本文针对 Fastjson 高危 RCE 漏洞 CVE‑2026‑16723,剖析其影响与利用条件,指出 Maven 静态排查的局限。观测云依托 ddtrace 运行时数据,完成漏洞检测定位告警修复闭环,提供升级、应急防护、迁移 fastjson2 处置方案。
近期 Fastjson 曝出 CVE-2026-16723 高危远程代码执行漏洞,CVSS 3.1 评分高达 9.0、风险等级 Critical,漏洞无需开启 AutoType 默认配置即可触发,无需依赖本地 gadget 类,适配绝大多数 Spring Boot fat-jar 业务场景,攻击门槛极低、危害极强,一旦被利用可直接导致服务器被控、业务数据泄露,目前已有公开 PoC,企业亟需全面排查整改。
漏洞预警发布后,多数企业的常规排查方式,多为检索项目
pom.xml依赖配置、执行mvn dependency:tree梳理依赖版本。但这种静态代码与构建层排查存在明显短板:仅能统计项目声明的依赖版本,无法精准校验生产环境真实运行、加载生效的 Fastjson 组件,极易出现“代码无风险、运行有漏洞”的漏判、误判情况,遗留安全隐患。针对这一排查痛点,本文将完整梳理 CVE-2026-16723 漏洞时间线、核心风险细节与影响范围,对比传统静态排查方式的局限性,重点讲解如何依托观测云
ddtrace采集的运行时数据,实现生产环境 Fastjson 风险版本的持续精准发现、漏洞定位、整改验证、修复验收的全流程闭环处置方案,帮助企业高效完成漏洞闭环治理。
一、漏洞发生时间线
| 时间 | 事件 |
|---|---|
| 2026 年 7 月 21 日 | Fastjson 官方发布远程代码执行漏洞安全公告 |
| 2026 年 7 月 23 日 | NVD 收录 CVE-2026-16723,披露影响范围与 Alibaba CNA 评分 |
| 2026 年 7 月 29 日 | 官方公告更新,明确 Fastjson 1.2.84 已修复该漏洞 |
| 2026 年 8 月 24 日 | 本文根据官方最新公告与观测云运行时数据检测实践整理 |
需要特别说明:截至本文撰写时,NVD 尚未给出自己的 CVSS 分数,页面展示的是 Alibaba CNA 提供的 CVSS 3.1 评分 9.0,严重等级 Critical。公开 PoC 也不等于已经发生大规模在野利用,但由于漏洞可能导致远程代码执行,命中风险版本后仍应立即处理。
二、漏洞背景
CVE-2026-16723 影响 Fastjson 1.x 的特定版本。该漏洞在 AutoType 未开启的默认情况下仍可能触发,并且不依赖目标 classpath 中预先存在特定 gadget 类。
| 项目 | 结论 |
|---|---|
| 漏洞编号 | CVE-2026-16723 |
| 漏洞类型 | 远程代码执行(RCE)、不可信数据反序列化 |
| 受影响组件 | com.alibaba:fastjson |
| 受影响版本 | 1.2.68~1.2.83,包含两个边界版本 |
| 修复版本 | com.alibaba:fastjson:1.2.84 |
| 默认配置 | AutoType 关闭、SafeMode 关闭时仍可能触发 |
| 关键部署前提 | Spring Boot 可执行 fat-jar |
| 不受该漏洞影响 | Fastjson 1.2.84 及以上、fastjson2、SafeMode 已开启、noneautotype 构建,以及不满足利用前提的非 fat-jar 部署 |
Fastjson 的 @type 可以指定反序列化目标类型。本次问题存在于 checkAutoType() 相关类型校验和资源探测路径中:特定类型名可能绕过原有信任判断,在 Spring Boot 可执行 fat-jar 的类加载环境中形成远程类加载与代码执行链。
攻击流程

攻击者发现可控的 JSON 反序列化入口。
- 构造包含异常
@type的 JSON 请求,请求进入JSON.parse()、JSON.parseObject()等解析入口。 - 特殊类型名进入
checkAutoType()与资源探测路径,在 AutoType 未开启时仍可绕过原有信任判断。 - 借助 Spring Boot 可执行 fat‑jar 的类加载环境处理远程 JAR,Java 服务向攻击者控制的地址发起 DNS 或 HTTP 请求。
- 攻击者尝试定位 JVM 已打开的远程资源,攻击链路通常枚举 Linux
/proc/self/fd/<n>文件描述符。 - 后续反序列化触发恶意类加载与类初始化,攻击代码获取 Java 服务进程账号对应的运行权限。
- 实现远程代码执行,攻击者可继续读取数据、窃取凭据、部署持久化后门或实施内网横向移动。
防守侧可以关注四类信号:
- JSON 请求中出现非业务预期的
@type,或包含jar:http:、jar:file:、/proc/self/fd/等异常特征; - 同一来源短时间内对 JSON 接口进行大量结构相似的探测;
- Java 服务出现与正常业务无关的 DNS、HTTP 或 HTTPS 外联;
- Java 进程派生异常子进程、写入临时文件或修改启动项。
发现风险版本,说明存在必须处理的组件暴露面,并不等同于确认已经被利用。是否形成真实攻击,还需要结合入口可达性、部署方式、SafeMode、网络和主机行为进一步研判。
三、传统方式查询漏洞
传统排查通常从代码仓库、构建依赖和服务器文件三个方向展开。
1. 查询 Maven 或 Gradle 依赖
Maven 项目可以查询直接依赖与传递依赖:
mvn dependency:tree | grep -i fastjson
Gradle 项目可以使用:
./gradlew dependencies | grep -i fastjson
./gradlew dependencyInsight --dependency fastjson
如果发现 com.alibaba:fastjson 的版本处于 1.2.68~1.2.83,则在本次漏洞影响范围内,必须处理。
2. 检查构建制品和服务器 JAR
find /app /opt -type f -name 'fastjson*.jar' 2>/dev/null
也可以解压应用制品,检查 Spring Boot fat-jar 内的 BOOT-INF/lib,避免遗漏打包进最终制品的传递依赖。
3. 排查反序列化入口
rg -n 'JSON[.]parse|JSON[.]parseObject|TypeReference' \
--glob '*.java' .
重点检查这些调用是否处理来自 HTTP、消息队列、配置中心、任务平台、文件导入或 RPC 的不可信数据。
传统方式简单直接,但存在明显局限:
- 代码仓库中的版本不一定等于生产环境版本;
- 传递依赖、旧镜像、回滚制品容易被遗漏;
- 同一服务的不同实例可能运行不同版本;
- 修改依赖但未重新构建、发布或重启时,运行中的 JVM 仍会加载旧版本;
- 一次性扫描无法持续发现后续回滚和环境漂移。
因此,传统依赖扫描适合回答“构建时有什么”,还需要运行时数据回答“生产环境实际加载了什么”。
四、观测云用户查询漏洞
DataKit 的 ddtrace 采集器会采集 DDTrace Java Agent 上报的服务、运行时和依赖信息,并在观测云中形成 CO(自定义对象)数据。
数据链路如下:

Java 服务启动并加载 DDTrace Java Agent。
- Java Agent 上报服务、运行时与依赖信息。
- DataKit ddtrace 采集器接收上报数据,生成 CO 数据。
- 将依赖信息写入
CO::tracing_service,对应字段为app_dependencies_loaded。 - CSPM 模块解析依赖名称,识别判断 Fastjson 版本号。
- 当版本命中 1.2.68~1.2.83 区间,生成 Critical 级别安全事件,并定位到具体受影响的 JVM 实例。
{
"dependencies": [
{
"name": "com.alibaba:fastjson",
"version": "1.2.83"
}
]
}
开启 Fastjson 检测
观测云平台内置专属 Fastjson 安全检测库,支持一键开启检测能力,快速排查平台内各类应用是否存在 CVE-2026-16723 高危漏洞风险。
用户只需登录观测云平台,依次进入【安全检测】-【检测规则】页面,打开【官方检测库】,检索 Fastjson 相关检测规则并勾选启用,即可快速创建检测任务、批量筛查业务风险。

当前规则的判断标准如下:
| 规则项 | 配置 |
|---|---|
| 执行频率 | 每小时一次 |
| 查询窗口 | 最近一小时 |
| 实例维度 | runtime_id |
| 组件坐标 | 精确等于 com.alibaba:fastjson |
| 版本范围 | ^1\.2\.(6[8-9]|7[0-9]|8[0-3])$ |
| 风险等级 | critical |
| 重复抑制 | 24 小时 |
| 处置原则 | 命中风险版本即进入必须处理范围 |
该版本判断会命中 1.2.68~1.2.83,不会误报 1.2.67、1.2.84、1.2.83_noneautotype、fastjson2,或名称中偶然带有 “fastjson” 的业务包。
命中后,安全事件会携带以下关键字段:
vulnerability_id=CVE-2026-16723;service、name、host和runtime_id;dependency_name=com.alibaba:fastjson;dependency_version;language_name和language_version;- 修复建议
upgrade_to_fastjson_1.2.84_or_migrate_to_fastjson2。
这使安全团队可以直接定位到具体服务、主机和 JVM 实例,而不是只得到一个无法映射到生产资产的依赖告警。
CSPM 规则发现的是漏洞组件暴露面,不能单独证明是否已经发生攻击。如果版本命中同时伴随异常
@type请求、Java 非预期外联或异常子进程,应立即升级为疑似利用事件并启动应急响应。
检测事件
当安全规则触发后,我们在【信号】栏目可以看到触发的服务。

事件详情记录了应用实例、版本及修复方法等。

链路
CSPM 可完成 Fastjson 库层面的漏洞检测,同时可结合调用链进一步确认漏洞是否真实发生执行,这点尤为关键。

Java 代码如下:
/** 漏洞端点:返回 Object */
@PostMapping("/parse")
public Object parse(@RequestBody String payload) {
return JSON.parse(payload);
}
- 接口用 JSON.parse(payload) 直接解析请求体;
- 类加载交给 Spring Boot fat-jar 的 LaunchedURLClassLoader(可解析 jar: 嵌套 URL);
- 未开启 safeMode(autoTypeSupport 默认 false 即可被 @JSONType 信任后门绕过)。
Fastjson 支持通过 @type 指定反序列化目标类型:
{"@type":"com.example.fastjsonrce.poc.Pwn"}
- 当
@type指向的类带有@JSONType注解,且该类的字节码能被当前 ClassLoader 通过getResourceAsStream()成功读取时; - Fastjson 会将此类判定为"可信类型"直接放行;
- 从而绕过了 deny/accept 黑名单,即使
autoTypeSupport=false也依然生效; - 类被实例化时触发
<clinit>静态初始化块,实现任意命令执行。
通过这个调用链,不难看到接口 requestbody 注入了 @type,最终执行了 sh 指令,这只是一个简单的模拟。
简单说:只要你的应用用 Fastjson 解析了不可信输入,且未开启 SafeMode,攻击者就能借"类加载 + 类初始化"执行任意系统命令。
告警
也可以配置告警通知相关成员进行修复。

五、漏洞修复建议
1. 优先升级到 Fastjson 1.2.84
仍需使用 Fastjson 1.x 的项目,应升级到官方修复版本:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.84</version>
</dependency>
升级后必须重新构建、发布并重启所有 Java 实例。仅修改 pom.xml,不会改变已经运行的 JVM。
2. 无法立即升级时先启用应急措施
可以启用 SafeMode:
java -Dfastjson.parser.safeMode=true -jar app.jar
或在代码初始化阶段设置:
ParserConfig.getGlobalInstance().setSafeMode(true);
也可以临时切换到官方 noneautotype 构建:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83_noneautotype</version>
</dependency>
SafeMode 和 noneautotype 可能影响依赖 AutoType 的业务功能,实施前需要完成兼容性测试。它们可以作为有效的应急控制,但不应替代长期升级计划。
3. 长期迁移到 fastjson2
针对 CVE-2026-16723,fastjson2 不受影响。迁移时应使用当前受支持版本,并完整回归日期、枚举、泛型、注解、多态解析和历史数据兼容性。
如果业务确实需要多态能力,不要直接开启 JSONReader.Feature.SupportAutoType,应使用严格白名单。
4. 修复后使用观测云验收
修复不能以“代码已经合并”结束,而应确认生产运行态真正发生变化:
- 重新构建、发布并重启全部实例;
- 等待 DataKit
ddtrace采集器更新tracing_serviceCO 数据; - 使用本文 DQL 逐个检查
runtime_id; - 确认不再加载 Fastjson 1.2.68~1.2.83;
- 确认新的 CSPM 检测周期不再产生该漏洞命中;
- 将修复后的运行时依赖证据附到漏洞工单中。
同时建议在 CI 中加入 SCA 或 Maven Enforcer 门禁,限制业务容器非必要出网,并结合 WAF、日志、网络和主机行为持续检测异常 @type、远程资源加载与 Java 子进程。
总结
漏洞治理的最终目标,不只是 “找到一个有问题的 pom.xml”,而是确认每一台生产环境的 JVM 进程,运行时都不再加载漏洞版本的组件。将传统静态扫描能力与观测云运行时 CO 采集数据相结合,能够打通发现‑定位‑修复‑验收的全链路,形成完整的漏洞治理闭环,真正落地生产侧风险验证,避免静态扫描与实际运行状态不一致带来的漏判。
参考资料
> 声明:本文仅用于安全防御、风险排查与授权测试。请勿在未授权环境中进行漏洞利用。


