{"id":3559,"date":"2026-10-15T14:33:23","date_gmt":"2026-10-15T14:33:23","guid":{"rendered":"https:\/\/thedigitalfortress.us\/?p=3559"},"modified":"2026-10-15T14:33:23","modified_gmt":"2026-10-15T14:33:23","slug":"nginx-fixes-5-flaws-including-possible-rce-and-a-tls-bug-that-may-skip-client-cert-checks","status":"publish","type":"post","link":"https:\/\/thedigitalfortress.us\/?p=3559","title":{"rendered":"NGINX Fixes 5 Flaws, Including Possible RCE and a TLS Bug That May Skip Client-Cert Checks"},"content":{"rendered":"<div id=\"articlebody\">\n<div class=\"separator\" style=\"clear: both;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEionuV8CAd7SP0bgEbHyb-0hp7JWNkWpPjYtkNH9p86nRQrxDN1T97D1cragnVVzAwCEFCuqrwuysgwzxJLfvTXrYhMSGj5rbBzrpjW-VPvAmrc2-9EAR_hBmPigJUOjynvkm0ArpyasyzCOAWUWFYdCqzsbCJVOsxC09LnYwH2dcV4j4Vm9S9VDelXUlc\/s1700-nu-rw-lo-l85-e365\/tls.jpg\" style=\"display: block;  text-align: center; clear: left; float: left;\"><\/a><\/div>\n<p>NGINX released versions 1.30.6 and 1.31.7 on October 14 to fix five vulnerabilities, one of them present in every release since May 2005.<\/p>\n<p>There are three memory bugs that F5, the company behind NGINX, says could crash a worker process or possibly let an attacker run code, and each requires a specific configuration to exploit.<\/p>\n<p>A fourth lets an attacker forge a TLS session that could get past client-certificate checks, though F5 calls the forgery non-deterministic and beyond the attacker&#8217;s control. The fifth lets an HTTP\/3 client slip extra bytes into a request that NGINX passes on to a backend.<\/p>\n<p>None of the five was in CISA&#8217;s Known Exploited Vulnerabilities catalog as of October 15, and neither NGINX nor F5 reports attacks. <a href=\"https:\/\/nginx.org\/en\/security_advisories.html\" target=\"_blank\">NGINX rates all five medium<\/a>. F5 scores the three memory bugs 9.2, Critical, on CVSS v4.0, the TLS flaw 8.3, and the HTTP\/3 flaw 6.9.<\/p>\n<h3>Which Configurations Are Exposed<\/h3>\n<p>Every one of the five needs a directive you added: an alias with a rewrite, a regex map, AIO with SSI, a shared TLS session cache, or HTTP\/3. NGINX&#8217;s own documentation recommends the shared session cache and request buffering; the other condition for the HTTP\/3 flaw is on by default.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/growth-ai-control-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjVYuoalvwUlwvLZFDideJ8jW4rz-IodX0Lwi7uyP7Ab0wiDeu_BqVhPDdejQQ65MC3p9Xc4MApnHz56NJ5SDc1HMg0DvozkkGYv9TGtDLCh26v1yD5-GyzQxnA5-6A6B4beW96H_6FyrByq22cvU5JDF-i8e5GIfV4wg1SpCvjwAJt74FaqkAb2gzqE7ll\/s728-nu-rw-lo-l85-e365\/core-d.png\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>The TLS flaw sits in the automatic rotation of session ticket keys. Session tickets let a client resume a TLS session without a full handshake, and since version 1.23.2, from October 2022, a <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html#ssl_session_cache\" target=\"_blank\">shared session cache<\/a> makes NGINX generate and rotate the ticket keys itself unless you load keys from a file.<\/p>\n<p><a name=\"more\"\/><\/p>\n<p>Each worker process keeps a copy of three key slots. Rotation copied only two, so the third slot held whatever was in memory before, and a ticket naming that slot could be verified and decrypted with that uninitialized key material, \u00aballowing a forged session,\u00bb <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/1916f26e6ca49296568633d309777e36527e5bb2\" target=\"_blank\">the fix commit<\/a> says.<\/p>\n<p>F5 says the forgery works \u00abin a non-deterministic manner that is beyond the attacker&#8217;s control,\u00bb and that an attacker could use it to bypass verification of client certificates. The exposed setting, ssl_session_cache shared:SSL:10m, is the one NGINX&#8217;s documentation uses in its example configuration. NGINX fixed a session-reuse flaw with the same consequence, CVE-2025-23419, in February 2025.<\/p>\n<p>The conditions and workarounds below are NGINX&#8217;s and F5&#8217;s. The version ranges are from NGINX&#8217;s advisories page.<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Flaw\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        What it allows\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Configuration that exposes you\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Affected versions\n      <\/th>\n<th scope=\"col\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        If you cannot upgrade (F5)\n      <\/th>\n<\/tr>\n<tr>\n<th scope=\"row\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <a href=\"https:\/\/my.f5.com\/manage\/s\/article\/K000162416\"><br \/>\n          CVE-2026-15176<br \/>\n        <\/a>\n      <\/th>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Heap overflow in a worker process: crash, possibly code execution\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        A location with <code>alias<\/code>, a <code>rewrite<\/code> that changes the URI, and anything that reads <code>$request_filename<\/code> (<code>return<\/code>, <code>set<\/code>, <code>if<\/code>, <code>add_header<\/code> or the access-log format)\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        0.1.29 to 1.31.6\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Do not use <code>alias<\/code> in that location. Do not use <code>$request_filename<\/code>.\n      <\/td>\n<\/tr>\n<tr>\n<th scope=\"row\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <a href=\"https:\/\/my.f5.com\/manage\/s\/article\/K000162607\"><br \/>\n          CVE-2026-93479<br \/>\n        <\/a>\n      <\/th>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Heap overflow in a worker process: crash, possibly code execution\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        A regex <code>map<\/code> whose captures are referenced by <code>root<\/code> or <code>log_format<\/code> before the map&#8217;s output variable\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        1.30.0 to 1.30.5 and 1.31.2 to 1.31.6\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Use named captures, and use them only inside the block with the regex match.\n      <\/td>\n<\/tr>\n<tr>\n<th scope=\"row\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <a href=\"https:\/\/my.f5.com\/manage\/s\/article\/K000162608\"><br \/>\n          CVE-2026-97205<br \/>\n        <\/a>\n      <\/th>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Use-after-free in a worker process: crash, memory corruption, possibly code execution\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <code>aio<\/code> enabled and an SSI page with <code>include virtual<\/code> commands, in some configurations\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        0.8.11 to 1.31.6\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Turn <code>aio<\/code> off, or do not serve SSI pages.\n      <\/td>\n<\/tr>\n<tr>\n<th scope=\"row\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <a href=\"https:\/\/my.f5.com\/manage\/s\/article\/K000162613\"><br \/>\n          CVE-2026-95101<br \/>\n        <\/a>\n      <\/th>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Extra bytes injected into a proxied request, or a body past <code>client_max_body_size<\/code>\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        HTTP\/3 with<br \/>\n        <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_request_buffering\"><br \/>\n          <code>proxy_request_buffering on<\/code><br \/>\n        <\/a><br \/>\n        , the default\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        1.25.0 to 1.31.6\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Set <code>proxy_request_buffering off<\/code>.\n      <\/td>\n<\/tr>\n<tr>\n<th scope=\"row\" style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <a href=\"https:\/\/my.f5.com\/manage\/s\/article\/K000162606\"><br \/>\n          CVE-2026-97629<br \/>\n        <\/a>\n      <\/th>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        A forged TLS session that could bypass client-certificate verification (non-deterministic and beyond the attacker&#8217;s control, F5 says)\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        <code>ssl_session_cache shared:...<\/code> without<br \/>\n        <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html#ssl_session_ticket_key\"><br \/>\n          <code>ssl_session_ticket_key<\/code><br \/>\n        <\/a><br \/>\n        , which turns on automatic key rotation\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        1.23.2 to 1.31.6\n      <\/td>\n<td style=\"border: 1px solid rgb(204, 204, 204); padding: 8px;\">\n        Remove the shared cache directive, or load keys from a file with <code>ssl_session_ticket_key<\/code>. Servers with <code>ssl_session_tickets off<\/code> are not affected.\n      <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>One Flaw Traces to July&#8217;s Fix<\/h3>\n<p>The map flaw, CVE-2026-93479, is in the string-handling code that NGINX patched on July 15 for CVE-2026-42533, a heap overflow F5 scored 9.2 that is reached through a regex map&#8217;s captures.<\/p>\n<p>The new overflow became possible after a change in that July release, according to <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/6aa4b3fdd4fdc156153f2981eb4070690624447c\" target=\"_blank\">the fix commit<\/a>. A July patch added protection against overrunning a buffer, but data could still spill into a reserved area, and <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/a8289aa69c74f7e664ad63b91c17aa2a554f190f\" target=\"_blank\">a second July patch<\/a> then sized the final string from that spilled length, so the string could outgrow its buffer.<\/p>\n<p>The commit puts limits on it. The overflow is at most the size of the reserved area on the document-root path, and a single null byte on the access-log path.<\/p>\n<p>F5&#8217;s advisory and NGINX&#8217;s advisories page list 1.30.0 and 1.31.2 as the earliest affected versions, which come before the July change. A server patched in July is inside the affected range either way.<\/p>\n<p>F5&#8217;s July workaround had already been questioned. Researcher Stan Shaw told The Hacker News in July that switching to named captures left a narrower path open, and that upgrading was \u00abthe only complete fix.\u00bb<\/p>\n<p>The fix commits for the <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/f8a23425bd6840c4c36b4264edf576ba3646156f\" target=\"_blank\">alias<\/a>, <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/6adfc05ece48f92446383ec1f145446848694698\" target=\"_blank\">AIO<\/a> and <a href=\"https:\/\/github.com\/nginx\/nginx\/commit\/1c173a2d8767730e678c27446138d7ae5dd6fd64\" target=\"_blank\">HTTP\/3<\/a> flaws describe the other three bugs. The alias flaw opens in the moment after a rewrite changes a request&#8217;s URI and before NGINX picks the next location. If anything reads $request_filename in that window, and the location&#8217;s prefix is longer than the rewritten URI, mapping the URI to a file path overflows a buffer.<\/p>\n<p>The AIO flaw is a counter. Each pending asynchronous operation on a request adds one to an 8-bit field with no check, so 256 pending operations wrap it to zero and the request can be freed while those operations still point at its memory. NGINX names SSI pages with include virtual commands, which can run their included requests in parallel, as the trigger.<\/p>\n<div class=\"dog_two clear\">\n<div class=\"cf\"><a href=\"https:\/\/thehackernews.uk\/network-defense-d\" rel=\"nofollow noopener sponsored\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"lazyload\" alt=\"Cybersecurity\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjVV2rRkX8tRMF6gCzemvQNpwFwGxRWxY1cJEYfoLLSj1EZYJOlj5WTR77t0i6kELXujYcaHTpRDqTjCbVHH5Pnh7wzxUiKP5j4dsDkWIMlp2bmpZsL0jeAsA_19pHH5UPtyBvNkZdyGEULOAsXPcraMP5CYjQRFefhXRSdEjYkrdcpUnc4ILcvcdEfAauE\/s728-nu-rw-lo-l85-e365\/tl-d.jpg\" width=\"729\" height=\"91\"\/><\/a><\/div>\n<\/div>\n<p>The HTTP\/3 flaw came from one parser field doing two jobs: holding the remaining length of an unknown frame being skipped, and the number of DATA bytes to pass on as request body. When an unknown frame was split across two reads, the leftover count was treated as body and sent to the backend, outside the client_max_body_size check.<\/p>\n<h3>What to Do<\/h3>\n<p>Upgrade to <a href=\"https:\/\/nginx.org\/en\/download.html\" target=\"_blank\">1.30.6 on the stable branch or 1.31.7 on mainline<\/a>. The stable release contains only fixes. NGINX publishes fixes for those two branches only, so older branches such as 1.28 stay inside the affected ranges, and a distribution package is fixed only if your distribution has backported the patches.<\/p>\n<p>NGINX Plus customers, and users of F5&#8217;s Ingress Controller, Gateway Fabric, Instance Manager and WAF products, should check F5&#8217;s advisories, which list affected builds and, for several products, no fixed build as of October 15.<\/p>\n<p>If you cannot upgrade yet, the table above has F5&#8217;s workaround for each flaw. To see which paths your server has enabled, print the running configuration with <code>nginx -T<\/code> and search it for <code>alias<\/code> beside a <code>rewrite<\/code>, a regex <code>map<\/code> used by <code>root<\/code> or <code>log_format<\/code>, <code>aio<\/code> together with <code>ssi<\/code>, <code>listen<\/code> lines with <code>quic<\/code>, and <code>ssl_session_cache shared<\/code> without <code>ssl_session_ticket_key<\/code>.<\/p>\n<p>The rewrite-module overflow NGINX patched in May, CVE-2026-42945, was being exploited within days of disclosure, VulnCheck found. This is NGINX&#8217;s eighth security release of 2026.<\/p>\n<p>F5 credits Matt Suiche of Tolmo and Mateusz Gierblinski with the map flaw, Hansol Lee of GOTROOT with the HTTP\/3 flaw, PhiNode Labs with the TLS flaw, and a researcher it names as Cyberlanc3r with the AIO flaw.<\/p>\n<p>F5 found the alias flaw itself. NGINX also released <a href=\"https:\/\/nginx.org\/en\/docs\/njs\/security.html\" target=\"_blank\">njs 1.0.2<\/a> the same day, fixing two medium-severity XML-handling flaws in its JavaScript module, CVE-2026-101025 and CVE-2026-101019.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>NGINX released versions 1.30.6 and 1.31.7 on October 14 to fix five vulnerabilities, one of them present in every release since May 2005. There are three memory bugs that F5,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3560,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[610,931,3799,655,11,584,1230,316,3798,2611],"class_list":["post-3559","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-bug","tag-checks","tag-clientcert","tag-fixes","tag-flaws","tag-including","tag-nginx","tag-rce","tag-skip","tag-tls"],"_links":{"self":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/3559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3559"}],"version-history":[{"count":0,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/posts\/3559\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=\/wp\/v2\/media\/3560"}],"wp:attachment":[{"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thedigitalfortress.us\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}