Vulnerabilities

7 min readUpdated

CVE-2026-15176 and nginx's October 2026 security release

Quick answer

CVE-2026-15176 is a heap buffer overflow in nginx when a location uses the alias directive, a rewrite changes the URI, and $request_filename is then read in a set, return or log format. It was fixed on 14 October 2026 in nginx 1.31.7 and 1.30.6, alongside four other CVEs in the same release covering string-expression evaluation, HTTP/3 body injection, TLS session-ticket forgery and an AIO/SSI use-after-free. Each needs a specific, mostly non-default configuration.

At a glance

high severity
Identifier
CVE-2026-15176
Product
nginx (open source and NGINX Plus)
Affected
nginx open source 0.1.29 – 1.31.6; NGINX Plus before PLS.37.1.0.1 (CR) / PLS.37.0.5.1 (LTS) (see F5 advisory)
Fixed in
nginx 1.31.7 (mainline); nginx 1.30.6 (stable); NGINX Plus PLS.37.1.0.1 / PLS.37.0.5.1; Debian trixie 1.26.3-3+deb13u10
CVSS
8.1 (CVSS 3.1) / 9.2 (CVSS 4.0), per F5; nginx.org severity medium
Disclosed
Known exploited (CISA KEV)
Not listed

Patched 14 October 2026 as part of a five-CVE nginx release. Requires a specific alias/rewrite configuration. No public exploitation reported; not in CISA KEV.

01What is CVE-2026-15176?

CVE-2026-15176 is a heap buffer overflow in nginx's core request handling. It occurs when a location uses the alias directive, a rewrite directive changes the request URI, and the rewritten URI is then mapped to a file path while $request_filename is read — in a set or return directive, or in an access log format. An unauthenticated attacker sends crafted requests, and the worker overflows a heap buffer, crashing and restarting; code execution is described as possible where ASLR is disabled or bypassed.

It was fixed on 14 October 2026 in nginx 1.31.7 (mainline) and 1.30.6 (stable). The underlying cause is an inconsistency window: after a rewrite changes the URI but before a new location is chosen, the rewritten URI may be shorter than the alias location's prefix, and mapping it to a path writes past the allocation. The upstream fix rejects that mapping when the URI-changed flag is set.

The vulnerable pattern (from the upstream fix commit)
location /foo/ {
    alias /bar/;
    rewrite ^/foo/.*$ /x;        # rewrites to a shorter URI
    return 200 $request_filename; # maps URI to path -> overflow
}

02Who is affected?

Open source nginx from 0.1.29 through 1.31.6 is affected; 1.31.7 (mainline) and 1.30.6 (stable) are the first fixed releases. According to the NGINX Plus release notes, NGINX Plus received the fix earlier, in PLS.37.1.0.1 (CR) and PLS.37.0.5.1 (LTS) on 2 September 2026. Distribution coverage is uneven: Debian fixed trixie in 1.26.3-3+deb13u10 (DSA-6575-1), but its tracker still listed bookworm as vulnerable on 24 October 2026, and Ubuntu's tracker still showed the issue as needing triage.

The configuration precondition is important. Using alias is common, and using rewrite is common, but reading $request_filename immediately after a URI-changing rewrite inside an alias location is a narrower pattern. nginx.org lists the severity as medium while F5's CVSS 4.0 base score is 9.2, and Red Hat rates it Important at CVSS 3.1 8.1, explicitly lower than the CVSS 4.0 rating because exploitation depends on a specific server configuration.

03How do I check my configuration?

Dump the merged configuration and look for locations that combine alias with rewrite, and for any use of $request_filename. An awk pass flags locations that contain both an alias and a rewrite; a grep finds $request_filename references to review.

Finding risky alias/rewrite usage
nginx -T 2>/dev/null > /tmp/nginx-full.conf

# locations that contain BOTH alias and rewrite
awk '/^[[:space:]]*location[[:space:]]/{loc=$0; a=0; r=0; n=NR}
     /^[[:space:]]*alias[[:space:]]/{a=1}
     /^[[:space:]]*rewrite[[:space:]]/{r=1}
     a&&r&&!p[n]++{print n": "loc}' /tmp/nginx-full.conf

# any use of $request_filename to review
grep -nE '\$request_filename' /tmp/nginx-full.conf

04The four other CVEs in the same release

nginx 1.31.7 / 1.30.6 closed five issues. Treat them as one patch, but know which of your configurations each one needs, because they are independent and target different modules.

CVE-2026-93479 is the one to watch if you already patched in July: it is a residual overflow in the script-engine hardening that shipped for the map heap overflow, CVE-2026-42533, affecting document-root calculation and request logging in nginx 1.31.2 to 1.31.6 and 1.30.0 to 1.30.5. CVE-2026-97629 is notable because a forged TLS session can let an attacker bypass client-certificate verification where mutual TLS is used, the same outcome as the earlier session-resumption flaw CVE-2025-23419.

One SSI issue is easy to confuse with CVE-2026-97205: CVE-2026-56434 (SSI with proxy_pass and proxy_buffering off, exploitable only by a man-in-the-middle controlling upstream responses) was fixed in the July release (1.31.3 / 1.30.4), not this one. If you run SSI, make sure you are past both releases.

CVEWhat it isConfiguration precondition
CVE-2026-15176Heap overflow (alias + rewrite)alias location, URI-changing rewrite, read of $request_filename
CVE-2026-93479Heap overflow in string-expression evaluation (follow-up to the CVE-2026-42533 fix)root or access log format reads a regex map's capture before the map output, or a non-cacheable variable in a string expression
CVE-2026-97205Use-after-free (AIO + SSI)asynchronous file I/O (aio) enabled AND an SSI page with 'include virtual'
CVE-2026-97629TLS session-ticket forgeryssl_session_cache shared without an explicit ssl_session_ticket_key, so keys auto-rotate
CVE-2026-95101HTTP/3 request-body injection / limit bypassHTTP/3 enabled with proxy_request_buffering on

