Блог

nginx-poolslip (CVE-2026-9256): критическая уязвимость в nginx и как закрыть дыру не сломав сервер.

nginx-poolslip
Linux

nginx-poolslip (CVE-2026-9256): критическая уязвимость в nginx и как закрыть дыру не сломав сервер.

ЧТО СЛУЧИЛОСЬ
Вы открываете мониторинг и видите серию крэшей nginx-воркеров. Ни всплеска трафика, ни ошибок в конфиге — просто воркеры падают. Это может быть признак активной эксплуатации nginx-poolslip.

В мае 2026 года компания NebuSec опубликовала информацию о критической уязвимости в nginx, получившей название nginx-poolslip и идентификатор CVE-2026-9256. CVSS v4.0: 9.2 — это не «обновитесь при случае», это «обновитесь сегодня».

Уязвимость затрагивает все версии nginx от 0.1.17 до 1.30.1 включительно, а также версию 1.31.0. То есть — почти каждый сервер с nginx в мире.

ЧЕМ ОПАСНО
nginx-poolslip эксплуатирует ошибку в управлении пулами памяти (ngx_pool_t) через динамические переменные конфигурации. Вектор атаки — директивы set, map, geo и логика upstream.

Последствия зависят от конфигурации и наличия ASLR:

— Без ASLR: Remote Code Execution. Атакующий получает выполнение произвольного кода в контексте процесса nginx.
— С ASLR (стандарт для Linux): corruption памяти приводит к crash воркер-процесса. Минимум — DoS. При наличии дополнительного bypass — RCE.

Проверить есть ли уже признаки эксплуатации на вашем сервере:

sudo journalctl -u nginx --since "1 hour ago" | grep "worker process exited on signal 11"

Если вывод пустой — это не обязательно означает что всё чисто. Возможны три варианта:

— Атак не было — всё действительно в порядке.
— nginx падал, но больше часа назад — проверьте за всё время:

sudo journalctl -u nginx | grep "worker process exited on signal 11"

— nginx падал через другой сигнал — проверьте все крэши воркеров:

sudo journalctl -u nginx | grep "worker process exited on signal"

Если последняя команда тоже пустая — сервер чист. Если что-то есть — смотрите на номер сигнала и время события.

Если видите signal 11 — сервер уже атакуют.

КАКИЕ ВЕРСИИ УЯЗВИМЫ
Уязвимы: nginx 0.1.17 — 1.30.1 и nginx 1.31.0.

Исправленные версии:
— nginx 1.30.2 (stable branch)
— nginx 1.31.1 (mainline branch)
— NGINX Plus R36 P5, R32 P7, R37.0.1.1

КАК ПРОВЕРИТЬ СВОЮ ВЕРСИЮ

nginx -v

Если версия ниже 1.30.2 (stable) или 1.31.1 (mainline) — вы уязвимы. Читайте дальше.

БЫСТРОЕ РЕШЕНИЕ ДО ОБНОВЛЕНИЯ
Пока готовитесь к обновлению — проверьте ASLR. Он не закрывает уязвимость, но без явного bypass превращает RCE в DoS:

cat /proc/sys/kernel/randomize_va_space

Должно быть 2. Если нет:

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

Чтобы сохранить после перезагрузки:

echo "kernel.randomize_va_space = 2" | sudo tee /etc/sysctl.d/99-aslr.conf
sudo sysctl -p /etc/sysctl.d/99-aslr.conf

КАК ОБНОВИТЬ NGINX

Если у вас Debian или Ubuntu и вы устанавливали nginx через apt — скорее всего у вас версия из дистрибутивных репозиториев. Ubuntu 24.04 поставляет nginx 1.24.0, Ubuntu 22.04 — 1.18.0. Обе уязвимы. Патч в дистрибутивных репах может появиться позже — ждать не стоит.

Правильный путь: подключить официальный репозиторий nginx.org и обновиться с него.

Шаг 1. Сделать бэкап конфигов

