Nginx潛伏18年漏洞CVE-2026-42945:原理PoC修復全解析

🚨 Nginx 潛伏 18 年高危漏洞 CVE-2026-42945:原理、PoC 及修復方案
2026年5月13日,安全研究機構depthfirst聯合 F5 重磅披露 NGINX 史上高危漏洞——CVE-2026-42945:
- CVSS v4.0 評分 9.2:屬於高危漏洞
- 堆緩衝區溢出:可導致遠程代碼執行(RCE)
- 潛伏 18 年:自 2008 年寫入代碼庫
- 影響全球 975 萬站點:中國超 254 萬網站受影響
- PoC 已公開:奇安信已成功復現
這是NGINX 核心模塊的歷史性漏洞,攻擊者僅需發送一條特製 HTTP 請求即可遠程接管服務器。
🔍 漏洞概述
基本信息
| 漏洞屬性 | 詳情 |
|---|---|
| 漏洞編號 | CVE-2026-42945 |
| CVSS 評分 | v4.0: 9.2 | v3.1: 8.1 |
| 漏洞類型 | 堆緩衝區溢出(Heap-based Buffer Overflow) |
| 威脅類型 | 遠程代碼執行(RCE)、拒絕服務(DoS) |
| 利用條件 | 無需認證,僅需構造 HTTP 請求 |
| 影響組件 | ngx_http_rewrite_module(NGINX 核心內置模塊) |
| 發現機構 | depthfirst(自動化系統在 6 小時內發現) |
影響範圍
- 全球 975 萬站點受影響
- 中國 254 萬網站受影響
- NGINX 承載全球約 1/3 網站,影響面極大
- 代碼自2008 年寫入,潛伏18 年
⚠️ 觸發條件
三條件必須同時滿足
漏洞觸發需要配置滿足特定條件組合:
| 條件 | 說明 | 示例 |
|---|---|---|
| 1. 未命名 PCRE 捕獲 | rewrite 指令使用未命名捕獲組 | $1, $2, $3… |
| 2. 替換字符串含問號 | 替換字符串包含 ? 字符 | /profile.php?id=$1&tab=$2 |
| 3. 後跟 rewrite/if/set | rewrite 指令後緊跟其他指令 | rewrite … last; if (…) { … } |
易受攻擊示例
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
該配置同時滿足三個條件:未命名捕獲 $1/$2、替換字符串含 ?、後跟 if 指令。
🔬 漏洞原理
兩階段處理的狀態不一致
NGINX 腳本引擎使用兩階段處理:
- 第一階段:計算所需緩衝區大小
- 第二階段:複製數據到緩衝區
漏洞核心在於is_args 標誌位管理錯誤:
| 階段 | is_args 狀態 | 處理邏輯 | 結果 |
|---|---|---|---|
| 長度計算階段 | is_args = 0 | 返回原始捕獲長度 | 低估緩衝區大小 |
| 數據複製階段 | is_args = 1 | 調用 ngx_escape_uri,每個字節擴展爲 3 字節 | 堆緩衝區溢出 |
具體流程
- rewrite 指令包含未命名捕獲 $1/$2
- 替換字符串包含 ?,觸發 is_args = 1
- 長度計算階段:使用新初始化的子引擎,is_args = 0
- 返回原始長度:分配過小的堆緩衝區
- 數據複製階段:使用主引擎,is_args = 1
- 調用 ngx_escape_uri:擴展字節,溢出緩衝區
- 攻擊者可控 URI 數據寫入溢出區域
利用方式
跨請求堆風水(Heap Feng Shui):
- POST 請求體噴射堆內存(因爲 URI 不能包含 null 字節)
- 溢出數據破壞相鄰 ngx_pool_t 的 cleanup 指針
- 僞造 ngx_pool_cleanup_s,指向 system()
- pool 銷燬時觸發 system() 調用
- 實現 RCE
ASLR 影響
- ASLR 啓用:僅導致 Worker 進程崩潰(DoS)
- ASLR 禁用:可實現遠程代碼執行(RCE)
📊 影響版本
NGINX Open Source
| 版本範圍 | 修復版本 |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| 版本範圍 | 修復版本 |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
其他受影響組件
- NGINX Instance Manager:2.16.0 – 2.21.1
- NGINX App Protect WAF:4.9.0 – 5.8.0
- NGINX Ingress Controller:3.5.0 – 5.4.1
- NGINX Gateway Fabric:1.3.0 – 2.5.1
- F5 DoS for NGINX:4.8.0
🔥 PoC 狀態
PoC 已公開
- GitHub 倉庫:https://github.com/DepthFirstDisclosures/Nginx-Rift
- 奇安信已復現:威脅情報中心安全研究員成功復現
- 技術細節已公開:depthfirst 發佈技術分析
- 在野利用:暫未發現
PoC 使用方法
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ 修復方案
方法 1:升級版本
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
方法 2:修改配置(緩解措施)
將未命名捕獲組替換爲命名捕獲組:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
命名捕獲組不會觸發漏洞。
方法 3:檢查配置
檢查是否存在易受攻擊的配置:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 發現過程
自動化系統發現
depthfirst的安全分析系統:
- 6 小時內找到 5 個問題
- 4 個獲 NGINX 確認
- CVE-2026-42945是最嚴重的漏洞
- 可追溯到 2008 年,存在於幾乎所有標準構建版本
其他相關漏洞
- CVE-2026-42946:內存破壞問題
- CVE-2026-40701:內存破壞問題
- CVE-2026-42934:內存破壞問題
📝 總結
CVE-2026-42945是 NGINX 史上高危漏洞:
- 潛伏 18 年:自 2008 年寫入代碼庫
- CVSS 9.2:堆緩衝區溢出,可導致 RCE
- 觸發條件:rewrite 指令使用未命名捕獲 + 替換字符串含 ? + 後跟其他指令
- 影響範圍:全球 975 萬站點,中國 254 萬網站
- PoC 已公開:GitHub 倉庫 + 奇安信已復現
- 修復方案:升級版本或使用命名捕獲組
18 年潛伏漏洞爆發,建議儘快升級或修改配置。
官方公告:https://my.f5.com/manage/s/article/K000161019