nginx-poolslip (CVE-2026-9256): kritinė nginx pažeidžiamybė ir kaip pataisyti serverį nesugadinus konfigūracijos.
nginx-poolslip (CVE-2026-9256): kritinė nginx pažeidžiamybė ir kaip pataisyti serverį nesugadinus konfigūracijos.
KAS NUTIKO
Atidarote monitoringą ir matote seriją nginx worker processo crash’ų. Jokio srauto šuolio, jokių konfigūracijos klaidų — worker’iai tiesiog krenta. Tai gali būti aktyvios nginx-poolslip išnaudojimo atakos požymis.
2026 m. gegužę kompanija NebuSec paskelbė informaciją apie kritinę nginx pažeidžiamybę, pavadintą nginx-poolslip ir registruotą kaip CVE-2026-9256. CVSS v4.0 balas: 9.2 — tai ne „atnaujinkite kai turėsite laiko”, tai „atnaujinkite šiandien”.
Pažeidžiamybė paliečia visas nginx versijas nuo 0.1.17 iki 1.30.1 imtinai, taip pat versiją 1.31.0. Praktiškai tai reiškia beveik kiekvieną nginx serverį pasaulyje.
KODĖL TAI PAVOJINGA
nginx-poolslip išnaudoja klaidą atminties telkinių (ngx_pool_t) valdyme per dinamiškus konfigūracijos kintamuosius. Atakos vektorius — direktyvos set, map, geo ir upstream logika.
Pasekmės priklauso nuo konfigūracijos ir ASLR būsenos:
— Be ASLR: Remote Code Execution. Užpuolikas gali vykdyti savo kodą nginx worker proceso kontekste.
— Su ASLR (standartas Linux sistemose): atminties korupcija sukelia worker proceso crash. Minimumas — DoS. Esant papildomam bypass — RCE.
Patikrinkite ar jūsų serveris jau rodo išnaudojimo požymių:
sudo journalctl -u nginx --since "1 hour ago" | grep "worker process exited on signal 11"
Tuščias rezultatas nebūtinai reiškia kad viskas gerai. Galimi trys variantai:
— Atakų nebuvo — viskas tikrai tvarkoje.
— nginx krito, bet daugiau nei prieš valandą — patikrinkite visą žurnalą:
sudo journalctl -u nginx | grep "worker process exited on signal 11"
— nginx krito su kitu signalu — patikrinkite visus worker proceso crash’us:
sudo journalctl -u nginx | grep "worker process exited on signal"
Jei paskutinė komanda taip pat nieko nerodo — serveris švarus. Jei yra rezultatų — žiūrėkite į signalo numerį ir įvykio laiką.
Jei matote signal 11 — serveris jau yra atakuojamas.
PAVEIKTOS VERSIJOS
Pažeidžiamos: nginx 0.1.17 — 1.30.1 ir nginx 1.31.0.
Pataisytos versijos:
— nginx 1.30.2 (stable branch)
— nginx 1.31.1 (mainline branch)
— NGINX Plus R36 P5, R32 P7, R37.0.1.1
KAIP PATIKRINTI SAVO VERSIJĄ
nginx -v
Jei versija žemesnė nei 1.30.2 (stable) arba 1.31.1 (mainline) — esate pažeidžiami. Skaitykite toliau.
GREITA APSAUGA PRIEŠ ATNAUJINIMĄ
Kol ruošiatės atnaujinti — patikrinkite ASLR. Tai neuždaro pažeidžiamybės, bet be papildomo bypass paverčia RCE į DoS:
cat /proc/sys/kernel/randomize_va_space
Turi rodyti 2. Jei ne:
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
Kad išliktų po perkrovimo:
echo "kernel.randomize_va_space = 2" | sudo tee /etc/sysctl.d/99-aslr.conf
sudo sysctl -p /etc/sysctl.d/99-aslr.conf
KAIP ATNAUJINTI NGINX
Jei naudojate Debian arba Ubuntu ir nginx įdiegėte per apt — greičiausiai turite distribucijos paketo versiją. Ubuntu 24.04 tiekia nginx 1.24.0, Ubuntu 22.04 — 1.18.0. Abi versijos yra pažeidžiamos. Laukti distribucijos backport’o šiuo atveju nėra saugu.
Teisingas kelias: prijungti oficialų nginx.org repozitoriją ir įdiegti iš jos.
1 žingsnis. Sukurti konfigūracijos atsarginę kopiją
sudo cp -r /etc/nginx /etc/nginx.bak.$(date +%Y%m%d)
sudo nginx -T > /tmp/nginx-full-config-backup.txt
2 žingsnis. Pridėti nginx.org GPG raktą
Atsisiunčiame raktą į laikiną failą:
curl -o /tmp/nginx_signing.key \
https://nginx.org/keys/nginx_signing.key
Prieš pasitikint raktu — būtinai patikrinti fingerprint. Raktas pateikiamas ASCII-armor formatu — gpg jį nuskaito tiesiogiai:
gpg --dry-run --quiet --no-keyring \
--import --import-options show-only \
/tmp/nginx_signing.key
Laukiami fingerprint’ai (oficialūs, iš nginx.org):8540A6F18833A80E9C1653A42FD21310B49F6B46573BFD6B3D8FBC641079A6ABABF5BD827BD9BF629E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3
Jei fingerprint’ai sutampa — konvertuojame į binarinį formatą (APT reikalauja dearmored) ir išsaugome. > /dev/null slopina tee išvestį terminale — failas tuo pat metu įrašomas teisingai:
gpg --dearmor < /tmp/nginx_signing.key \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
Jei nesutampa — ištrinti failą ir išsiaiškinti priežastį:
rm /tmp/nginx_signing.key
3 žingsnis. Pridėti repozitoriją
Stable branch (rekomenduojama production aplinkoms):
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Jei naudojate Debian — URL pakeiskite ubuntu į debian:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/debian $(lsb_release -cs) nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
4 žingsnis. Repozitorijos pinning
Be pinning’o apt gali kitą kartą teikti pirmenybę distribucijos paketui:
cat << 'EOF' | sudo tee /etc/apt/preferences.d/nginx
Package: nginx*
Pin: origin nginx.org
Pin-Priority: 900
EOF
5 žingsnis. Atnaujinti
sudo apt update
# Patikrinti kas bus įdiegta prieš diegimą
apt-cache policy nginx
sudo apt install nginx
apt-cache policy nginx išvestyje patikrinkite eilutę Candidate: — turi rodyti versiją 1.30.2 su šaltiniu nginx.org, o ne Ubuntu:
nginx:
Installed: 1.24.0-0ubuntu4
Candidate: 1.30.2-1~noble
Version table:
1.30.2-1~noble 900
500 https://nginx.org/packages/ubuntu noble/nginx amd64
...
Jei Candidate vis dar rodo Ubuntu versiją — pinning neveikia, patikrinkite 4 žingsnį.
Diegimo metu apt gali paklausti apie konfigūracijos failą:
Configuration file '/etc/nginx/nginx.conf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
Pasirinkite N — išsaugoti savo versiją. Jūsų veikianti konfigūracija svarbesnė už paketo numatytąją.
6 žingsnis. Patikrinti kad viskas veikia
Po įdiegimo apt automatiškai perkrauna nginx — rankiniu būdu vykdyti systemctl restart nereikia. Tiesiog patikriname:
nginx -v
sudo nginx -t
sudo systemctl status nginx
Laukiamas rezultatas: nginx/1.30.2, nginx -t praeina, paslauga aktyvi.
SVARBI PASTABA APIE KONFIGŪRACIJĄ
Pereinant nuo Ubuntu paketo prie nginx.org paketo, failai kataloge /etc/nginx/ lieka nepakitę — su sąlyga kad į conffile klausimą 5 žingsnyje atsakėte N. Jei naudojote sites-available / sites-enabled struktūrą — ji lieka. Tiesiog įsitikinkite, kad po atnaujinimo nginx -t praeina be klaidų.
RHEL / ALMALINUX / ROCKY LINUX
Pirmiausia pabandykite įprastą atnaujinimą — jei nginx buvo įdiegtas iš oficialios nginx.org repozitorijos, to pakanka:
sudo dnf update nginx
Jei nginx buvo įdiegtas iš EPEL ar kitos repozitorijos — automatinis atnaujinimas gali neveikti. Patikrinkite:
dnf info nginx | grep Version
Jei versija žemesnė nei 1.30.2 — prijunkite oficialią nginx.org repozitoriją:
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
sudo dnf update nginx
Pirmojo atnaujinimo metu DNF atsisiųs GPG raktą ir paprašys patvirtinimo — parodys fingerprint. Palyginkite jį su tais pačiais trimis oficialiais fingerprint’ais nurodytais aukščiau Ubuntu skyriuje. Tik tada įveskite y.
nginx-poolslip yra rimta pažeidžiamybė su CVSS balu 9.2. Pataisymas jau prieinamas. Atnaujinimas užtrunka penkias minutes. Vieninteliai dalykai kurie gali nepavykti — praleidžiamas konfigūracijos backup arba pasitikėjimas GPG raktu nepatikinus fingerprint’o.
Pataisykite šiandien.
