Tinklaraštis

nginx-poolslip (CVE-2026-9256): kritinė nginx pažeidžiamybė ir kaip pataisyti serverį nesugadinus konfigūracijos.

nginx-poolslip
Linux

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):
8540A6F18833A80E9C1653A42FD21310B49F6B46
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3

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.

Leave your thought here

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *