nginx-poolslip (CVE-2026-9256): критическая уязвимость в nginx и как закрыть дыру не сломав сервер.
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):8540A6F18833A80E9C1653A42FD21310B49F6B46573BFD6B3D8FBC641079A6ABABF5BD827BD9BF629E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3
Если 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’а.
Обновитесь сегодня.
