Vulnerabilitatea Nginx ascunsă timp de 18 ani, CVE-2026-42945: explicație completă – principiu, PoC și remediere

🚨 Vulnerabilitatea critică Nginx ascunsă 18 ani, CVE-2026-42945: principiu, PoC și remediere
Pe 13 mai 2026, firma de cercetare în securitatedepthfirsta dezvăluit, împreună cu F5, o vulnerabilitate gravă din istoria NGINX –CVE-2026-42945:
- scor CVSS v4.0 de 9.2: o vulnerabilitate de severitate înaltă
- depășire de buffer în heap: poate duce la executare de cod la distanță (RCE)
- ascunsă timp de 18 ani: introdusă în baza de cod în 2008
- 9,75 milioane de site-uri afectate la nivel global: peste 2,54 milioane de site-uri din China afectate
- PoC publicat: Qianxin a reușit să reproducă vulnerabilitatea
Esteo vulnerabilitate istorică a modulului de bază NGINX: atacatorul poate prelua controlul serverului de la distanță trimițând o singură cerere HTTP special construită.
🔍 Prezentare generală a vulnerabilității
Informații de bază
| Proprietate | Detalii |
|---|---|
| Identificator vulnerabilitate | CVE-2026-42945 |
| Scor CVSS | v4.0: 9.2 | v3.1: 8.1 |
| Tip vulnerabilitate | Depășire de buffer în heap (Heap-based Buffer Overflow) |
| Tip de amenințare | Executare de cod la distanță (RCE), refuz de serviciu (DoS) |
| Condiții de exploatare | Fără autentificare; este suficientă construirea unei cereri HTTP |
| Componentă afectată | ngx_http_rewrite_module (modul integrat din nucleul NGINX) |
| Organizația care a descoperit | depthfirst (descoperită de sistemul automatizat în 6 ore) |
Raza de impact
- 9,75 milioane de site-uri la nivel globalafectate
- 2,54 milioane de site-uri din Chinaafectate
- NGINX deservește aproximativ 1/3 dintre site-urile lumii, impact extrem de larg
- Codul a fost introdus în2008și a rămas ascuns18 ani
⚠️ Condiții de declanșare
Toate cele trei condiții trebuie îndeplinite simultan
Declanșarea vulnerabilității necesităo configurație care îndeplinește o combinație specifică de condiții:
| Condiție | Descriere | Exemplu |
|---|---|---|
| 1. Capturi PCRE fără nume | directiva rewrite folosește grupuri de captură fără nume | $1, $2, $3… |
| 2. Șirul de înlocuire conține semn de întrebare | șirul de înlocuire conține caracterul ? | /profile.php?id=$1&tab=$2 |
| 3. Urmat de rewrite/if/set | după directiva rewrite urmează imediat alte directive | rewrite … last; if (…) { … } |
Exemplu vulnerabil
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
Această configurație îndeplinește simultan toate cele trei condiții:capturi fără nume $1/$2,șir de înlocuire cu ?,urmată de directiva if.
🔬 Principiul vulnerabilității
Inconsecvență de stare în procesarea în două etape
Motorul de script NGINXfolosește o procesare în două etape:
- Prima etapă: calculează dimensiunea bufferului necesar
- A doua etapă: copiază datele în buffer
Nucleul vulnerabilității constă într-ogestionare greșită a indicatorului is_args:
| Etapa | Stare is_args | Logica de procesare | Rezultat |
|---|---|---|---|
| Etapă de calcul al lungimii | is_args = 0 | returnează lungimea originală a capturilor | dimensiunea bufferului este subestimată |
| Etapă de copiere a datelor | is_args = 1 | se apelează ngx_escape_uri, fiecare octet extinzându-se la 3 octeți | depășire de buffer în heap |
Fluxul concret
- Directiva rewriteconține capturi fără nume $1/$2
- Șirul de înlocuireconține ?, ceea ce declanșează is_args = 1
- Etapă de calcul al lungimii: folosește un sub-motor proaspăt inițializat, is_args = 0
- returnează lungimea originală: se alocă un buffer heap prea mic
- Etapă de copiere a datelor: folosește motorul principal, is_args = 1
- se apelează ngx_escape_uri: extinde octeții și depășește bufferul
- datele URI controlate de atacatorsunt scrise în zona de depășire
Modalitate de exploatare
Heap Feng Shui între cereri:
- Corpul cererii POSTspray de memorie heap (deoarece URI-ul nu poate conține octeți nul)
- Datele de depășirecorup pointerul cleanup al structurii ngx_pool_t adiacente
- se falsifică ngx_pool_cleanup_s, îndreptat către system()
- La distrugerea pool-uluise declanșează apelul system()
- realizându-se RCE
Impactul ASLR
- ASLR activat: provoacă doar prăbușirea procesului Worker (DoS)
- ASLR dezactivat: se poate obține executare de cod la distanță (RCE)
📊 Versiuni afectate
NGINX Open Source
| Interval de versiuni | Versiune de remediere |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Interval de versiuni | Versiune de remediere |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Alte componente afectate
- 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
🔥 Stadiul PoC
PoC publicat
- Depozit GitHub:https://github.com/DepthFirstDisclosures/Nginx-Rift
- Qianxin a reprodus vulnerabilitatea: cercetătorii în securitate ai centrului de informații despre amenințări au reușit să o reproducă
- Detaliile tehnice au fost făcute publice: depthfirst a publicat o analiză tehnică
- Exploatare în sălbăticie: nu a fost depistată deocamdată
Mod de utilizare PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Soluții de remediere
Metoda 1: actualizarea versiunii
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Metoda 2: modificarea configurației (măsuri de atenuare)
Se înlocuiescgrupurile de captură fără numecugrupuri de captură cu nume:
# 易受攻击配置(未命名捕获) 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;
Grupurile de captură cu numenu declanșează vulnerabilitatea.
Metoda 3: verificarea configurației
Verificați dacă există configurații vulnerabile:
# 搜索易受攻击的 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/
🔍 Procesul de descoperire
Descoperire de către sistemul automatizat
depthfirst – sistemul de analiză a securității:
- În 6 oreau fost identificate 5 probleme
- 4 au fost confirmate de NGINX
- CVE-2026-42945este cea mai gravă vulnerabilitate
- Poate fi trasată până în 2008, prezentă în aproape toate versiunile standard de compilare
Alte vulnerabilități conexe
- CVE-2026-42946: problemă de corupere a memoriei
- CVE-2026-40701: problemă de corupere a memoriei
- CVE-2026-42934: problemă de corupere a memoriei
📝 Rezumat
CVE-2026-42945este o vulnerabilitate gravă din istoria NGINX:
- Ascunsă 18 ani: introdusă în baza de cod în 2008
- CVSS 9.2: depășire de buffer în heap, poate duce la RCE
- Condiții de declanșare: rewrite cu capturi fără nume + șir de înlocuire cu ? + urmată de alte directive
- Raza de impact: 9,75 milioane de site-uri la nivel global, 2,54 milioane în China
- PoC publicat: depozit GitHub + reprodus de Qianxin
- Remediere: actualizarea versiunii sau utilizarea grupurilor de captură cu nume
O vulnerabilitate ascunsă 18 ani a ieșit la iveală; se recomandă actualizarea sau modificarea configurației cât mai curând.
Anunțul oficial:https://my.f5.com/manage/s/article/K000161019
Depozitul PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift
Analiza tehnică:https://depthfirst.com/research/nginx-rift