Tutorial

nginx CVE-2026-15176: audit and patch to 1.30.6

Security & Monitoring12 min read16 steps

On 14 October 2026, nginx released versions 1.30.6 (stable) and 1.31.7 (mainline), which fix five vulnerabilities, including CVE-2026-15176. Each one only affects specific configurations: alias combined with rewrite, regex captures, HTTP/3, TLS session ticket key rotation, SSI with AIO. On a fleet of client servers, the real question is not "are my servers up to date?" but "which machines are exposed, and in what order should I handle them?". This guide gives you the commands to answer that in under an hour, then to fix each environment while keeping downtime to a few seconds.

Contents· What nginx 1.30.6 and 1.31.7 fix1/12
  1. 01What nginx 1.30.6 and 1.31.7 fix
  2. 02The five flaws and what exposes you
  3. 03Affected and fixed versions
  4. 04Distro package or Docker: the version number is not enough
  5. 05Audit a server's exposure in ten minutes
  6. 06In what order to handle a fleet of servers
  7. 07Update environment by environment
  8. 08Cannot patch today: the mitigations published by F5
  9. 09Detection: clues, not proof
  10. 10Troubleshooting: errors that follow the update
  11. 11Five flaws on twenty servers: an agency's workload
  12. 12The official documentation

What nginx 1.30.6 and 1.31.7 fix

Both versions came out on the same day, 14 October 2026, on the nginx.org news page. They fix five flaws in the worker process: three memory corruptions, a data injection into the body of HTTP/3 requests, and a TLS session forgery. A 1.31.8 mainline version followed on 21 October 2026; its announcement mentions no vulnerability, but it succeeds 1.31.7 and therefore contains its fixes.

On severity, two readings coexist, and they must be quoted as published. The nginx.org security advisories page rates all five flaws as "medium". The CVE records published by F5, the vendor behind nginx, give three of them a CVSS 3.1 score of 8.1. They spell out the scenario: the worker crashes and restarts, and code execution remains possible if ASLR is disabled or bypassed. All of them require a specific configuration to be exploitable. That is what makes the inventory worthwhile: on a fleet, some servers are simply not affected.

The five flaws and what exposes you

  • CVE-2026-15176, alias and rewrite — heap overflow in the worker when a location combines alias, rewrite and a set or return directive that reads $request_filename, or when $request_filename appears in a log_format. Vulnerable range: 0.1.29 to 1.31.6.
  • CVE-2026-93479, strings with variables — overflow while computing the document root or writing logs, typically a regex map whose captures $1, $2 are read by root or a log_format before the output variable. Vulnerable range: 1.30.0 to 1.30.5 and 1.31.2 to 1.31.6.
  • CVE-2026-95101, HTTP/3 request body — part of an unknown frame may be read as request body: bypass of client_max_body_size or injection into the proxied request, with proxy_request_buffering on, the default value. Vulnerable range: 1.25.0 to 1.31.6.
  • CVE-2026-97629, TLS session tickets — with ssl_session_cache shared:… and no ssl_session_ticket_key, nginx rotates its keys itself; one of them was left uninitialized, which allows forging a session and, according to F5, bypassing client certificate verification. Vulnerable range: 1.23.2 to 1.31.6.
  • CVE-2026-97205, SSI with AIO — use-after-free when aio is enabled and an SSI page contains include virtual commands. Vulnerable range: 0.8.11 to 1.31.6.
  • Published severity — "medium" for all five on nginx.org. According to F5's CVE records, the CVSS 3.1 score is 8.1 for CVE-2026-15176, CVE-2026-93479 and CVE-2026-97205, 6.5 for CVE-2026-97629 and 5.3 for CVE-2026-95101.

Affected and fixed versions

Scroll the table

Flaw or packageVulnerable versionsFixed in
CVE-2026-15176 — alias and rewrite0.1.29 to 1.31.61.30.6 and 1.31.7
CVE-2026-93479 — strings with variables1.30.0 to 1.30.5, 1.31.2 to 1.31.61.30.6 and 1.31.7
CVE-2026-95101 — HTTP/31.25.0 to 1.31.61.30.6 and 1.31.7
CVE-2026-97629 — TLS tickets1.23.2 to 1.31.61.30.6 and 1.31.7
CVE-2026-97205 — SSI with AIO0.8.11 to 1.31.61.30.6 and 1.31.7
Debian 13 package (trixie)Packages older than `1.26.3-3+deb13u10``1.26.3-3+deb13u10` (DSA-6575-1)
Debian 12 package (bookworm)Marked vulnerable as of 22 October 2026Not published yet
Ubuntu packages"Needs evaluation" as of 22 October 2026Not published yet

Distro package or Docker: the version number is not enough

