5 февраля 2025 года вышли nginx 1.27.4 (mainline) и 1.26.3 (stable). Обе версии закрыли уязвимость CVE-2025-23419 в обработке TLS-сессий. В mainline заодно появился кэш сертификатов, которые задаются через переменные, и директива keepalive_min_timeout. С тех пор обе ветки ушли далеко вперёд, так что сейчас эта заметка скорее про то, что именно тогда поменялось и с какой версии оно есть.
Какие версии nginx актуальны сейчас
По новостям nginx.org, 15 сентября 2026 года вышли nginx 1.30.5 stable и 1.31.6 mainline с исправлением переполнения буфера в ngx_http_v3_module (CVE-2026-90439). Если на сервере всё ещё 1.26.x или 1.27.x, обновляться нужно не ради CVE-2025-23419, а ради всего, что закрыли позже. В списке уязвимостей nginx видно, какие версии чем затронуты.
CVE-2025-23419: чужая TLS-сессия обходит проверку клиентского сертификата
Ошибка в проверке виртуальных серверов при TLS 1.3 и SNI позволяла возобновить TLS-сессию в другом server-блоке и так обойти проверку клиентского сертификата. Проблема касается схем, где на одном IP и порту несколько виртуальных серверов, в части из них включена проверка клиентских сертификатов (mTLS), а сессии переиспользуются через общий кэш или session tickets. Уязвимы версии с 1.11.4 по 1.27.3, исправлено в 1.26.3 и 1.27.4. Опасность nginx оценил как среднюю.
Что изменилось в 1.26.3 stable
В stable-ветке, по журналу изменений 1.26, кроме исправления CVE только мелочи:
- исправление в ngx_http_mp4_module;
- nginx больше не пишет в лог предупреждения «gzip filter failed to use preallocated memory» при сборке с zlib-ng;
- снова собирается libatomic из исходников с опцией
--with-libatomic=DIR; - nginx игнорирует пакеты согласования версии QUIC от клиентов;
- ngx_http_v3_module снова собирается на Solaris 10 и старше, плюс исправления в HTTP/3.
Что добавили в 1.27.4 mainline
В mainline те же исправления и ещё несколько новых директив, их описание есть в журнале изменений:
- ssl_certificate_cache, а для проксирования proxy_ssl_certificate_cache, grpc_ssl_certificate_cache и uwsgi_ssl_certificate_cache: кэш сертификатов и ключей, которые задаются через переменные;
- ssl_object_cache_inheritable: можно ли при перезагрузке конфигурации переиспользовать уже загруженные сертификаты, ключи и CRL;
- keepalive_min_timeout: минимальное время, в течение которого keep-alive соединение не закроют раньше срока;
- исправление установки QUIC-соединения с 0-RTT, ошибка появилась в 1.27.1.
Кэш сертификатов пригодится там, где сертификат подбирается по имени хоста, например ssl_certificate /etc/ssl/$ssl_server_name.crt. Без кэша nginx читает файлы при каждом рукопожатии. По документации ngx_http_ssl_module, по умолчанию кэш выключен, а у директивы есть параметры max, inactive (по умолчанию 10 секунд) и valid (по умолчанию 60 секунд):
ssl_certificate /etc/ssl/$ssl_server_name.crt; ssl_certificate_key /etc/ssl/$ssl_server_name.key; ssl_certificate_cache max=1000 inactive=20s valid=1m;
Что сделать на сервере
- Посмотреть версию: nginx -v. Всё ниже 1.26.3 уязвимо к CVE-2025-23419, но обновляться стоит сразу до текущей stable или mainline.
- После обновления проверить конфигурацию через nginx -t и сделать плавную перезагрузку: systemctl reload nginx.
- Если на одном IP несколько виртуальных серверов с проверкой клиентских сертификатов, прогнать после обновления сценарии с клиентскими сертификатами.
- Если сертификаты подставляются через переменные, включить ssl_certificate_cache. Директива есть в mainline с 1.27.4 и в stable-ветках, вышедших после него.
Если сертификаты Let’s Encrypt выпускаются отдельным клиентом, посмотрите и на встроенный модуль ACME, о нём я писал в заметке про nginx 1.29.1 и модуль ACME на Rust.
В итоге 1.27.4 и 1.26.3 закрыли обход проверки клиентских сертификатов через переиспользование TLS-сессии, а mainline получила кэш сертификатов из переменных и keepalive_min_timeout. Сегодня эти версии уже устарели: актуальны 1.30.5 stable и 1.31.6 mainline.