← 返回列表

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

itadol5j

Nginx CVE-2026-42945

🚨 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 字節 堆緩衝區溢出

具體流程

  1. rewrite 指令包含未命名捕獲 $1/$2
  2. 替換字符串包含 ?,觸發 is_args = 1
  3. 長度計算階段:使用新初始化的子引擎,is_args = 0
  4. 返回原始長度:分配過小的堆緩衝區
  5. 數據複製階段:使用主引擎,is_args = 1
  6. 調用 ngx_escape_uri:擴展字節,溢出緩衝區
  7. 攻擊者可控 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 已公開

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

PoC 倉庫:https://github.com/DepthFirstDisclosures/Nginx-Rift

技術分析:https://depthfirst.com/research/nginx-rift