Vulnerabilities
7 min readUpdatedCVE-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.
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.
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.conf04The 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.
| CVE | What it is | Configuration precondition |
|---|---|---|
| CVE-2026-15176 | Heap overflow (alias + rewrite) | alias location, URI-changing rewrite, read of $request_filename |
| CVE-2026-93479 | Heap 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-97205 | Use-after-free (AIO + SSI) | asynchronous file I/O (aio) enabled AND an SSI page with 'include virtual' |
| CVE-2026-97629 | TLS session-ticket forgery | ssl_session_cache shared without an explicit ssl_session_ticket_key, so keys auto-rotate |
| CVE-2026-95101 | HTTP/3 request-body injection / limit bypass | HTTP/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
| Date | Event |
|---|---|
| 10 Jul 2026 | Upstream fix for the alias overflow authored (commit dated 10 July) |
| 2 Sep 2026 | NGINX Plus PLS.37.1.0.1 / PLS.37.0.5.1 ship fixes for four of the five issues |
| 14 Oct 2026 | nginx 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 2026 | F5 and NVD records published for CVE-2026-15176 and the others |
| 21 Oct 2026 | CSA Singapore alert covers CVE-2026-15176, CVE-2026-97205 and CVE-2026-93479 |
Questions
Frequently asked questions
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.
- 01NVD — CVE-2026-15176 · NVD
- 02nginx security advisories · nginx.org
- 03nginx 1.31.7 release notes · nginx GitHub
- 04nginx fix commit f8a23425 (avoid post-rewrite URI mapping with alias) · nginx GitHub
- 05F5 advisory K000162416 (CVE-2026-15176) · F5
- 06CSA Singapore alert AL-2026-150 (F5 NGINX critical vulnerabilities) · CSA Singapore
- 07Debian security tracker — CVE-2026-15176 · Debian
- 08Ubuntu — CVE-2026-15176 · Ubuntu
- 09Red Hat — CVE-2026-15176 · Red Hat
- 10NGINX Plus release notes · F5 NGINX docs
Last updated