CVE-2026-42945: de Nginx-kwetsbaarheid die 18 jaar verborgen bleef – werking, PoC en oplossingen uitgelegd

🚨 CVE-2026-42945: kritieke kwetsbaarheid in Nginx die 18 jaar verborgen bleef – werking, PoC en oplossingen
Op 13 mei 2026 presenteerde het securityonderzoeksbureaudepthfirstsamen met F5 een historisch kritieke kwetsbaarheid in NGINX –CVE-2026-42945:
- CVSS v4.0-score van 9.2: geclassificeerd als kwetsbaarheid met hoog risico
- Heap-bufferoverloop: kan leiden tot externe code-uitvoering (RCE)
- 18 jaar sluimerend: sinds 2008 in de codebase opgenomen
- Treft 9,75 miljoen sites wereldwijd: meer dan 2,54 miljoen websites in China getroffen
- PoC is openbaar: door Qianxin succesvol gereproduceerd
Het iseen historische kwetsbaarheid in de kernmodule van NGINX: met slechts één speciaal vervaardigd HTTP-verzoek kan een aanvaller op afstand de server overnemen.
🔍 Overzicht van de kwetsbaarheid
Basisinformatie
| Eigenschap | Details |
|---|---|
| Kwetsbaarheids-ID | CVE-2026-42945 |
| CVSS-score | v4.0: 9.2 | v3.1: 8.1 |
| Type kwetsbaarheid | Heap-bufferoverloop (Heap-based Buffer Overflow) |
| Type dreiging | Externe code-uitvoering (RCE), denial-of-service (DoS) |
| Voorwaarden voor misbruik | Geen authenticatie nodig, slechts een speciaal HTTP-verzoek |
| Getroffen component | ngx_http_rewrite_module (ingebouwde NGINX-kernmodule) |
| Ontdekt door | depthfirst (ontdekt door een geautomatiseerd systeem binnen 6 uur) |
Impact
- 9,75 miljoen sites wereldwijdgetroffen
- 2,54 miljoen websites in Chinagetroffen
- NGINX draait op ongeveer een derde van alle websites wereldwijd, waardoor de impact enorm is
- De code staat er sinds2008in en sluimert al18 jaar
⚠️ Voorwaarden voor activering
Aan alle drie de voorwaarden moet tegelijk zijn voldaan
Om de kwetsbaarheid te activeren is vereist datde configuratie aan een specifieke combinatie van voorwaarden voldoet:
| Voorwaarde | Toelichting | Voorbeeld |
|---|---|---|
| 1. Naamloze PCRE-captures | het rewrite-commando gebruikt naamloze capture-groepen | $1, $2, $3… |
| 2. Vervangingsstring met vraagteken | de vervangingsstring bevat een ?-teken | /profile.php?id=$1&tab=$2 |
| 3. Gevolgd door rewrite/if/set | op het rewrite-commando volgt direct een ander commando | rewrite … last; if (…) { … } |
Kwetsbaar voorbeeld
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
Deze configuratie voldoet aan alle drie de voorwaarden:naamloze captures $1/$2, vervangingsstring met ?, gevolgd door een if-commando.
🔬 Technische werking van de kwetsbaarheid
Statusinconsistentie tussen twee verwerkingsfasen
De script-engine van NGINXwerkt in twee fasen:
- Fase één: berekent de benodigde buffergrootte
- Fase twee: kopieert de data naar de buffer
De kern van de kwetsbaarheid ligt ineen foutieve administratie van de is_args-vlag:
| Fase | is_args-status | Verwerkingslogica | Resultaat |
|---|---|---|---|
| Lengteberekeningsfase | is_args = 0 | geeft de oorspronkelijke capture-lengte terug | buffergrootte wordt onderschat |
| Datakopieerfase | is_args = 1 | roept ngx_escape_uri aan; elke byte wordt uitgebreid naar 3 bytes | heap-bufferoverloop |
Exacte proces
- het rewrite-commandobevat naamloze captures $1/$2
- De vervangingsstringbevat ?, waardoor is_args = 1 wordt getriggerd
- Lengteberekeningsfase: gebruikt een nieuw geïnitialiseerde sub-engine, is_args = 0
- geeft de oorspronkelijke lengte terug: er wordt een te kleine heapbuffer toegewezen
- Datakopieerfase: gebruikt de hoofdenigne, is_args = 1
- roept ngx_escape_uri aan: bytes worden uitgebreid en de buffer loopt over
- Door de aanvaller beheerste URI-datawordt in het overloopgebied geschreven
Aanvalsmethode
Heap Feng Shui over meerdere verzoeken:
- POST-requestbodyheap-spraying (omdat een URI geen null-bytes kan bevatten)
- Overloopdatacorrumpeert de cleanup-pointer van een aangrenzende ngx_pool_t
- een vervalste ngx_pool_cleanup_s, verwijzend naar system()
- bij het vernietigen van de poolwordt de system()-aanroep getriggerd
- waardoor RCE wordt bereikt
Invloed van ASLR
- ASLR ingeschakeld: leidt slechts tot een crash van het worker-proces (DoS)
- ASLR uitgeschakeld: externe code-uitvoering (RCE) is mogelijk
📊 Getroffen versies
NGINX Open Source
| Versiebereik | Gerepareerde versie |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Versiebereik | Gerepareerde versie |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Andere getroffen componenten
- 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-status
PoC is openbaar
- GitHub-repository:https://github.com/DepthFirstDisclosures/Nginx-Rift
- Gereproduceerd door Qianxin: securityonderzoekers van het Threat Intelligence Center hebben het succesvol gereproduceerd
- Technische details openbaar: depthfirst heeft een technische analyse gepubliceerd
- Exploitatie in het wild: nog niet waargenomen
Gebruik van de PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Oplossingen
Methode 1: versie upgraden
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Methode 2: configuratie aanpassen (mitigatie)
Vervangnaamloze capture-groependoorbenoemde capture-groepen:
# 易受攻击配置(未命名捕获) 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;
Benoemde capture-groepenactiveren de kwetsbaarheid niet.
Methode 3: configuratie controleren
Controleer of er een kwetsbare configuratie aanwezig is:
# 搜索易受攻击的 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/
🔍 Ontdekkingsproces
Ontdekt door het geautomatiseerde systeem van
depthfirst: het securityanalysesysteem vond
- binnen 6 uur5 problemen
- 4 bevestigd door NGINX
- CVE-2026-42945is de ernstigste kwetsbaarheid
- herleidbaar tot 2008, aanwezig in vrijwel alle standaard builds
Andere gerelateerde kwetsbaarheden
- CVE-2026-42946: geheugencorruptie
- CVE-2026-40701: geheugencorruptie
- CVE-2026-42934: geheugencorruptie
📝 Samenvatting
CVE-2026-42945is een historisch kritieke kwetsbaarheid in NGINX:
- 18 jaar sluimerend: sinds 2008 in de codebase
- CVSS 9.2: heap-bufferoverloop die tot RCE kan leiden
- Activeringsvoorwaarden: rewrite-commando met naamloze captures + vervangingsstring met ? + gevolgd door andere commando's
- Impact: 9,75 miljoen sites wereldwijd, 2,54 miljoen websites in China
- PoC openbaar: GitHub-repository + gereproduceerd door Qianxin
- Oplossing: upgraden of benoemde capture-groepen gebruiken
Na 18 jaar sluimering breekt de kwetsbaarheid los; upgrade of pas uw configuratie zo snel mogelijk aan.
Officiële aankondiging:https://my.f5.com/manage/s/article/K000161019
PoC-repository:https://github.com/DepthFirstDisclosures/Nginx-Rift
Technische analyse:https://depthfirst.com/research/nginx-rift