打开微信“扫一扫”,开启安全数字世界之旅
截图或长按保存至相册,使用微信扫一扫
首页 > 安全通告

安全通告

威胁直击 | NGINX DNS解析程序存高危漏洞
发布时间 :2021年05月28日
分享:

漏洞描述:


近日,亚信安全应急响应中心监测到Nginx发布安全公告,修复了Nginx解析器中的一个DNS解析程序漏洞(CVE-2021-23017),由于函数ngx_resolver_copy()在处理DNS响应时出现了一个off-by-one错误(也称:单字节溢出),这种错误通常在当迭代太多或太少时出现,该漏洞只需网络攻击者伪造指定DNS服务器的UDP数据包就可以导致在堆分配的缓冲区中一个字节被覆盖。 所有配置解析器语法的实例都可以通过DNS响应(响应来自Nginx的DNS请求)来触发该漏洞。 特制数据包允许使用一个点字符(.’, 0x2E)覆盖下一个堆块元数据的最低有效字节,攻击者利用该漏洞,可以实现DDOS拒绝服务,甚至实现远程代码执行。


202111151636984075939089206.jpg


由于Nginx中缺乏DNS欺骗缓解措施,并且在检查DNS事务ID之前调用了易受攻击的功能,因此远程攻击者可能能够通向中毒服务器注入受毒的DNS响应来利用此漏洞。


Nginx是高性能的异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存,其在全球web服务器中的占有率常年位居最高。


目前漏洞细节已被披露,亚信安全应急响应中心建议受影响的用户尽快升级,避免导致黑客攻击利用。


漏洞编号:


CVE-2021-23017


漏洞等级:


高危,CVSS评分8.1


受影响的版本:


NGINX 0.6.18 – 1.20.0


安全版本:


NGINX Open Source 1.20.1 (stable)

NGINX Open Source 1.21.0 (mainline)

NGINX Plus R23 P1

NGINX Plus R24 P1


漏洞分析:

当Nginx配置中设置resolver时(如:resolver 127.0.0.1:8088),Nginx DNS解析器(core/ngx_resolver.c)可以通过DNS解析多个模块的主机名。


Nginx中通过ngx_resolver_copy()调用来验证和解压缩DNS响应中的每个DNS域名,接收网络数据包作为输入和指向正在处理的名称的指针,并在成功后返回指向包含未压缩名称的新分配缓冲区的指针。调用整体上分两步完成:


1)通过计算未压缩的域名大小的长度len并验证输入包的合法性,丢弃包含大于128个指针或包含超出输入缓冲区边界的域名。

2)分配输出缓冲区,并将未压缩的域名复制到其中。


第1部分中的大小计算与第2部分中的未压缩的域名之间的不匹配,导致一个len的一个off-by-one错误,从而允许以一个字节为单位写一个点字符超出name->data的边界。


当压缩名称的最后一部分包含一个指向NUL字节的指针时,就会发生计算错误。尽管计算步骤仅考虑标签之间的点,但每次处理标签并且接着的字符为非NUL时,解压缩步骤都会写入一个点字符。当标签后跟指向NUL字节的指针时,解压缩过程如下:


202111151636984128795020787.jpg


如果计算的大小恰好与堆块大小对齐,则超出范围的点字符将覆盖下一个堆块长度的元数据中的最低有效字节。这可能会直接导致下一个堆块的大小写入,但还会覆盖3个标志,从而导致PREV_INUSE被清除并且IS_MMAPPED被设置。


202111151636984140865087937.jpg


攻击向量分析:


DNS响应可以通过多种方式触发漏洞。


首先,Nginx必须发送了DNS请求,并且必须等待响应。然后,可以在DNS响应的多个部分进行投毒:


DNS Questions QNAME


DNS Answers NAME


DNS Answers RDATA for CNAME and SRV responses



通过使用多个中毒的QNAME,NAME或RDATA值制作响应,可以在处理响应时多次击中易受攻击的函数,从而有效地执行多次脱机写入。


此外,当攻击者交付中毒的CNAME时,它将递归解析,在ngx_resolve_name_locked()调用ngx_strlow()(ngx_resolver.c:594)期间触发额外的OOB写入,并在ngx_resolver_dup()(ngx_resolver.c:790)和ngx_crc32_short()(ngx_resolver.c:596)期间触发额外的OOB读取。


用于“example.net”请求的DNS响应示例负载,其中包含被污染的CNAME:


202111151636984171596073530.jpg


该POC中payload填充了足够的字节来覆盖next_chunk.mchunk_size带点的最低有效字节:


202111151636984196078027737.jpg


24字节的标签导致分配了24字节的缓冲区,该缓冲区填充有24字节+一个超出范围的点字符。


漏洞修复:


1)官方升级

目前官方已在最新版本中修复了该漏洞,请受影响的用户尽快升级版本进行防护,官方下载链接:http://nginx.org/en/download.html


2)其他防护措施

若相关用户暂时无法升级nginx至新版本,也可安装补丁进行修复:

http://nginx.org/download/patch.2021.resolver.txt 


分享到微信
X