漏洞名称
:
Nginx DNS Resolver Off-by-One
堆写入漏洞 CVE-2021-23017
组件名称
: Nginx
影响范围
:
0.6.18 ≤ Nginx ≤ 1.20.0
漏洞类型
: 远程代码执行
利用条件
:
1、用户认证:不需要用户认证
2、前置条件:启用 DNS resolver
3、触发方式:远程
综合评价
:
:一般,无需授权即可远程代码执行。
:高危,能造成远程代码执行。
Nginx (engine x) 是款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
2021年5月28号,深信服安全团队监测到一则Nginx组件存在Off-by-One 堆写入漏洞的信息,漏洞编号:CVE-2021-23017,漏洞威胁等级:高危。
该漏洞是由于Nginx在将未压缩的域名放入缓冲区时,并没有将到前面计算出的未压缩的DNS域名大小作为参数,攻击者可利用该漏洞在未授权的情况下,构造恶意数据执行如远程代码执行攻击,最终获取服务器最高权限。
Nginx中通过ngx_resolver_copy()函数来验证和解压缩DNS响应中包含的每个DNS域名,接收网络数据包和一个指向被处理的域名指针,并在成功后返回指向新分配缓冲区的指针,该缓冲区包含未压缩的DNS名称。该函数大致可分为两步完成:
1.计算未压缩的域名大小的长度并验证输入包的合法性,丢弃包含大于128个指针或包含超出输入缓冲区边界的域名。
2.分配输出缓冲区,并将未压缩的域名复制到其中。
查看nginx/1.18.0源码,可以发现每次处理URL的标签部分非0时,都会在这个标签后面添加一个.字符,而在最后的标签后面时不需要加.字符的,而该程序中加入了.字符,导致off-by-one漏洞,如果计算的大小恰好与堆块大小对齐,则超出范围的点字符将覆盖下一个堆块长度的元数据中的最低有效字节。这可能会直接导致下一个堆块的大小写入,但还会覆盖3个标志,从而导致 PREV_INUSE被清除并 IS_MMAPPED被设置。
攻击向量分析:
DNS响应可以通过多种方式触发漏洞。
首先,Nginx必须发送了DNS请求,并且必须等待响应。然后,可以在DNS响应的多个部分放入payload:
DNS Questions QNAME,
DNS Answers NAME,
DNS Answers RDATA for CNAME and SRV responses,
通过在多处位置控制输入(QNAME,NAME,RDATA),可以在处理响应时多次触发漏洞函数,从而有效地执行多次内存读写操作。
此外,当攻击者提供中毒的CNAME时,它将以递归方式解决,从而在执行过程中触发了额外的OOB写操作 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)。
用于“example.net”请求的DNS响应示例负载,其中包含被污染的CNAME:
ngx_strlow源码如下,作用是将src前面长度为n的大写字母转换为小写字母并存入dst中
#define ngx_tolower(c) (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)
void ngx_strlow(u_char *dst, u_char *src, size_t n);
void
ngx_strlow(u_char *dst, u_char *src, size_t n)
{
while (n) {
*dst = ngx_tolower(*src);
dst++;
src++;
n--;
}
搭建nginx组件nginx/1.18.0版本环境,复现该漏洞,效果如下:
Nginx 可以在大多数 Unix、Linux 系统上编译运行,并有 Windows 移植版。Nginx主要在美国和中国使用量最高,在全球约有1亿以上的服务器。Nginx 在中国境内主要分布在中国台湾、中国香港。
目前受影响的Nginx版本:0.6.18-1.20.0
Nginx 目录下输入:nginx -v 即可查看版本号。
当前官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:
https://nginx.org/
升级方法:
在官网找到最新的版本进行下载并按照步骤安装即可。
【
深信服安全云眼
】在漏洞爆发之初,已完成检测更新,对所有用户网站探测,保障用户安全。不清楚自身业务是否存在漏洞的用户,可注册信服云眼账号,获取30天免费安全体验。
注册地址:http://saas.sangfor.com.cn
【
深信服云镜
】在漏洞爆发第一时间即完成检测能力的发布,部署了云镜的用户可以通过升级来快速检测网络中是否受该高危风险影响,避免被攻击者利用。离线使用云镜的用户需要下载离线更新包来获得漏洞检测能力,可以连接云端升级的用户可自动获得漏洞检测能力。