NGINX 曝 9.2 分高危漏洞
漏洞概述
科技媒体 cyberkendra 于 5 月 13 日报道,NGINX 被曝一组高危漏洞,已潜伏约 18 年,威胁全球约 三分之一的网络服务器。
本次曝光的具体漏洞编号及评分如下:
| 编号 | 评分 | 等级 |
|---|---|---|
| CVE-2026-42945 | 9.2 | Critical |
| CVE-2026-42946 | 8.3 | High |
| CVE-2026-40701 | 6.3 | Medium |
| CVE-2026-42934 | 6.3 | Medium |
漏洞细节
攻击者无需登录认证,只需发送一条特制 HTTP 请求,就能让 NGINX 工作进程崩溃。在合适的条件下,还可能获得服务器的远程代码执行(RCE)权限。
本次漏洞由安全团队 depthfirst 在扫描 NGINX Codebase(代码库)时发现。其自动化系统在 6 小时内找到 5 个问题,其中 4 个获得 NGINX 官方确认。
最严重的 CVE-2026-42945 可追溯到 2008 年,长期存在于几乎所有标准 NGINX 构建版本中。
技术原理
问题出在 ngx_http_rewrite_module 的处理逻辑中。某个内部标志位在被设置为参数转义状态后未被清除,导致后续长度计算按原始字节数估算,但实际写入时又进行了一次转义,造成缓冲区溢出。
攻击者 URI 中的 +、%、& 等字符会从 1 字节膨胀至 3 字节,原本够用的缓冲区因此溢出。
概念验证
depthfirst 已开发出可运行的概念验证(PoC),在关闭 ASLR 的条件下可实现未认证的远程代码执行。
更值得关注的是,NGINX 的多进程架构为攻击者提供了反复尝试的空间:
- 某个工作进程崩溃后,主进程会拉起新进程
- 新进程的堆布局可能与之前保持一致
- 攻击者可通过重复请求逐步覆盖指针字节,尝试绕过 ASLR
修复方案
版本升级(推荐)
NGINX 官方已发布修复版本:
- NGINX Open Source:升级至 1.31.0 或 1.30.1
- NGINX Plus:升级至 R36 P4 或 R32 P6
升级后需重启服务以加载修复后的二进制文件。
临时缓解措施
若暂时无法升级,官方建议将配置中 rewrite 指令的未命名正则捕获($1、$2 等)替换为命名捕获($name)。命名捕获不会进入有问题的转义路径,从而移除当前攻击面。
漏洞触发的必要条件如下:
- 配置中使用了
rewrite指令,且替换字符串包含问号(?) - 该 rewrite 指令使用了未命名捕获(
$1、$2) - 同一作用域下存在
set、if或另一条rewrite指令
受影响配置示例(存在风险)
location ~ ^/api/(.*)$ {
rewrite ^/api/(.*)$ /internal?migrated=true;
set $original_endpoint $1;
}
缓解后配置示例(安全)
使用命名捕获替换 $1、$2 等未命名引用:
location ~ ^/api/(?<path>.*)$ {
rewrite ^/api/(?<path>.*)$ /internal?migrated=true;
set $original_endpoint $path;
}
或者使用 if 替代 set,或调整逻辑避免在 rewrite 后引用捕获组。
排查方法
方式一:导出全部配置后精确匹配
使用 nginx -T 导出所有已加载的配置,通过正则匹配同时包含 rewrite(替换中含 ?)和后续 set/if/rewrite 的段落:
nginx -T 2>/dev/null | grep -Pzo '(?s)rewrite[^;]*\?[^;]*;.*?(set|if|rewrite)\s'
方式二:在配置目录中逐文件检索
直接搜索配置文件中有 rewrite/set 且引用 $1、$2 等未命名捕获的位置:
grep -rn "rewrite\|set " /etc/nginx/conf.d/ -A 2 | grep -B 2 "\\$[0-9]"
li { list-style: none; padding: 0 10px; } .pls-footer-website-group { list-style: none; } .pls-footer-website-title { font-size: 16px; font-weight: 600; color: #1f2329; margin: 0 0 18px; line-height: 1.4; } .pls-footer-website-title a { color: #1f2329; } .pls-footer-website-list { list-style: none; margin: 0; padding: 0; } .pls-footer-website-list li { list-style: none; margin-bottom: 12px; line-height: 1.5; } .pls-footer-website-list a { font-size: 14px; color: #5f6368; } .pls-footer-website-list a:hover { color: #006eff; } /* 关注 + 热线(第5列) */ .pls-footer-contact-col .pls-footer-website-title { margin-bottom: 16px; } .pls-footer-contact-col .pls-footer-website-contact-text { color: #5f6368; font-size: 13px; line-height: 1.6; margin-bottom: 12px; } .pls-footer-contact-col .pls-footer-website-contact-view { display: flex; gap: 10px; margin-bottom: 20px; } .pls-footer-contact-col .pls-footer-website-contact-view-box { width: 60px; height: 60px; border: 1px solid #ebebeb; border-radius: 4px; background: #f5f7fa; display: flex; align-items: center; justify-content: center; color: #c0c4cc; font-size: 11px; text-align: center; cursor: pointer; transition: all 0.2s; position: relative; overflow: visible; } .pls-footer-contact-col .pls-footer-website-contact-view-box:hover { border-color: #006eff; color: #006eff; } /* 鼠标悬停放大预览 */ .pls-footer-contact-col .pls-footer-website-contact-view-box img { transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s ease; } .pls-footer-contact-col .pls-footer-website-contact-view-box:hover img { transform: scale(3.5); box-shadow: 0 8px 30px rgba(0,0,0,0.25); border-radius: 4px; z-index: 100; position: relative; } .pls-footer-contact-col .pls-footer-website-hotline-title { font-size: 14px; color: #5f6368; margin: 0 0 6px; font-weight: 500; } .pls-footer-contact-col .pls-footer-website-hotline-phone { font-size: 20px; font-weight: 600; color: #1f2329; margin-bottom: 4px; display: flex; align-items: baseline; gap: 4px; flex-wrap: wrap; } .pls-footer-contact-col .pls-footer-website-hotline-phone span { color: #006eff; } .pls-footer-contact-col .pls-footer-website-hotline-phone i { font-style: normal; color: #5f6368; font-size: 13px; } .pls-footer-contact-col .pls-footer-website-hotline-m { font-size: 11px; color: #86909c; margin-bottom: 10px; } .pls-footer-contact-col .pls-footer-website-btn { display: inline-block; background: #006eff; color: #fff !important; padding: 6px 20px; border-radius: 4px; font-size: 13px; text-decoration: none; } .pls-footer-contact-col .pls-footer-website-btn:hover { background: #0052cc; color: #fff !important; } .icon-earth { display: inline-block; width: 14px; height: 14px; background: url('data:image/svg+xml;utf8,') center/contain no-repeat; margin-right: 4px; vertical-align: -2px; } /* ========== 友情链接 + 版权 ========== */ .pls-footer-blogroll { padding: 20px 0; background: #fafbfc; border-top: 1px solid #ebebeb; font-size: 12px; color: #86909c; } .pls-footer-blogroll-main { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-bottom: 12px; } .pls-footer-blogroll-main a { color: #5f6368; font-size: 12px; } .pls-footer-blogroll-main a:hover { color: #006eff; } .icon-tc { display: inline-flex; align-items: center; margin-right: 20px; } .pls-footer-blogroll-links-separate { border: 0; border-top: 1px solid #ebebeb; width: 100%; margin: 8px 0; } .pls-footer-blogroll-text { line-height: 1.8; color: #86909c; font-size: 12px; } .pls-footer-blogroll-text a { color: #5f6368; font-size: 12px; } .pls-footer-blogroll-text a:hover { color: #006eff; } .pls-footer-inner--mobile { display: none; } /* ========== 响应式 ========== */ @media (max-width: 1024px) { .pls-footer-website-columns { grid-template-columns: repeat(3, 1fr); } } @media (max-width: 768px) { /* 顶部 4 个服务项:一行只显示图标,压缩高度 */ .pls-footer-service { padding: 16px 0; } .pls-footer-service-list { display: flex !important; flex-wrap: nowrap; justify-content: space-around; gap: 0 !important; } .pls-footer-service-item { flex-direction: column; gap: 4px; font-size: 12px; padding: 4px 0; } .pls-footer-service-item .term { display: none !important; } .pls-footer-service-item .icon, .pls-footer-service-item .service-custom-icon { width: 30px !important; height: 30px !important; } /* 只保留“关注或联系我们”,隐藏其它链接列,避免页脚过长 */ .pls-footer-website-columns { display: block !important; gap: 0 !important; } .pls-footer-website-columns > li:not(.pls-footer-contact-col) { display: none !important; } .pls-footer-contact-col { width: 100% !important; } .pls-footer-blogroll { display: none; } .pls-footer-inner--mobile { display: block; padding: 16px 0 20px; background: #fafbfc; border-top: 1px solid #ebebeb; font-size: 12px; color: #86909c; } } @media (max-width: 480px) { .pls-footer-service-list { grid-template-columns: 1fr; } .pls-footer-website-columns { grid-template-columns: 1fr; } .pls-footer-website-hotline-phone { font-size: 20px; } }