This is the most common objection on a mixed fleet: nginx -v shows 1.26.3 or 1.22.1, far below 1.30.6, and yet the machine may well be fixed. Distributions backport security fixes into their own branch without changing the upstream number: only the package suffix moves. Debian did this for trixie with advisory DSA-6575-1, which covers all five CVEs. Conversely, as of 22 October 2026, the Debian security tracker still marked bookworm as vulnerable, and Ubuntu showed "Needs evaluation" for all of its tracked releases.

The only reliable check is therefore the changelog of the installed package: zgrep -l CVE-2026-15176 /usr/share/doc/nginx*/changelog.Debian.gz on Debian or Ubuntu, rpm -q --changelog nginx | grep CVE-2026-15176 on RHEL, AlmaLinux or Rocky. A matching line means the fix has been backported; nothing at all means it has not been yet. For Docker, the tag is what matters: the official nginx:1.30.6 and nginx:1.31.7 images are live on Docker Hub, and an image pinned to an older tag stays vulnerable until it is replaced.

Audit a server's exposure in ten minutes

  1. Record the version and the source

    nginx -v gives the binary version. Where the package comes from decides how you update it:
    apt-cache policy nginx on Debian or Ubuntu (nginx.org repository or distribution)
    rpm -qi nginx | grep -E 'Version|Release|Vendor' on RHEL and derivatives
    If nginx runs in a container: docker ps | grep -i nginx.

  2. List the compiled modules

    nginx -V 2>&1 | tr ' ' '\n' | grep -E 'http_v3|ssi|threads|file-aio'
    Without --with-http_v3_module, CVE-2026-95101 does not concern you. The SSI module is built by default: only the --without-http_ssi_module option excludes it.

  3. Export the effective configuration

    sudo nginx -T > /root/nginx-conf.txt 2>&1
    nginx -T tests the configuration and prints all of it, included files too. Query this file rather than browsing /etc/nginx by hand: one forgotten include is enough to miss a directive.

  4. Look for alias and $request_filename (CVE-2026-15176)

    grep -nE '^\s*(alias|rewrite)\s' /root/nginx-conf.txt
    grep -n 'request_filename' /root/nginx-conf.txt
    You are exposed if one location combines alias, rewrite and a set or return that reads $request_filename, or if a log_format contains that variable.

  5. Look for regex maps (CVE-2026-93479)

    grep -nA8 '^\s*map ' /root/nginx-conf.txt
    Spot the entries starting with ~, then look for $1, $2 in root and log_format directives. This flaw only affects the 1.30 and 1.31 branches: a server on 1.28 or below is not concerned.

  6. Check HTTP/3 (CVE-2026-95101)

    grep -nE 'listen\s.*quic|http3' /root/nginx-conf.txt
    grep -n 'proxy_request_buffering' /root/nginx-conf.txt
    HTTP/3 enabled in front of a proxy_pass, without proxy_request_buffering off: exposed.

  7. Check TLS tickets (CVE-2026-97629)

    grep -nE 'ssl_session_cache\s.*shared|ssl_session_ticket_key|ssl_session_tickets' /root/nginx-conf.txt
    Exposed if shared: is present without ssl_session_ticket_key or ssl_session_tickets off. The impact described by F5 mainly concerns sites that authenticate clients by certificate (ssl_verify_client).

  8. Check SSI and AIO (CVE-2026-97205)

    grep -nE '^\s*(ssi|aio)\s' /root/nginx-conf.txt
    Exposed if ssi on and aio (value on or threads) apply to the same pages, and those pages contain include virtual commands.

In what order to handle a fleet of servers

With these eight checks, every server lands in one of three boxes. First box: an exposure condition is present and the server receives public traffic. It gets patched today, or receives a mitigation within the hour. Reverse proxies serving HTTP/3 and sites authenticating by client certificate come first, because the described impact hits the proxied request or the authentication itself.

Second box: no condition is present, but the version is in the vulnerable range. The immediate risk is low, and the update is scheduled within the week. Configurations change, and an alias added tomorrow by a developer is enough to reopen CVE-2026-15176.

Third box: version already fixed, or a distribution package whose changelog cites the CVEs. Nothing to do, except recording the date of the check. Keep this table per client: it is also the answer to give when a client asks whether they were affected.