sudo cp -r /etc/nginx /etc/nginx.bak.$(date +%Y%m%d)
sudo nginx -T > /tmp/nginx-full-config-backup.txt

Шаг 2. Добавить GPG-ключ nginx.org

Скачиваем ключ во временный файл:

curl -o /tmp/nginx_signing.key \
  https://nginx.org/keys/nginx_signing.key

Обязательно проверить fingerprint перед тем как доверять ключу. Ключ приходит в ASCII-armor формате — gpg умеет читать его напрямую:

gpg --dry-run --quiet --no-keyring \
  --import --import-options show-only \
  /tmp/nginx_signing.key

Ожидаемые fingerprint’ы (официальные, с nginx.org):
8540A6F18833A80E9C1653A42FD21310B49F6B46
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3

Если fingerprint’ы совпали — конвертируем в бинарный формат (APT требует dearmored) и сохраняем. > /dev/null подавляет вывод tee в терминал — файл при этом записывается нормально:

gpg --dearmor < /tmp/nginx_signing.key \
  | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

Если не совпали — удалить файл и разобраться в причине:

rm /tmp/nginx_signing.key

Шаг 3. Добавить репозиторий

Для stable-ветки (рекомендуется для production):

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

Если у вас Debian — замените ubuntu на debian в URL:

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. Pinning — чтобы apt не смешивал пакеты

Без pinning’а apt может в следующий раз предпочесть пакет из дистрибутивного репозитория:

cat << 'EOF' | sudo tee /etc/apt/preferences.d/nginx
Package: nginx*
Pin: origin nginx.org
Pin-Priority: 900
EOF

Шаг 5. Обновить

sudo apt update

# Проверить что именно установится — до установки
apt-cache policy nginx

sudo apt install nginx

В выводе apt-cache policy nginx проверьте строку Candidate: — там должна быть версия 1.30.2 и источник nginx.org, а не 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
...

Если Candidate всё ещё показывает Ubuntu-версию — pinning не сработал, проверьте Шаг 4.

В процессе установки apt может спросить про конфигурационный файл:

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

Выбирайте N — сохранить свою версию. Ваш рабочий конфиг важнее дефолта из пакета.

Шаг 6. Проверить что всё работает

После установки apt автоматически перезапускает nginx — делать systemctl restart вручную не нужно. Просто проверяем:

nginx -v
sudo nginx -t
sudo systemctl status nginx

Ожидаемый результат: nginx/1.30.2, nginx -t проходит, сервис активен.

ВАЖНЫЙ МОМЕНТ ПРО КОНФИГИ
При переходе с Ubuntu-пакета на nginx.org-пакет ваши конфиги в /etc/nginx/ остаются нетронутыми — при условии что на conffile-вопрос в Шаге 5 вы ответили N. Если вы использовали структуру sites-available / sites-enabled — она останется. Просто убедитесь что после обновления nginx -t проходит без ошибок.

ДЛЯ RHEL / ALMALINUX / ROCKY

Сначала попробуйте обычное обновление — если nginx ставился из официального nginx.org-репозитория, этого достаточно:

sudo dnf update nginx

Если nginx устанавливался из EPEL или другого стороннего репозитория — версия может не обновиться автоматически. Проверьте:

dnf info nginx | grep Version

Если версия ниже 1.30.2 — добавьте официальный репозиторий nginx.org:

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

При первом обновлении DNF скачает GPG-ключ и спросит подтверждение — выведет fingerprint. Сверьте его с официальными значениями выше (те же три fingerprint’а что и для Ubuntu). Только после этого вводите y.

ВЫВОДЫ
nginx-poolslip — серьёзная уязвимость с CVSS 9.2. Патч уже доступен. Обновление занимает 5 минут. Единственное что может пойти не так — это спешка без бэкапа конфигов или доверие GPG-ключу без проверки fingerprint’а.

Обновитесь сегодня.

Leave your thought here

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поддержать автора

Если вам понравилась статья — вы можете поддержать автора.

Crypto donation button by NOWPayments