05How do I fix the October release issues?

Upgrade to nginx 1.31.7 or 1.30.6, or your distribution's patched package, and restart nginx afterwards; one open source upgrade closes all five. On NGINX Plus, four of the five were fixed in PLS.37.1.0.1 / PLS.37.0.5.1, but CVE-2026-95101 needs PLS.37.2.0.1 (CR) or PLS.37.0.7.1 (LTS), released on 14 October 2026.

If you must stagger the work, the per-CVE configuration mitigations are below. They remove triggers; they are not a substitute for the patch, and several of these bugs have no safe config workaround beyond disabling the feature.

  • CVE-2026-15176: avoid reading $request_filename after a URI-changing rewrite in an alias location; use root instead of alias where the layout allows, or do the rewrite in a location without alias and let a new location pick it up
  • CVE-2026-93479: do not reference a regex map's capture variables before the map output in root or log_format expressions
  • CVE-2026-97205: disable asynchronous file I/O (aio) or disable SSI 'include virtual' until patched
  • CVE-2026-97629: configure an explicit ssl_session_ticket_key file, or disable session tickets, so no slot is left uninitialised
  • CVE-2026-95101: this is an HTTP/3 parsing bug — patching is the fix; disabling HTTP/3 removes the surface

06What a reverse proxy can and cannot do

Most of these are internal nginx bugs that a filter inside the same nginx cannot catch. CVE-2026-15176 and CVE-2026-93479 corrupt memory during request processing; CVE-2026-97205 is a use-after-free in file handling; CVE-2026-97629 is in the TLS stack. A web application firewall sitting in front of an unpatched origin reduces exposure and can absorb the crash-loop denial of service, in the way any reverse proxy shields an origin, but it does not patch the origin; see what virtual patching can and cannot do.

Two have an edge angle worth naming. CVE-2026-95101 is about bypassing client_max_body_size over HTTP/3, so request-size and body limits enforced at a separate, patched proxy tier add defence in depth. CVE-2026-97629 undermines client-certificate checks, so if you rely on mutual TLS for authentication, patching is the only real answer — an edge layer cannot restore a verification step that the server skipped. For the broader context on TLS, see what SSL/TLS is.

07Timeline

DateEvent
10 Jul 2026Upstream fix for the alias overflow authored (commit dated 10 July)
2 Sep 2026NGINX Plus PLS.37.1.0.1 / PLS.37.0.5.1 ship fixes for four of the five issues
14 Oct 2026nginx 1.31.7 / 1.30.6 released fixing all five; NGINX Plus PLS.37.2.0.1 / PLS.37.0.7.1 fix CVE-2026-95101
14 Oct 2026F5 and NVD records published for CVE-2026-15176 and the others
21 Oct 2026CSA Singapore alert covers CVE-2026-15176, CVE-2026-97205 and CVE-2026-93479

Questions

Frequently asked questions

A location that uses the alias directive, a rewrite directive that changes the request URI, and a read of the $request_filename variable before a new location is chosen — in a set, return, add_header or if directive, or in an access log format. All three must be present. A plain alias location, or a rewrite that uses break, does not trigger it.

nginx 1.31.7 (mainline) and 1.30.6 (stable), released on 14 October 2026, fix all five issues in one update. On NGINX Plus, PLS.37.2.0.1 (CR) or PLS.37.0.7.1 (LTS) covers all five. Distribution packages ship fixes under their own numbers, such as Debian trixie 1.26.3-3+deb13u10 (DSA-6575-1), but some distribution releases were still unpatched in late October 2026.

No, but they are closely related. CVE-2026-93479 is a residual overflow in the script-engine hardening that fixed the July map heap overflow (CVE-2026-42533), affecting document-root calculation and request logging. The October fix tightens that bounds-checking. If you only patched for CVE-2026-42533 in July, you still need the October release to close CVE-2026-93479.

When TLS session-ticket keys are auto-rotated without an explicit key file, one key slot was left uninitialised, so an attacker could forge a session. A forged session can let a client skip verification of its certificate. If you use client certificates for authentication, that is an authentication bypass, and no edge filter can restore the check the server skipped — you must patch.

Disabling HTTP/3 removes that specific attack surface, since the bug is in HTTP/3 frame parsing with proxy_request_buffering on. It is a reasonable stopgap, but it does nothing for the other four CVEs in the release. Upgrading to nginx 1.31.7 or 1.30.6 fixes all five at once, which is simpler and safer than toggling individual features.

Sources

Sources and verification

The alias/rewrite pattern from the fix commit loaded into nginx 1.22.1 with nginx -t, and the audit awk and grep run with mawk, GNU awk 5.2.1 and GNU grep 3.8 against a test configuration, on Debian 12, October 2026.

  1. 01NVD — CVE-2026-15176 · NVD
  2. 02nginx security advisories · nginx.org
  3. 03nginx 1.31.7 release notes · nginx GitHub
  4. 04nginx fix commit f8a23425 (avoid post-rewrite URI mapping with alias) · nginx GitHub
  5. 05F5 advisory K000162416 (CVE-2026-15176) · F5
  6. 06CSA Singapore alert AL-2026-150 (F5 NGINX critical vulnerabilities) · CSA Singapore
  7. 07Debian security tracker — CVE-2026-15176 · Debian
  8. 08Ubuntu — CVE-2026-15176 · Ubuntu
  9. 09Red Hat — CVE-2026-15176 · Red Hat
  10. 10NGINX Plus release notes · F5 NGINX docs

Last updated