Update environment by environment

  1. nginx.org repository on Debian or Ubuntu

    sudo apt update && sudo apt install --only-upgrade nginx
    Then nginx -v must show 1.30.6 on the stable branch, 1.31.7 or newer on mainline.

  2. nginx.org repository on RHEL, AlmaLinux or Rocky

    sudo dnf upgrade nginx
    Same check with nginx -v. For both families, the repository setup is described on the nginx.org Linux packages page.

  3. Distribution package

    On Debian 13, sudo apt update && sudo apt install --only-upgrade nginx must bring 1.26.3-3+deb13u10 or newer. Elsewhere, apply security updates as soon as they are released and check the changelog as shown above. If your distribution lags behind, switching to the nginx.org repository is possible; first make sure the dynamic modules you depend on exist there.

  4. Docker containers

    In the compose file, pin image: nginx:1.30.6 (or nginx:stable), then:
    docker compose pull && docker compose up -d
    An image built FROM nginx:… must be rebuilt: docker compose build --pull && docker compose up -d.

  5. Server managed by a panel or a hosting provider

    If nginx was installed by an administration panel or by your hosting provider, their update channel delivers the fix. Check nginx -v and the package changelog after their update and, if in doubt, ask the provider on which date the fix was applied.

  6. Test the configuration

    sudo nginx -t
    The expected answer contains syntax is ok and test is successful. Never restart without this test: an invalid configuration leaves the service stopped.

  7. Replace the binary in memory

    Updating the package does not replace the master process already running. sudo ls -l /proc/$(cat /run/nginx.pid)/exe shows (deleted) as long as the old binary is running (adjust the PID file path). sudo systemctl restart nginx cuts traffic for a few seconds; on-the-fly replacement with the USR2 signal, documented by nginx, avoids that cut but requires a good knowledge of your systemd setup.

  8. Check, then monitor

    Run nginx -v and the /proc command again: no more (deleted). Test a site with curl -sI https://your-domain.com. Then add an alert on worker restarts, as in our guide proactive monitoring and alerting on a VPS.

Cannot patch today: the mitigations published by F5

F5's CVE records describe a mitigation for each of the five flaws. They remove the exposure condition without fixing the code: they are stopgap measures.

CVE-2026-15176: do not use alias in the affected location, or do not use $request_filename.
CVE-2026-93479: replace unnamed captures with named captures, such as (?<site>…), and limit their use to the block where the regex applies.
CVE-2026-95101: proxy_request_buffering off;. Upload bodies are then streamed to the application, which changes its behaviour on large files.
CVE-2026-97629: remove ssl_session_cache shared:…, or load static keys with ssl_session_ticket_key (file created by openssl rand 80 > /etc/nginx/ticket.key). Servers running ssl_session_tickets off; are not affected.
CVE-2026-97205: disable aio, or stop serving SSI pages.

Each mitigation is validated with nginx -t then systemctl reload nginx. A reload is enough here, since the binary does not change.

Detection: clues, not proof

A crashing worker leaves a line such as worker process 12345 exited on signal 11 in the error log. Count them with grep -c 'exited on signal' /var/log/nginx/error.log and compare with previous weeks. Repeated crashes on an exposed server are a clue worth investigating, not proof of compromise; their absence is not proof of safety either. General measure, outside the vendor advisory: restrict at the firewall the vhosts that do not need to be public, as detailed in our Linux VPS hardening checklist.

Troubleshooting: errors that follow the update

nginx -v shows 1.30.6, but nothing has changed. The binary on disk is new, the master process is the old one. The command ls -l /proc/<pid>/exe shows it with the (deleted) mark. Fix: restart the service, or replace it on the fly with USR2.

nginx: [emerg] "/etc/nginx/ticket.key" must be 48 or 80 bytes. The ticket key file does not have the right size, often because it was created in base64 or with a trailing newline. Fix: openssl rand 80 > /etc/nginx/ticket.key, without any encoding option, then nginx -t.

nginx is already the newest version. Your distribution's repository does not offer a fixed package yet. Fix: apply the mitigations above and follow the distribution's security tracker, or move to the nginx.org repository.

The container still answers with the old version. The image was pulled, but the container was not recreated, or the service points to a pinned tag. Fix: docker compose up -d --force-recreate, then docker compose exec <service> nginx -v.

Five flaws on twenty servers: an agency's workload

For an agency, this fix is not one command: it is a tour of the fleet. One server per client, different sources (a Debian package here, the nginx.org repository there, a Docker image elsewhere), configurations written by several people. Each machine needs the inventory, the update, the restart, the check, then the answer to the worried client.

The most durable way to reduce this workload is to reduce the number of web servers you administer yourself. With ServOrbit.com reseller hosting, your clients' sites run in cPanel accounts you manage from WHM, under your own brand: you keep the client relationship and your prices, we run the infrastructure. For machines that must stay with root access, the administration option is available on our Cloud VPS. And if you are still weighing the reverse proxy for these machines, our Caddy, Traefik and nginx comparison sets out the criteria.

The official documentation

nginx.org — news of 14 October 2026
nginx security advisories
CHANGES-1.30
CVE-2026-15176 · CVE-2026-93479 · CVE-2026-95101 · CVE-2026-97629 · CVE-2026-97205
Debian DSA-6575-1 · Ubuntu CVE-2026-15176
nginx.org — Linux packages · Controlling nginx · ngx_http_ssl_module

Fewer web servers to patch yourself

With ServOrbit.com reseller hosting, your clients' sites run under your brand, on infrastructure we look after. You keep the client relationship and your prices; we keep the server layer.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab