当前位置:首页 > 体育

fastjson FastJson拒绝服务漏洞分析

Bp==len和ch = = eoi & amp;Bp+1==len认为是iSEOF,但此时bp=10 len=8,后面调用下一个方法只能更大,永远不会满足isEOF的条件,所以上面的putChar(EOI)会无限期执行,sBuf会不断扩展直到OOM。

Emm,但是实际测试中有一些不同。

单线程操作没有OOM异常

第一次运行代码时很快报告了这样一个异常:

NegativeArraySizeException,数组长度为负,没有OOM。

在思想上,在NegativeArraySizeException上做一个异常断点,断点在putChar数组空之间的扩展位置断开:

此时sbuf的长度是1073741824(1g的大小),而sbuf.length的类型是int类型,int类型的最大值是2147483647。

而1073741824×2= 2147483648,刚好一个大,所以溢出:

此时内存占用3.3GB左右。

通过多方查询,java默认最大允许内存是最大物理内存的1/4,应该在5GB左右。此时还没有达到OOM标准,但是因为下溢,先触发了NegativeArraySizeException。

多线程操作触发OOM

既然单线程不行,那就来一大堆,稍微修改一下代码,改成多线程:

import . com . Alibaba . fastjson . JSON;

import . com . Alibaba . fastjson . jsonexception;

公共类fastjsonDos1实现Runnable{

公共静态void main(String[] args) {

新线程(新fastjsonDos1)。开始;

新线程(新fastjsonDos1)。开始;

//新线程(新fastjsonDos1)。开始;

//新线程(新fastjsonDos1)。开始;

//新线程(新fastjsonDos1)。开始;

}

公共无效运行{

String死神_ STRING = " { " a ": x ";

尝试{

object obj = JSON . parse(DEATH _ STRING);

system . out . println(obj);

}catch (JSONException ex){

system . out . println(ex);

}

}

}

我的测试器有20GB内存,两个线程是OOM:

可以看出Thread1首先是OOM,Thread0还是下溢问题,所以虽然线程OOM了,但是java进程并没有挂掉。

为测试编写了一个简单的回弹应用程序。使用burp以10个线程访问,发现虽然一直报告OOM异常,但java进程并没有挂起,内存最终稳定在4GB以上(略小于-Xmx),从而不再触发漏洞,占用的内存也不会减少。

对了,CPU暴涨:

有些想做实验的朋友,可以尝试大幅度改变运行java的-Xmx参数,然后运行,感受一下。(老实人的微笑)

关于OOM

java中的OutOfMemoryError是JVM内部的一个异常,可以被捕获,Kill不会直接导致Java进程被杀死,顶层多线程挂起。

在Linux下,当应用内存超过内存限制时,会触发OOM黑仔机制Kill,以保持系统空正常运行。在linux/mm/oom_kill.c中根据oom_adj选择哪个进程被命名和杀死,被杀死的可能性可以通过设置oom _ adj来调整

所以java默认最大1/4物理内存占用,不容易造成系统OOM(当然我没说的时候你系统的其他进程吃内存怪兽)。

但是,很多关于解决java OOM异常的文章都建议将最大值改为不超过物理内存的80%,这样可能会造成过多的内存占用,被系统Kill。

https://github . com/Alibaba/fastjson/commit/995845170527221 ca 0293 cf 290 e 33 a 7 D6 CB 52 bf7 # diff-aa8d 9 D6 e 56964418428 ff 59 FB 887 afae

https://github . com/Alibaba/fastjson/commit/80b 7 B1 e6d 57 a 722 f 7 CCA 549540394 c 3072 ad 8e CB

https://github . com/Omega-Ariston/fastjson/blob/b 44900 e 5c C2 a 0212992 FD 7f 8 f 0 b 1285 ba 77 bb 35d/src/test/Java/com/Alibaba/JSON/bvt/issue _ 2600/issue 2689 . Java

https://blog.csdn.net/liukuan73/article/details/43238623

1.《fastjson FastJson拒绝服务漏洞分析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《fastjson FastJson拒绝服务漏洞分析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1173419.html

上一篇

康师傅蜂蜜绿茶 曾经火爆的“再来一瓶”,为何现在见不到了?

下一篇

章鱼小丸子的做法 章鱼小丸子的做法

威刚移动硬盘 全球内存模组厂排名第二,很多人不知它家做移动硬盘是杠杠的

手机检测不出sd卡 手机内存卡突然坏了读不出?十二招帮你解决

手机检测不出sd卡 手机内存卡突然坏了读不出?十二招帮你解决

虽然很多手机都在逐渐弱化甚至去除这一功能,但MicroSD卡作为最便宜的存储工具,也被称为TF卡,我们常称之为“内存卡”。虽然名字不准确,但是很好理解。而且我们用的最多。但是在生活中,有时候你会发现你的手机或者读卡器无法读取存储卡,甚至会提示你...

苹果电脑内存不够用怎么办 苹果电脑存储空间不够用怎么办

内存卡数据恢复 内存卡数据恢复简单操作

  • 内存卡数据恢复 内存卡数据恢复简单操作
  • 内存卡数据恢复 内存卡数据恢复简单操作
  • 内存卡数据恢复 内存卡数据恢复简单操作
最小的长度单位

最小的长度单位

目前最小的长度单位是米,1ym = 10 m,1 mm = 1.0570x10光年,1 mm =0.001 m,1 mm =1/1亿纳米,1 mm = 1/1亿毫米。...

米的单位 长度单位——米的演进

米的单位 长度单位——米的演进

一个 长度测量单位——“米”定义的变化 我走进巴黎的法国档案馆,那里保存着最早的公制长度实物基准——“米原器”,后世称之为“档案米尺”。 18世纪以前,世界各国规定自己的长度单位,并不统一。1790年,法国科学院受法国国民议会委托,提出了“公制...

长度计量单位 长度单位——米的演进

长度计量单位 长度单位——米的演进

一个 长度测量单位——“米”定义的变化 我走进巴黎的法国档案馆,那里保存着最早的公制长度实物基准——“米原器”,后世称之为“档案米尺”。 18世纪以前,世界各国规定自己的长度单位,并不统一。1790年,法国科学院受法国国民议会委托,提出了“公制...

笔记本内存多大合适 电脑内存4G和8G差距能有多大?电脑装机内存多大合适?

  • 笔记本内存多大合适 电脑内存4G和8G差距能有多大?电脑装机内存多大合适?
  • 笔记本内存多大合适 电脑内存4G和8G差距能有多大?电脑装机内存多大合适?
  • 笔记本内存多大合适 电脑内存4G和8G差距能有多大?电脑装机内存多大合适?