Nginx暴露危漏洞CVE-2021-23017

日前著名Web服务器和反向代理服务器Nginx暴严重漏洞NS解析器Off-by-One堆写入漏洞,该漏洞存在于Nginx的DNS解析模块ngx_resolver_copy()。攻击者可以利用该漏洞进行远程DDos攻击,甚至远程执行。

概述

ngx_resolver_copy()在处理DNS响应时出现一个off-by-one错误,利用该漏洞网络攻击者可以在堆分配的缓冲区中写一个点字符(.’, 0x2E)导致超出范围。 所有配置解析器语法的(resolver xxxx)Nginx实例可以通过DNS响应(响应来自Nginx的DNS请求)来触发该漏洞。 特制数据包允许使用0x2E覆盖下一个堆块元数据的最低有效字节,利用该漏洞攻击者,可以实现Ddos拒绝服务,甚至可能实现远程代码执行。

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

漏洞影响

严重等级: 高

漏洞向量: 远程/DNS

确认的受影响版本: 0.6.18-1.20.0

确认的修补版本: 1.21.0,1.20.1

供应商: F5,Inc.

状态: 公开

CVE: CVE-2021-23017

CWE: 193

CVSS得分: 8.1

CVSS向量:CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C

漏洞分析

当Nginx配置中设置resolver时,Nginx DNS解析器(core/ngx_resolver.c)用于通过DNS解析多个模块的主机名。

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

  • 计算未压缩的域名大小的长度len并验证输入包的合法性,丢弃包含大于128个指针或包含超出输入缓冲区边界的域名。
  • 分配输出缓冲区,并将未压缩的域名复制到其中。

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

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

  1. // 1) copy the label to the output buffer, 
  2. ngx_strlow(dst, src, n); 
  3. dst += n; 
  4. src += n; 
  5. // 2) read next character, 
  6. n = *src++; 
  7. // 3) as its a pointer, its not NUL, 
  8. if (n != 0) { 
  9. // 4) so a dot character that was not accounted for is written out of bounds 
  10. *dst++ = '.'; 
  11. // 5) Afterwards, the pointer is followed, 
  12. if (n & 0xc0) { 
  13. n = ((n & 0x3f) << 8) + *src; 
  14. src = &buf[n]; 
  15. n = *src++; 
  16. // 6) and a NULL byte is found, signaling the end of the function 
  17. if (n == 0) { 
  18. name->len = dst - name->data; 
  19. return NGX_OK; 

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

  1. ==7863== Invalid write of size 1 
  2. ==7863== at 0x137C2E: ngx_resolver_copy (ngx_resolver.c:4018) 
  3. ==7863== by 0x13D12B: ngx_resolver_process_a (ngx_resolver.c:2470) 
  4. ==7863== by 0x13D12B: ngx_resolver_process_response (ngx_resolver.c:1844) 
  5. ==7863== by 0x13D46A: ngx_resolver_udp_read (ngx_resolver.c:1574) 
  6. ==7863== by 0x14AB19: ngx_epoll_process_events (ngx_epoll_module.c:901) 
  7. ==7863== by 0x1414D4: ngx_process_events_and_timers (ngx_event.c:247) 
  8. ==7863== by 0x148E57: ngx_worker_process_cycle (ngx_process_cycle.c:719) 
  9. ==7863== by 0x1474DA: ngx_spawn_process (ngx_process.c:199) 
  10. ==7863== by 0x1480A8: ngx_start_worker_processes (ngx_process_cycle.c:344) 
  11. ==7863== by 0x14952D: ngx_master_process_cycle (ngx_process_cycle.c:130) 
  12. ==7863== by 0x12237F: main (Nginx.c:383) 
  13. ==7863== Address 0x4bbcfb8 is 0 bytes after a block of size 24 alloc'd 
  14. ==7863== at 0x483E77F: malloc (vg_replace_malloc.c:307) 
  15. ==7863== by 0x1448C4: ngx_alloc (ngx_alloc.c:22) 
  16. ==7863== by 0x137AE4: ngx_resolver_alloc (ngx_resolver.c:4119) 
  17. ==7863== by 0x137B26: ngx_resolver_copy (ngx_resolver.c:3994) 
  18. ==7863== by 0x13D12B: ngx_resolver_process_a (ngx_resolver.c:2470) 
  19. ==7863== by 0x13D12B: ngx_resolver_process_response (ngx_resolver.c:1844) 
  20. ==7863== by 0x13D46A: ngx_resolver_udp_read (ngx_resolver.c:1574) 
  21. ==7863== by 0x14AB19: ngx_epoll_process_events (ngx_epoll_module.c:901) 
  22. ==7863== by 0x1414D4: ngx_process_events_and_timers (ngx_event.c:247) 
  23. ==7863== by 0x148E57: ngx_worker_process_cycle (ngx_process_cycle.c:719) 
  24. ==7863== by 0x1474DA: ngx_spawn_process (ngx_process.c:199) 
  25. ==7863== by 0x1480A8: ngx_start_worker_processes (ngx_process_cycle.c:344) 
  26. ==7863== by 0x14952D: ngx_master_process_cycle (ngx_process_cycle.c:130) 

虽然目前还没有Poc出来,理论上该漏洞可以被用来进行远程代码执行。

攻击向量分析

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

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

  • DNS问题QNAME,
  • DNS回答名称,
  • DNS会回答RDATA以获得CNAME和SRV响应,
  • 通过使用多个中毒的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:

稍微不同的有效负载(poc.py中的有效负载)填充了足够的字节以覆盖 next_chunk.mchunk_size带点的最低有效字节:

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

漏洞修复和解决

通过向域名解析时,在域名末尾写入的伪造的点字符分配一个额外的字节可以缓解此问题。

受漏洞影响的配置

  1. daemon off; 
  2. http{ 
  3. access_log logs/access.log; 
  4. server{ 
  5. listen 8080; 
  6. location / { 
  7. resolver 127.0.0.1:1053; 
  8. set $dns example.net; 
  9. proxy_pass $dns; 
  10. events { 
  11. worker_connections 1024; 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/136534.html<

(0)
运维的头像运维
上一篇2025-03-02 03:22
下一篇 2025-03-02 03:23

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注