Fastjson 高危 RCE(CVE-2026-16723):如何用观测云快速发现并完成修复

本文针对 Fastjson 高危 RCE 漏洞 CVE‑2026‑16723,剖析其影响与利用条件,指出 Maven 静态排查的局限。观测云依托 ddtrace 运行时数据,完成漏洞检测定位告警修复闭环,提供升级、应急防护、迁移 fastjson2 处置方案。

最佳实践
banner.png

近期 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 反序列化入口。

  1. 构造包含异常 @type 的 JSON 请求,请求进入 JSON.parse()JSON.parseObject() 等解析入口。
  2. 特殊类型名进入 checkAutoType() 与资源探测路径,在 AutoType 未开启时仍可绕过原有信任判断。
  3. 借助 Spring Boot 可执行 fat‑jar 的类加载环境处理远程 JAR,Java 服务向攻击者控制的地址发起 DNS 或 HTTP 请求。
  4. 攻击者尝试定位 JVM 已打开的远程资源,攻击链路通常枚举 Linux /proc/self/fd/<n> 文件描述符。
  5. 后续反序列化触发恶意类加载与类初始化,攻击代码获取 Java 服务进程账号对应的运行权限。
  6. 实现远程代码执行,攻击者可继续读取数据、窃取凭据、部署持久化后门或实施内网横向移动。

防守侧可以关注四类信号:

  • 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。

  1. Java Agent 上报服务、运行时与依赖信息。
  2. DataKit ddtrace 采集器接收上报数据,生成 CO 数据。
  3. 将依赖信息写入 CO::tracing_service,对应字段为 app_dependencies_loaded
  4. CSPM 模块解析依赖名称,识别判断 Fastjson 版本号。
  5. 当版本命中 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.671.2.841.2.83_noneautotype、fastjson2,或名称中偶然带有 “fastjson” 的业务包。

命中后,安全事件会携带以下关键字段:

  • vulnerability_id=CVE-2026-16723
  • servicenamehostruntime_id
  • dependency_name=com.alibaba:fastjson
  • dependency_version
  • language_namelanguage_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);
    }
  1. 接口用 JSON.parse(payload) 直接解析请求体;
  2. 类加载交给 Spring Boot fat-jar 的 LaunchedURLClassLoader(可解析 jar: 嵌套 URL);
  3. 未开启 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. 修复后使用观测云验收

修复不能以“代码已经合并”结束,而应确认生产运行态真正发生变化:

  1. 重新构建、发布并重启全部实例;
  2. 等待 DataKit ddtrace 采集器更新 tracing_service CO 数据;
  3. 使用本文 DQL 逐个检查 runtime_id
  4. 确认不再加载 Fastjson 1.2.68~1.2.83;
  5. 确认新的 CSPM 检测周期不再产生该漏洞命中;
  6. 将修复后的运行时依赖证据附到漏洞工单中。

同时建议在 CI 中加入 SCA 或 Maven Enforcer 门禁,限制业务容器非必要出网,并结合 WAF、日志、网络和主机行为持续检测异常 @type、远程资源加载与 Java 子进程。

总结

漏洞治理的最终目标,不只是 “找到一个有问题的 pom.xml”,而是确认每一台生产环境的 JVM 进程,运行时都不再加载漏洞版本的组件。将传统静态扫描能力与观测云运行时 CO 采集数据相结合,能够打通发现‑定位‑修复‑验收的全链路,形成完整的漏洞治理闭环,真正落地生产侧风险验证,避免静态扫描与实际运行状态不一致带来的漏判。

参考资料

  1. Fastjson 官方安全公告:CVE-2026-16723
  2. NVD:CVE-2026-16723
  3. 观测云 DDTrace 集成文档

> 声明:本文仅用于安全防御、风险排查与授权测试。请勿在未授权环境中进行漏洞利用。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台