第1 部分中的大小计算与第2 部分中的域名解压缩之间的不匹配可能会导致len 中出现差一错误,从而导致点字符被写入名称和数据的数据边界之外。
如果压缩域名的最后部分包含指向NULL 字节的指针,则会发生计算错误。计算步骤仅考虑标签之间的点,而解压缩步骤每次处理标签时都会写入一个点字符,并且下一个字符不为NULL。如果标签后面跟着一个指向NULL 字节的指针,则解压缩过程如下所示:
//1) 将标签复制到输出缓冲区。
ngx_strlow(dst, src, n);
dst +=n;
源+=n;
//2) 读取下一个字符。
n=*src++;
//3) 它是一个指针,所以它不是NUL。
如果(n!=0){
//4) 因此未说明的点字符被写入超出范围
*dst++=\’.\’;
}
//5) 然后跟随指针。
如果(n0xc0){
n=((n0x3f) 8) + *src;
src=buf[n];
n=*src++;
}
//6) 找到NULL 字节并表示函数结束
如果(n==0){
名称长度=dst – 名称数据;
返回NGX_OK。
}
如果计算出的大小与堆块大小完全匹配,则超出范围写入的任何点字符都将覆盖下一个堆块大小元数据的最低有效字节。这可能会更改下一个堆块的大小,但它也会覆盖三个标志,清除PREV_INUSE 并设置IS_MMAPPED。
鉴于nginx 中有丰富的与用户控制器数据交互的机会以及有记录的先例,该漏洞可能允许攻击者在某些操作系统和架构上执行远程代码。
利用PoC
漏洞利用PoC下载地址:
https://github.com/x41sec/advisories/blob/master/X41-2021-002/poc.py
研究人员可以通过valgrind 并运行nginx 来测试该漏洞。
valgrind –trace-children=yes objs/nginx -p …/runtime -c conf/reverse-proxy.conf
接下来,运行您的DNS 服务器(默认侦听端口1053)。
pythonpoc.py
触发并向目标服务器发送请求。
卷曲http://127.0.0.1:8080/
根据漏洞发生时的堆内存布局,您可能会看到多种不同格式的日志。
将损坏的大小与prev_size 进行比较
2021/04/16 13:35:15 [警报] 2501#0: 工作进程2502 以信号6 终止(核心转储)
malloc(): 以下大小无效(未排序)
2021/04/16 13:35:34 [警报] 2525#0: 工作进程2526 以信号6 终止(核心转储)
然而,valgrind 和AdressSanitizer 都可以检测到此类内存损坏事件。
学习路线:
早期朝这个方向起步相对容易。一旦掌握了一些基本技术,您就可以获取各种现成的工具并开始黑客攻击。然而,如果你想从一个脚本小子转变为一名黑客大师,你越往这个方向发展,你就越需要学习和掌握网络入侵方面的知识。
以上有关#CVE的相关内容来源仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92050.html