v1.2.70-FastJson的AutoType机制研究
v1.2.70-FastJson的AutoType机制研究
最近在对接Alexa亚马逊语音技能,Smart Home Skill Apis
时,有一个配置的JSON字符串是这样的:
{ "capabilityResources": {"friendlyNames": [{"@type": "asset","value": {"assetId": "Alexa.Setting.Opening"}}]}}
在开发配置,只当是一个普通的字符串;直到单测开始,在解析这行字符串成JSONObject对象的时候报错,同时也抛出了一个异常:
Exception in thread "main" com.alibaba.fastjson.JSONException: autoType is not support. asset
fastjson版本是:
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency>
autoType is not support,是什么含义,为什么fastjson独对这个字符串进行了check设置了ParserConfig.checkAutoType
方法?
auToType问题
首先简单的解释一下为什么序列化中需要 引入AutoType
;
假设存在一个类,和一个接口:
public interface Father{}
public class Son implements Father{private Integer age;
}
构建出Son类后,json会将类型抹去,只保留顶级接口类型,使之反序列化时拿不到原先的Son类。
因此FastJson中就使用了"@type":"com.xx.xx.Son"
指定json串反序列化时的类型;这种设置在Redis中也有体现,采用的是
{"com.xx.xx.Son","age":1
}
的形式.
那么就带来了一个严重的问题#
在FastJson反序列的过程中,会通过@type构造类,并且根据后续的key调用其setter方法。
那么有经验的人可能有解除过,JAVA中存在着大量的风险类:
com.sun.rowset.JdbcRowSetImpl
:这个类在被实例化时会自动连接数据库,存在潜在的安全风险。java.lang.Runtime
:java.lang.Runtime
类在被实例化时会自动获取运行时对象,可以用于执行系统命令。java.lang.ProcessBuilder
:java.lang.ProcessBuilder
类在被实例化时会自动启动一个进程,可能导致系统被恶意利用。javax.script.ScriptEngineManager
:这个类在被实例化时会加载脚本引擎,存在潜在的安全风险。java.util.logging.FileHandler
:java.util.logging.FileHandler
类在被实例化时会自动创建日志文件,可能导致文件系统被攻击。
拿例子最多,也是早年攻击最频繁的JdbcRowSetImpl
一说:
将 JSON字符串
{"@type": "com.sun.rowset.JdbcRowSetImpl","dataSourceName": "rmi://127.0.0.1:8888/Error","autoCommit": true
}
通过抓目标服务器JAVA,WEB应用的请求包,重新reSend一次;
然后jdk会在解析过程中构建 JdbcRowSetImpl
类,实现rmi远程调用的攻击;
不止如此,由于@type指定类的多样性,在获取到对方源码之后。
还可以通过此解析构造的模式直接从项目内部做出高危风险的操作。
因此FastJson在1.2.25版本后,推出完整的AutoType机制,开始了与黑客的 checkAutotype
博弈
CheckAutoType源码问题定位
因为每个版本的FastJson对checkAutoType都有大大小小的优化,贴图的代码版本是1.2.7
。
第一次过滤:
1/
首先在1.2.68
版本中,引入的safeMode,为JSONObject对象初始化的时候会根据是否配置 fastjson.parser.safeMode
值进行开启安全模式,默认为false;在safeMode模式下,无论白名单和黑名单,都不支持autoType,这样可以杜绝反序列化Gadgets类变种攻击,需要通过ParserConfig.getGlobalInstance().setSafeMode(true);
开启
安全模式:取消 @type
指定类解析的机制
2/
下面的类型名>=192,小于<3,意义不明;
不过,围绕名字有一个有趣的地方;
因为事关类解析,所以fastjson没有对 @type:“xxxx”,xxxx为整形时的内容做任何限制;
所以
{"@type":"123"
}
是可以正常解析的
取消指定于3,则是???,意义不明
第二次过滤:
3/
这里为符号过滤,取第一个符号以及最后一个符号进行描述符检查,过滤字符串为 [
和 L
这两个字符的含义是:
[
字符:这个字符在 Java 中通常用于表示数组类型,恶意攻击者可能利用这个字符来构造恶意的数组类型,从而绕过安全检查,执行恶意代码。L
字符:这个字符在 Java 中通常用于表示类的全限定名,恶意攻击者可能利用这个字符来构造恶意的类名,从而触发恶意行为。
在 1.2.43
中进行的修复。
第三次过滤
4/
上一段为最暴力的黑名单过滤;
与黑客斗智斗勇中进化,从过去的类名名单判断,到现在使用hashCode散列存储的方式;
一是掩盖了当前黑名单的类,二是代码性能极大提高;
5/
下面一段先是使用通过typeName
和INTERNAL_WHITELIST_HASHCODES
的计算寻址得到的boolean类型判断是否进入黑白名单的判断。
内部代码为,如果在白名单内则直接加载类,结束本次 checkAutoType
;
否则直接抛出异常
第四次过滤
6/
从deserializers、typeMapping、白名单中获得class;
判断其是否为解析目标时,指定类型的子类;
如果为否,则直接抛出异常;
AutoType关闭时过滤:

直接针对FastJson现有的黑名单以及白名单进行判断
最后一次过滤

针对类型的判断,高危接口:DataSource、RowSet、ClassLoader;
即使黑客前面绕的再好,也不会放开这三个涉及项目加载器,数据库DB的顶级接口;
最后也是判断一个构建出来的类是否已经存在了已经构建完成的构造器,如果存在,则一定是黑客为了绕开检车伪装的类。
因此重复构造直接抛出错误
总结
FastJson的漏洞与更新几乎都是围绕着checkAutoType进行,因为一款JSON化的工具,再本身性能难以再度突破的前提下,保证使用者的安全体验是衡量各个工具之间的重中之重。
但由由于FastJson在国内广泛的使用,而不管目前如何去更新,总有漏洞会为版本买单。
所以很多人也在Git上发起issues抗议这些问题:

讨论度也非常高,也有人不懂@type的存在意义。了解的人能知道,这也是无奈之举,像jackson中也引入了类型的@Class
关键字
大伙也需要给开源者,开源项目更多耐心;
在使用上,可以和开源这个项目的公司[阿里巴巴]一致,默认没有autoType或者直接开启安全模式一刀切
版权声明:本站原创文章,于2024-02-23,乐云一发表
转载请注明:https://leyunone.com/normal-notes/fastJson-warn.html
相关文章:

v1.2.70-FastJson的AutoType机制研究
v1.2.70-FastJson的AutoType机制研究 最近在对接Alexa亚马逊语音技能,Smart Home Skill Apis时,有一个配置的JSON字符串是这样的: { "capabilityResources": {"friendlyNames": [{"type": "asset",…...

老旧机子装linux——Xubuntu
目录 前言 正文 下载系统 编辑 制作系统盘: 安装界面 Xubuntu 编辑 lubuntu 后语 前言 有两台电脑,一台装了Ubuntu22,一台装了debuntu。虽然debuntu界面与乌班图大体一样,但是编译器好像有点区别。由于机子为10年前的老…...
关于Redis中事务
事务的四个特性 Redis到底有没有原子性 Redis中的原子性不同于MySQL,相比于MySQL,Redis中的原子性几乎不值一提。 MySQL中的原子性,不仅仅是“要么全都执行,要么全都不执行”,它还保证了“一旦执行,结果…...

【数据分享】《中国文化文物与旅游统计年鉴》2022
最近老有同学过来询问《中国旅游年鉴》、《中国文化文物统计年鉴》、《中国文化和旅游统计年鉴》、《中国文化文物与旅游统计年鉴》,这四本年年鉴的关系以及怎么获取这四本年鉴。今天就在这里给大家分享一下这四本年鉴的具体情况。 实际上2018年,为适应…...
设计模式及其在软件开发中的应用
一、技术难点 设计模式在软件开发中扮演着至关重要的角色,但它们的应用也伴随着一系列技术难点。 模式选择与识别:在实际项目中,正确识别和选择合适的设计模式是一个挑战。不同的设计模式适用于不同的场景,错误的选择可能导致系统…...

LeetCode72编辑距离
题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组,尺寸和这两个字符串的长度相等,用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的,只不过相比1143的一种方式,变成了三种方式,就…...

竞拍商城系统源码后端PHP+前端UNIAPP
下载地址:竞拍商城系统源码后端PHP前端UNIAPP...
千益畅行,共享旅游卡,灵活同行,畅游无忧的全方位解析
千益畅行,共享旅游卡,满足您多样化的同行出行需求 近期,关于千益畅行共享旅游卡的咨询热度不减,尤其是关于其同行人数的限制问题。为了给大家一个清晰的解答,我们深入探讨了该旅游卡的特点和优势。 千益畅行共享旅游…...

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)
前言 前面两篇文章,我们简单讲述了 WebContainer/api 、Terminal 的基本使用,离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor ,来实现初级代码编辑功能,讲述的是整个应用的搭建,并不单独针对monac…...
Less is more VS 精一 [生活感悟]
"Less is More”和王阳明的“精一”思想确实有相似之处。 王阳明的“精一”思想强调的是专注于一件事,将其做到极致,这与"Less is More”中提倡的通过减少数量来提高质量的理念不谋而合。两者都强调了专注和深度的重要性,而不是追…...

函数的概念及图像
注: 判断两函数是否相同,只看定义域和对应法则。 1. 函数的定义 一般的,在一个变化过程中有两个变量 x,y。如果对于x在某个变化范围内的每一个确定值,按照某个对应法则,都有唯一确定的值y和他对应。那么y就…...

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)
🏡作者主页:点击! 👨💻Linux高级管理专栏:点击! ⏰️创作时间:2024年6月3日11点44分 🀄️文章质量:95分 为了更好地控制对网站资源的访问,可…...

滚动条详解:跨平台iOS、Android、小程序滚动条隐藏及自定义样式综合指南
滚动条是用户界面中的图形化组件,用于指示和控制内容区域的可滚动范围。当元素内容超出其视窗边界时,滚动条提供可视化线索,并允许用户通过鼠标滚轮、触屏滑动或直接拖动滑块来浏览未显示部分,实现内容的上下或左右滚动。它在保持…...

06 Linux 设备驱动模型
1、Overview Linux-2.6 引入的新的设备管理机制 - kobject 降低设备多样性带来的 Linux 驱动开发的复杂度,以及设备热拔插处理、电源管理等将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口驱动的开发,就简化为对内核所规定的数据结构的填充和实现驱动模型是 Linu…...

检测五个数是否一样的算法
目录 算法算法的输出与打印效果输出输入1输入2 打印打印1打印2 算法的流程图总结 算法 int main() {int arr[5] { 0 };int i 0;int ia 0;for (i 0; i < 5; i) { scanf("%d", &arr[i]); }for (i 1; i < 5; i) {if (arr[0] ! arr[i]) {ia 1;break;} }…...

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据
后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…...

【机器学习】消息传递神经网络(MPNN)在分子预测领域的医学应用
1. 引言 1.1. 分子性质预测概述 分子性质预测是计算机辅助药物发现流程中至关重要的任务之一,它在许多下游应用如药物筛选和药物设计中发挥着核心作用: 1.1.1. 目的与重要性: 分子性质预测旨在通过分子内部信息(如原子坐标、原…...

Python Flask实现蓝图Blueprint配置和模块渲染
Python基础学习: Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习: Python中如何选择Web开发框架?Pyth…...

Vue10-事件修饰符
一、示例:<a>标签不执行默认的跳转行为 1-1、方式一 <a href"http://www.baidu.com" onclick"event.preventDefault();">点击我</a> 1-2、方式二 1-3、方式三:事件修饰符 二、Vue的六种事件修饰符 2-1、prevent&…...
oracle中如何查询特定日期?
1. select last_day(to_date(20230101,YYYYMMDD)) from dual; select last_day(to_date(V_END_DATE,YYYYMMDD)) from dual; --查询任意一天 当月的最后一天 2. select to_char(to_date(20230101,YYYYMMDD)-1,YYYYMMDD) INTO V_START_DATE FROM DUAL; select to_char(to_dat…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...