Fastjson2AutoType哈希校验绕过致RCE分析"

admin 2026-10-21 08:28:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

Fastjson2 AutoType 哈希校验绕过致RCE分析

哈拉少安全小队

2026年7月27日 20:48
广东

在小说阅读器读本章

去阅读

以下文章来源于鉴帷安全
,作者圣火喵喵教

鉴帷安全
.

原来积木可以这么拼

垂死上班惊坐起,突然看到长亭发了一个fastjson2的原创 0day,让我们来康康,这个洞是怎么个事。 根据长亭公众号的描述,该漏洞源于 Fastjson2 在默认配置下未启用SupportAutoType 时,仍可能处理通用对象元素开头@type 属性。其“AutoType 已禁用”校验分支会将输入字符串的增量 FNV-1a 哈希与默认接受哈希进行匹配,但命中后不会确认实际文本是否等于预期的白名单类名。所以,可以针对任意前缀计算FNV chosen-prefix碰撞,使 URL 形态的字符串进入应用的类加载器,导致任意代码执行。

在默认情况下,Fastjson2 默认不会随便根据 JSON 里的 @type 加载任意类。不过在 ObjectReaderProvider.checkAutoType() 中,存在一段基于 FNV-1a 哈希的白名单判断逻辑。

如果前缀校验和最终加载的类名不是同一个字符串,就可能出现校验对象与实际使用对象不一致的问题。

话不多说,让我们康康源码

git clone https://github.com/alibaba/fastjson2.git

根据漏洞描述,定位关键位置:core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderProvider.java;848:872

重点方法:

checkAutoType(String typeName, Class<?> expectClass, long features)

大致逻辑是酱紫:

if (!autoTypeSupport) {long hash = MAGIC_HASH_CODE;for (int i = 0; i < typeNameLength; ++i) {char ch = typeName.charAt(i);if (ch == '$') {            ch = '.';        }        hash ^= ch;        hash *= MAGIC_PRIME;// white listif (Arrays.binarySearch(acceptHashCodes, hash) >= 0) {            clazz = loadClass(typeName);if (clazz != null && expectClass != null && !expectClass.isAssignableFrom(clazz)) {throw new JSONException(\"type not match. \" + typeName + \" -> \" + expectClass.getName());            }if (clazz != null) {                afterAutoType(typeName, clazz);            }return clazz;        }    }}if (!autoTypeSupport) {return null;}

这段代码不是一次性计算完整 typeName 的哈希,而是逐个字符算运行中的哈希值,也就是说,假设传入:prefix + suffix

程序会先算:FNV(prefix 的第 1 个字符);  FNV(prefix 的前 2 个字符); ... FNV(prefix); FNV(prefix + suffix)如果其中某一个前缀的哈希刚好命中 acceptHashCodes的话,代码就会通过校验,你就算吧,算到天荒地老。但后面真正传给 loadClass() 的却是完整的:prefix + suffix,这是问题所在,白名单校验实际上是某个前缀,尝试加载都得是完整的类名,两个东西不是一个值简单说,就是“检查时看的是 A,使用时却用了 A+B”。

默认白名单哈希

代码里提到了一个默认hash,我是找了半天没找到对应的初始位置-6293031534589903644L hex:0xa8aaa929446ffce4这个在历史提交记录里应该是有的,俺不找了。

可能的思路

理论上,只要构造一个类名字符串,使它的某个前缀满足:FNV-1a(prefix) == 某个白名单哈希

之后组件就会直接尝试加载完整字符串:loadClass(prefix + suffix)

不过,就算能命中哈希不代表一定能利用成功。目前就默认条件来看,这个漏洞还是有些需要运气,我是比较菜,没复现出来。

按照长亭给的修复意见

  1. 完全禁用 AutoType:开启 SafeMode 来完全禁用 AutoType 功能,从根本上杜绝此类风险。代码配置:ParserConfig.getGlobalInstance().setSafeMode(true);JVM 参数:-Dfastjson.parser.safeMode=true
  2. WAF规则配置:拦截请求体中key包含 @type 字段的 JSON 数据

Fastjson2AutoType哈希校验绕过致RCE分析" 网络安全文章

Fastjson2AutoType哈希校验绕过致RCE分析"

该文档分析了Fastjson2中一个AutoType哈希校验绕过漏洞,该漏洞源于默认配置下FNV-1a哈希白名单校验逻辑缺陷,攻击者可构造特定前缀的类名字符串绕过校验,导致任意代码执行。关键发现是校验时使用前缀哈希,而加载时使用完整类名,存在不一致。可操作建议包括启用SafeMode完全禁用AutoType或配置WAF规则拦截@type字段。
ChatGPTAgentForger漏洞可能通过钓鱼链接部署流氓工作区代理" 网络安全文章

ChatGPTAgentForger漏洞可能通过钓鱼链接部署流氓工作区代理"

OpenAIChatGPT工作区代理存在AgentForger漏洞(CVE-2026-40217等),攻击者可通过钓鱼链接利用CSRF在受害者认证会话中自动创建并授权恶意AI代理,实现持久化控制、数据窃取和横向移动。该漏洞源于构建器通过URL参数接受初始状态并自动提交提示,需受害者登录且拥有授权连接器。OpenAI已披露并计划于2026年11月弃用该产品。建议用户警惕可疑链接并限制连接器权限。
使用Grok破解一切" 网络安全文章

使用Grok破解一切"

本文介绍网安人员使用grokAI工具的方法。grok是马斯克旗下x公司的大模型,道德低但能力比肩claude,适用于渗透测试、逆向、软件编写、代码审计、安全研究等场景。通过MCPskills可全自动渗透测试,效率远超人类。建议网安人员利用grok的plan模式处理复杂任务,并注意破限容易、多agent互联等特性。
评论:0   参与:  0