From mdounin at mdounin.ru Sun Oct 25 17:58:02 2026 From: mdounin at mdounin.ru (=?utf-8?q?Maxim_Dounin?=) Date: Sun, 25 Oct 2026 20:58:02 +0300 Subject: [PATCH] Tests: compatibility with OpenSSL 4.1 Message-ID: <7a191a1f819d977261db.1792951082@vm-bsd.mdounin.ru> # HG changeset patch # User Maxim Dounin # Date 1792947499 -10800 # Sun Oct 25 19:58:19 2026 +0300 # Node ID 7a191a1f819d977261db98271a77219204926a4a # Parent 84c77c54e70f9740676c678bd46d3650727d77e7 Tests: compatibility with OpenSSL 4.1. In OpenSSL 4.1, the X509_check_host() function no longer tries to check CNs in certificates (including when there are no subject alternative names defined in the certificate), following the changes introduced by RFC 9525. Accordingly, relevant certificate verification tests (proxy_ssl_verify.t, etc.) were updated to expect failures during verification of certificates with a CN only when using OpenSSL 4.1. Additionally, grpc_ssl.t was updated to provide the correct subject alternative name in the certificate being verified, unbreaking the test with OpenSSL 4.1. diff --git a/grpc_ssl.t b/grpc_ssl.t --- a/grpc_ssl.t +++ b/grpc_ssl.t @@ -96,12 +96,27 @@ http { EOF -$t->write_file('openssl.conf', <write_file('openssl.localhost.conf', <write_file('openssl.client.conf', <testdir(); @@ -109,7 +124,7 @@ my $tr = `openssl genrsa -help 2>&1` =~ foreach my $name ('localhost') { system('openssl req -x509 -new ' - . "-config $d/openssl.conf -subj /CN=$name/ " + . "-config $d/openssl.$name.conf " . "-out $d/$name.crt -keyout $d/$name.key " . ">>$d/openssl.out 2>&1") == 0 or die "Can't create certificate for $name: $!\n"; @@ -120,7 +135,7 @@ foreach my $name ('client') { . "-aes128 $tr 2048 >>$d/openssl.out 2>&1") == 0 or die "Can't create private key: $!\n"; system('openssl req -x509 -new ' - . "-config $d/openssl.conf -subj /CN=$name/ " + . "-config $d/openssl.$name.conf " . "-out $d/$name.crt " . "-key $d/$name.key -passin pass:$name" . ">>$d/openssl.out 2>&1") == 0 diff --git a/proxy_ssl_verify.t b/proxy_ssl_verify.t --- a/proxy_ssl_verify.t +++ b/proxy_ssl_verify.t @@ -185,7 +185,14 @@ like(http_get('/fail'), qr/502 Bad/ms, ' # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + like(http_get('/cn'), qr/200 OK/ms, 'verify cn'); + +} + like(http_get('/cn/fail'), qr/502 Bad/ms, 'verify cn fail'); # untrusted diff --git a/stream_proxy_ssl_verify.t b/stream_proxy_ssl_verify.t --- a/stream_proxy_ssl_verify.t +++ b/stream_proxy_ssl_verify.t @@ -160,7 +160,14 @@ isnt(get(8082), 'OK', 'verify fail'); # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + is(get(8083), 'OK', 'verify cn'); + +} + isnt(get(8084), 'OK', 'verify cn fail'); # untrusted diff --git a/uwsgi_ssl_verify.t b/uwsgi_ssl_verify.t --- a/uwsgi_ssl_verify.t +++ b/uwsgi_ssl_verify.t @@ -177,7 +177,14 @@ like(http_get('/fail'), qr/502 Bad/ms, ' # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + like(http_get('/cn'), qr/200 OK/ms, 'verify cn'); + +} + like(http_get('/cn/fail'), qr/502 Bad/ms, 'verify cn fail'); # untrusted From mdounin at mdounin.ru Tue Oct 27 03:15:59 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 06:15:59 +0300 Subject: [nginx-tests] Tests: compatibility with OpenSSL 4.1. Message-ID: details: http://freenginx.org/hg/nginx-tests/rev/7a191a1f819d branches: changeset: 2092:7a191a1f819d user: Maxim Dounin date: Sun Oct 25 19:58:19 2026 +0300 description: Tests: compatibility with OpenSSL 4.1. In OpenSSL 4.1, the X509_check_host() function no longer tries to check CNs in certificates (including when there are no subject alternative names defined in the certificate), following the changes introduced by RFC 9525. Accordingly, relevant certificate verification tests (proxy_ssl_verify.t, etc.) were updated to expect failures during verification of certificates with a CN only when using OpenSSL 4.1. Additionally, grpc_ssl.t was updated to provide the correct subject alternative name in the certificate being verified, unbreaking the test with OpenSSL 4.1. diffstat: grpc_ssl.t | 21 ++++++++++++++++++--- proxy_ssl_verify.t | 7 +++++++ stream_proxy_ssl_verify.t | 7 +++++++ uwsgi_ssl_verify.t | 7 +++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diffs (104 lines): diff --git a/grpc_ssl.t b/grpc_ssl.t --- a/grpc_ssl.t +++ b/grpc_ssl.t @@ -96,12 +96,27 @@ http { EOF -$t->write_file('openssl.conf', <write_file('openssl.localhost.conf', <write_file('openssl.client.conf', <testdir(); @@ -109,7 +124,7 @@ my $tr = `openssl genrsa -help 2>&1` =~ foreach my $name ('localhost') { system('openssl req -x509 -new ' - . "-config $d/openssl.conf -subj /CN=$name/ " + . "-config $d/openssl.$name.conf " . "-out $d/$name.crt -keyout $d/$name.key " . ">>$d/openssl.out 2>&1") == 0 or die "Can't create certificate for $name: $!\n"; @@ -120,7 +135,7 @@ foreach my $name ('client') { . "-aes128 $tr 2048 >>$d/openssl.out 2>&1") == 0 or die "Can't create private key: $!\n"; system('openssl req -x509 -new ' - . "-config $d/openssl.conf -subj /CN=$name/ " + . "-config $d/openssl.$name.conf " . "-out $d/$name.crt " . "-key $d/$name.key -passin pass:$name" . ">>$d/openssl.out 2>&1") == 0 diff --git a/proxy_ssl_verify.t b/proxy_ssl_verify.t --- a/proxy_ssl_verify.t +++ b/proxy_ssl_verify.t @@ -185,7 +185,14 @@ like(http_get('/fail'), qr/502 Bad/ms, ' # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + like(http_get('/cn'), qr/200 OK/ms, 'verify cn'); + +} + like(http_get('/cn/fail'), qr/502 Bad/ms, 'verify cn fail'); # untrusted diff --git a/stream_proxy_ssl_verify.t b/stream_proxy_ssl_verify.t --- a/stream_proxy_ssl_verify.t +++ b/stream_proxy_ssl_verify.t @@ -160,7 +160,14 @@ isnt(get(8082), 'OK', 'verify fail'); # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + is(get(8083), 'OK', 'verify cn'); + +} + isnt(get(8084), 'OK', 'verify cn fail'); # untrusted diff --git a/uwsgi_ssl_verify.t b/uwsgi_ssl_verify.t --- a/uwsgi_ssl_verify.t +++ b/uwsgi_ssl_verify.t @@ -177,7 +177,14 @@ like(http_get('/fail'), qr/502 Bad/ms, ' # commonName +TODO: { +local $TODO = 'rejected by OpenSSL 4.1.0+' + if $t->has_feature('openssl:4.1.0'); + like(http_get('/cn'), qr/200 OK/ms, 'verify cn'); + +} + like(http_get('/cn/fail'), qr/502 Bad/ms, 'verify cn fail'); # untrusted From mdounin at mdounin.ru Tue Oct 27 05:41:53 2026 From: mdounin at mdounin.ru (=?utf-8?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 08:41:53 +0300 Subject: [PATCH 0 of 3] patches based on fixes by F5 Message-ID: Hello! The following patch series addresses issues relevant to freenginx among those recently fixed by F5 as security issues in F5 NGINX. In particular: - Fixed use of an uninitialized TLS session ticket key when automatic ticket key rotation is used, which makes it possible to forge SSL sessions and bypass SSL certificate authentication (CVE-2026-97629); - Fixed a segmentation fault which might occur with many SSI includes when using AIO (CVE-2026-97205, though not considered to be a security issue in freenginx, see below); - Fixed handling of unknown frames when reading a request body in the experimental HTTP/3 implementation (CVE-2026-95101, though not considered to be a security issue in freenginx, see below). Detailed analysis of the issues fixed by F5: *) Security: a buffer overflow might occur in a worker process when using the "alias" directive if the request URI was changed by the "rewrite" directive and was then mapped to a file path (CVE-2026-15176). Relevant commit: Avoid post-rewrite URI to path mapping with alias https://github.com/nginx/nginx/commit/f8a23425bd6840c4c36b4264edf576ba3646156f In freenginx, the issue cannot happen due to mitigations introduced in 9493:aae28b083279 (freenginx 1.29.7). Also, the security impact is questionable, since the bug can be triggered only with a specially crafted configuration. *) Security: a buffer overflow might occur in a worker process while evaluating string expressions with variables, which affected the document root calculation and request logging in the http and stream modules (CVE-2026-93479). Thanks to Matt Suiche of Tolmo Inc. Relevant commit: Script: reserved memory overrun protection in ngx_http_script_run() https://github.com/nginx/nginx/commit/6aa4b3fdd4fdc156153f2981eb4070690624447c In freenginx, the affected code is not present. Further, since 9577:5bfb1aa8b443 (freenginx 1.31.4) the underlying problem with incorrect length calculations is fixed. *) Security: when using HTTP/3 a part of an unknown frame might be treated as the request body, which might result in bypassing the "client_max_body_size" limit or injecting data in the proxied request (CVE-2026-95101). Thanks to Hansol Lee of GOTROOT. Relevant commit: HTTP/3: kept the skipped frame length separate from data length https://github.com/nginx/nginx/commit/1c173a2d8767730e678c27446138d7ae5dd6fd64 The issue is valid and affects freenginx. The patch looks good and is included in this patch series. However, since the issue is in the experimental HTTP/3 code, it is not considered to be a security issue. *) Security: when using TLS session ticket key rotation, one of the keys was left uninitialized, which might allow to forge a session (CVE-2026-97629). Thanks to PhiNode Labs. Relevant commit: SSL: synced all session ticket keys to the worker process https://github.com/nginx/nginx/commit/1916f26e6ca49296568633d309777e36527e5bb2 The issue is valid and affects freenginx. The patch included in this patch series is identical to the one from F5 (which is trivial), though it provides a more relevant commit message. *) Security: when using asynchronous file I/O (AIO), use-after-free might occur in certain configurations if the SSI page has "include virtual" commands (CVE-2026-97205). Thanks to cyberlancer. Relevant commit: Limited the number of pending operations per request https://github.com/nginx/nginx/commit/6adfc05ece48f92446383ec1f145446848694698 The issue looks valid and affects freenginx. However, triggering the issue requires a configuration with AIO enabled and control over a resource processed by SSI, which is not expected to be available to external attackers and implies at least a DoS impact. Further, exploiting this issue for anything beyond DoS seems unlikely. As such, it is not considered to be a security issue. An alternative patch to address this issue is included in this patch series. -- Maxim Dounin From mdounin at mdounin.ru Tue Oct 27 05:41:54 2026 From: mdounin at mdounin.ru (=?utf-8?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 08:41:54 +0300 Subject: [PATCH 1 of 3] SSL: fixed syncing of keys with automatic ticket key rotation In-Reply-To: References: Message-ID: # HG changeset patch # User Maxim Dounin # Date 1793076459 -10800 # Tue Oct 27 07:47:39 2026 +0300 # Node ID d08712494b7af0e2611c4b5148129fd4c5bc9c50 # Parent e4d0a072a17b87c328265855e8bb43b54956b8ea SSL: fixed syncing of keys with automatic ticket key rotation. Optimized rotation of session ticket keys as introduced in 8085:043006e5a0b1 (1.23.2) changed the number of keys used from 2 to 3, but the number of keys synced from shared memory to worker processes was not updated. As a result, an uninitialized key was used within worker processes, making it possible to forge a session (CVE-2026-97629). The fix is to sync the correct number of keys. See also: https://github.com/nginx/nginx/commit/1916f26e6ca49296568633d309777e36527e5bb2 diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -5456,7 +5456,7 @@ ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ /* sync keys to the worker process memory */ ngx_memcpy(keys->elts, cache->ticket_keys, - 2 * sizeof(ngx_ssl_ticket_key_t)); + 3 * sizeof(ngx_ssl_ticket_key_t)); ngx_shmtx_unlock(&shpool->mutex); From mdounin at mdounin.ru Tue Oct 27 05:41:55 2026 From: mdounin at mdounin.ru (=?utf-8?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 08:41:55 +0300 Subject: [PATCH 2 of 3] Fixed r->main->blocked overflow with many subrequests In-Reply-To: References: Message-ID: <19f937a6a6bf0c24dacf.1793079715@vm-bsd.mdounin.ru> # HG changeset patch # User Maxim Dounin # Date 1793076899 -10800 # Tue Oct 27 07:54:59 2026 +0300 # Node ID 19f937a6a6bf0c24dacfce1068d4153656b9f995 # Parent d08712494b7af0e2611c4b5148129fd4c5bc9c50 Fixed r->main->blocked overflow with many subrequests. Similarly to r->main->count overflow by subrequests as addressed by 6238:8c6e71722aff (which became possible after subrequest limiting changes in 6237:06e850859a26), r->main->blocked might overflow if there are multiple AIO operations. This could result in a request being freed prematurely, followed by accesses to already freed memory when an AIO operation completes (known as CVE-2026-97205, though security impact is questionable). The fix is to use 16 bits for the r->main->blocked counter, so the subrequest limit introduced in 6238:8c6e71722aff ensures that it does not overflow. See also: https://github.com/nginx/nginx/commit/6adfc05ece48f92446383ec1f145446848694698 diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -473,8 +473,8 @@ struct ngx_http_request_s { ngx_http_cleanup_t *cleanup; unsigned count:16; + unsigned blocked:16; unsigned subrequests:8; - unsigned blocked:8; unsigned aio:1; From mdounin at mdounin.ru Tue Oct 27 05:41:56 2026 From: mdounin at mdounin.ru (=?utf-8?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 08:41:56 +0300 Subject: [PATCH 3 of 3] HTTP/3: kept the skipped frame length separate from data length In-Reply-To: References: Message-ID: <75d4162de2b359af3163.1793079716@vm-bsd.mdounin.ru> # HG changeset patch # User Vadim Zhestikov # Date 1793074233 -10800 # Tue Oct 27 07:10:33 2026 +0300 # Node ID 75d4162de2b359af3163b932599f40d2ebb80cf3 # Parent 19f937a6a6bf0c24dacfce1068d4153656b9f995 HTTP/3: kept the skipped frame length separate from data length. ngx_http_v3_parse_data() stored the remaining length of a skipped (unknown) frame in st->length -- the same field the request body filter uses for the number of DATA payload bytes to pass on as request body. When an unknown frame was split across parser invocations, the skip was interrupted with st->length holding the skip remainder; on the next buffer the body filter, which calls the parser only while st->length == 0, treated that remainder as request body. When proxying, this could result in sending unframed bytes, potentially allowing for bypass of client_max_body_size, which is enforced only on the DATA path, or an injection. The fix is to keep unknown frame payload in a separate st->skip counter. Reported by Hansol Lee of GOTROOT. Obtained from: https://github.com/nginx/nginx/commit/1c173a2d8767730e678c27446138d7ae5dd6fd64 diff --git a/src/http/v3/ngx_http_v3_parse.c b/src/http/v3/ngx_http_v3_parse.c --- a/src/http/v3/ngx_http_v3_parse.c +++ b/src/http/v3/ngx_http_v3_parse.c @@ -1831,6 +1831,8 @@ ngx_http_v3_parse_data(ngx_connection_t st->type, st->length); if (st->type != NGX_HTTP_V3_FRAME_DATA && st->length > 0) { + st->skip = st->length; + st->length = 0; st->state = sw_skip; break; } @@ -1840,7 +1842,7 @@ ngx_http_v3_parse_data(ngx_connection_t case sw_skip: - rc = ngx_http_v3_parse_skip(b, &st->length); + rc = ngx_http_v3_parse_skip(b, &st->skip); if (rc != NGX_DONE) { return rc; } diff --git a/src/http/v3/ngx_http_v3_parse.h b/src/http/v3/ngx_http_v3_parse.h --- a/src/http/v3/ngx_http_v3_parse.h +++ b/src/http/v3/ngx_http_v3_parse.h @@ -121,6 +121,7 @@ typedef struct { ngx_uint_t state; ngx_uint_t type; ngx_uint_t length; + ngx_uint_t skip; ngx_http_v3_parse_varlen_int_t vlint; } ngx_http_v3_parse_data_t; From mdounin at mdounin.ru Tue Oct 27 16:15:51 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:51 +0300 Subject: [nginx] Version bump. Message-ID: details: http://freenginx.org/hg/nginx/rev/fd63bc28cb53 branches: changeset: 9592:fd63bc28cb53 user: Maxim Dounin date: Tue Oct 27 07:47:28 2026 +0300 description: Version bump. diffstat: src/core/nginx.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (14 lines): diff --git a/src/core/nginx.h b/src/core/nginx.h --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -9,8 +9,8 @@ #define _NGINX_H_INCLUDED_ -#define nginx_version 1031004 -#define NGINX_VERSION "1.31.4" +#define nginx_version 1031005 +#define NGINX_VERSION "1.31.5" #define freenginx 1 From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] Updated OpenSSL and PCRE used for win32 builds. Message-ID: details: http://freenginx.org/hg/nginx/rev/e4d0a072a17b branches: changeset: 9593:e4d0a072a17b user: Maxim Dounin date: Tue Oct 27 07:47:31 2026 +0300 description: Updated OpenSSL and PCRE used for win32 builds. diffstat: misc/GNUmakefile | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (15 lines): diff --git a/misc/GNUmakefile b/misc/GNUmakefile --- a/misc/GNUmakefile +++ b/misc/GNUmakefile @@ -6,9 +6,9 @@ TEMP = tmp CC = cl OBJS = objs.msvc8 -OPENSSL = openssl-3.5.8 +OPENSSL = openssl-3.5.9 ZLIB = zlib-1.3.2 -PCRE = pcre2-10.48 +PCRE = pcre2-10.49 release: export From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] SSL: fixed syncing of keys with automatic ticket key rot... Message-ID: details: http://freenginx.org/hg/nginx/rev/d08712494b7a branches: changeset: 9594:d08712494b7a user: Maxim Dounin date: Tue Oct 27 07:47:39 2026 +0300 description: SSL: fixed syncing of keys with automatic ticket key rotation. Optimized rotation of session ticket keys as introduced in 8085:043006e5a0b1 (1.23.2) changed the number of keys used from 2 to 3, but the number of keys synced from shared memory to worker processes was not updated. As a result, an uninitialized key was used within worker processes, making it possible to forge a session (CVE-2026-97629). The fix is to sync the correct number of keys. See also: https://github.com/nginx/nginx/commit/1916f26e6ca49296568633d309777e36527e5bb2 diffstat: src/event/ngx_event_openssl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -5456,7 +5456,7 @@ ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ /* sync keys to the worker process memory */ ngx_memcpy(keys->elts, cache->ticket_keys, - 2 * sizeof(ngx_ssl_ticket_key_t)); + 3 * sizeof(ngx_ssl_ticket_key_t)); ngx_shmtx_unlock(&shpool->mutex); From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] Fixed r->main->blocked overflow with many subrequests. Message-ID: details: http://freenginx.org/hg/nginx/rev/19f937a6a6bf branches: changeset: 9595:19f937a6a6bf user: Maxim Dounin date: Tue Oct 27 07:54:59 2026 +0300 description: Fixed r->main->blocked overflow with many subrequests. Similarly to r->main->count overflow by subrequests as addressed by 6238:8c6e71722aff (which became possible after subrequest limiting changes in 6237:06e850859a26), r->main->blocked might overflow if there are multiple AIO operations. This could result in a request being freed prematurely, followed by accesses to already freed memory when an AIO operation completes (known as CVE-2026-97205, though security impact is questionable). The fix is to use 16 bits for the r->main->blocked counter, so the subrequest limit introduced in 6238:8c6e71722aff ensures that it does not overflow. See also: https://github.com/nginx/nginx/commit/6adfc05ece48f92446383ec1f145446848694698 diffstat: src/http/ngx_http_request.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (13 lines): diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h --- a/src/http/ngx_http_request.h +++ b/src/http/ngx_http_request.h @@ -473,8 +473,8 @@ struct ngx_http_request_s { ngx_http_cleanup_t *cleanup; unsigned count:16; + unsigned blocked:16; unsigned subrequests:8; - unsigned blocked:8; unsigned aio:1; From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] HTTP/3: kept the skipped frame length separate from data... Message-ID: details: http://freenginx.org/hg/nginx/rev/75d4162de2b3 branches: changeset: 9596:75d4162de2b3 user: Vadim Zhestikov date: Tue Oct 27 07:10:33 2026 +0300 description: HTTP/3: kept the skipped frame length separate from data length. ngx_http_v3_parse_data() stored the remaining length of a skipped (unknown) frame in st->length -- the same field the request body filter uses for the number of DATA payload bytes to pass on as request body. When an unknown frame was split across parser invocations, the skip was interrupted with st->length holding the skip remainder; on the next buffer the body filter, which calls the parser only while st->length == 0, treated that remainder as request body. When proxying, this could result in sending unframed bytes, potentially allowing for bypass of client_max_body_size, which is enforced only on the DATA path, or an injection. The fix is to keep unknown frame payload in a separate st->skip counter. Reported by Hansol Lee of GOTROOT. Obtained from: https://github.com/nginx/nginx/commit/1c173a2d8767730e678c27446138d7ae5dd6fd64 diffstat: src/http/v3/ngx_http_v3_parse.c | 4 +++- src/http/v3/ngx_http_v3_parse.h | 1 + 2 files changed, 4 insertions(+), 1 deletions(-) diffs (32 lines): diff --git a/src/http/v3/ngx_http_v3_parse.c b/src/http/v3/ngx_http_v3_parse.c --- a/src/http/v3/ngx_http_v3_parse.c +++ b/src/http/v3/ngx_http_v3_parse.c @@ -1831,6 +1831,8 @@ ngx_http_v3_parse_data(ngx_connection_t st->type, st->length); if (st->type != NGX_HTTP_V3_FRAME_DATA && st->length > 0) { + st->skip = st->length; + st->length = 0; st->state = sw_skip; break; } @@ -1840,7 +1842,7 @@ ngx_http_v3_parse_data(ngx_connection_t case sw_skip: - rc = ngx_http_v3_parse_skip(b, &st->length); + rc = ngx_http_v3_parse_skip(b, &st->skip); if (rc != NGX_DONE) { return rc; } diff --git a/src/http/v3/ngx_http_v3_parse.h b/src/http/v3/ngx_http_v3_parse.h --- a/src/http/v3/ngx_http_v3_parse.h +++ b/src/http/v3/ngx_http_v3_parse.h @@ -121,6 +121,7 @@ typedef struct { ngx_uint_t state; ngx_uint_t type; ngx_uint_t length; + ngx_uint_t skip; ngx_http_v3_parse_varlen_int_t vlint; } ngx_http_v3_parse_data_t; From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] freenginx-1.31.5-RELEASE Message-ID: details: http://freenginx.org/hg/nginx/rev/3c2243e86475 branches: changeset: 9597:3c2243e86475 user: Maxim Dounin date: Tue Oct 27 17:54:54 2026 +0300 description: freenginx-1.31.5-RELEASE diffstat: docs/xml/nginx/changes.xml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diffs (50 lines): diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml --- a/docs/xml/nginx/changes.xml +++ b/docs/xml/nginx/changes.xml @@ -7,6 +7,46 @@
+ + + + +??? ?????????????? ????????? ?????? ?????????? TLS session tickets +???? ?? ?????? ????????? ????????????????????, +??? ????????? ????????? ?????? +? ?????? ???????? ?????????? ???????????? (CVE-2026-97629). + + +one of the keys was left uninitialized +when using automatic rotation of TLS session ticket keys, +making it possible to forge a session +and bypass client certificate verification (CVE-2026-97629); + + + + + +??? ????????????? AIO ? ??????????? +? ??????? ???????? ??? ????????? segmentation fault. + + +a segmentation fault might occur in a worker process +if AIO was used in subrequests. + + + + + +? HTTP/3. + + +in HTTP/3. + + + + + + From mdounin at mdounin.ru Tue Oct 27 16:15:52 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:15:52 +0300 Subject: [nginx] release-1.31.5 tag Message-ID: details: http://freenginx.org/hg/nginx/rev/1afd63fe64f0 branches: changeset: 9598:1afd63fe64f0 user: Maxim Dounin date: Tue Oct 27 17:54:55 2026 +0300 description: release-1.31.5 tag diffstat: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (8 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -498,3 +498,4 @@ b1585cfeee5759a1ae3794b5c9c4c541c3c73a35 e3c5f3106d3837629514c0f5cb9aac189c07e432 release-1.31.2 47e34b225e5f13ceacadba8a37e27ce9a299b2fb release-1.31.3 eb9af667479439edb90b77efcb90e9e41bbec75f release-1.31.4 +3c2243e864752f550d8cf81cc346505ca46b10c3 release-1.31.5 From mdounin at mdounin.ru Tue Oct 27 16:16:31 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:16:31 +0300 Subject: [nginx] Version bump. Message-ID: details: http://freenginx.org/hg/nginx/rev/11a7b974ea7f branches: stable-1.30 changeset: 9599:11a7b974ea7f user: Maxim Dounin date: Tue Oct 27 17:56:35 2026 +0300 description: Version bump. diffstat: src/core/nginx.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (14 lines): diff --git a/src/core/nginx.h b/src/core/nginx.h --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -9,8 +9,8 @@ #define _NGINX_H_INCLUDED_ -#define nginx_version 1030001 -#define NGINX_VERSION "1.30.1" +#define nginx_version 1030002 +#define NGINX_VERSION "1.30.2" #define freenginx 1 From mdounin at mdounin.ru Tue Oct 27 16:16:31 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:16:31 +0300 Subject: [nginx] Updated OpenSSL and PCRE used for win32 builds. Message-ID: details: http://freenginx.org/hg/nginx/rev/7f9214ba6c7c branches: stable-1.30 changeset: 9600:7f9214ba6c7c user: Maxim Dounin date: Tue Oct 27 18:00:17 2026 +0300 description: Updated OpenSSL and PCRE used for win32 builds. diffstat: misc/GNUmakefile | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diffs (15 lines): diff --git a/misc/GNUmakefile b/misc/GNUmakefile --- a/misc/GNUmakefile +++ b/misc/GNUmakefile @@ -6,9 +6,9 @@ TEMP = tmp CC = cl OBJS = objs.msvc8 -OPENSSL = openssl-3.5.6 +OPENSSL = openssl-3.5.9 ZLIB = zlib-1.3.2 -PCRE = pcre2-10.47 +PCRE = pcre2-10.49 release: export From mdounin at mdounin.ru Tue Oct 27 16:16:31 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:16:31 +0300 Subject: [nginx] SSL: fixed syncing of keys with automatic ticket key rot... Message-ID: details: http://freenginx.org/hg/nginx/rev/6d93cde1cd19 branches: stable-1.30 changeset: 9601:6d93cde1cd19 user: Maxim Dounin date: Tue Oct 27 07:47:39 2026 +0300 description: SSL: fixed syncing of keys with automatic ticket key rotation. Optimized rotation of session ticket keys as introduced in 8085:043006e5a0b1 (1.23.2) changed the number of keys used from 2 to 3, but the number of keys synced from shared memory to worker processes was not updated. As a result, an uninitialized key was used within worker processes, making it possible to forge a session (CVE-2026-97629). The fix is to sync the correct number of keys. See also: https://github.com/nginx/nginx/commit/1916f26e6ca49296568633d309777e36527e5bb2 diffstat: src/event/ngx_event_openssl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diffs (12 lines): diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -5456,7 +5456,7 @@ ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ /* sync keys to the worker process memory */ ngx_memcpy(keys->elts, cache->ticket_keys, - 2 * sizeof(ngx_ssl_ticket_key_t)); + 3 * sizeof(ngx_ssl_ticket_key_t)); ngx_shmtx_unlock(&shpool->mutex); From mdounin at mdounin.ru Tue Oct 27 16:16:31 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:16:31 +0300 Subject: [nginx] freenginx-1.30.2-RELEASE Message-ID: details: http://freenginx.org/hg/nginx/rev/dc19dd157ae1 branches: stable-1.30 changeset: 9602:dc19dd157ae1 user: Maxim Dounin date: Tue Oct 27 18:05:08 2026 +0300 description: freenginx-1.30.2-RELEASE diffstat: docs/xml/nginx/changes.xml | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diffs (30 lines): diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml --- a/docs/xml/nginx/changes.xml +++ b/docs/xml/nginx/changes.xml @@ -7,6 +7,26 @@
+ + + + +??? ?????????????? ????????? ?????? ?????????? TLS session tickets +???? ?? ?????? ????????? ????????????????????, +??? ????????? ????????? ?????? +? ?????? ???????? ?????????? ???????????? (CVE-2026-97629). + + +one of the keys was left uninitialized +when using automatic rotation of TLS session ticket keys, +making it possible to forge a session +and bypass client certificate verification (CVE-2026-97629); + + + + + + From mdounin at mdounin.ru Tue Oct 27 16:16:31 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:16:31 +0300 Subject: [nginx] release-1.30.2 tag Message-ID: details: http://freenginx.org/hg/nginx/rev/0633ec329d5d branches: stable-1.30 changeset: 9603:0633ec329d5d user: Maxim Dounin date: Tue Oct 27 18:05:09 2026 +0300 description: release-1.30.2 tag diffstat: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (8 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -495,3 +495,4 @@ e4207f631186855d37ac286799c8cd4c9477d166 cac0fa5721386abbec57dcc2bb317f2531456e19 release-1.29.7 f126ef64a014db167927741688c74ffdf1b0fc26 release-1.30.0 3945b69e1c4218e98a85a7a0e152e77c9d4fc83b release-1.30.1 +dc19dd157ae15beb5df6a3acd250b19528b2eb84 release-1.30.2 From mdounin at mdounin.ru Tue Oct 27 16:17:01 2026 From: mdounin at mdounin.ru (=?iso-8859-1?q?Maxim_Dounin?=) Date: Tue, 27 Oct 2026 19:17:01 +0300 Subject: [nginx-site] freenginx-1.31.5, freenginx-1.30.2 Message-ID: details: http://freenginx.org/hg/nginx-site/rev/fe927fcf9ba5 branches: changeset: 3139:fe927fcf9ba5 user: Maxim Dounin date: Tue Oct 27 19:12:42 2026 +0300 description: freenginx-1.31.5, freenginx-1.30.2 diffstat: text/en/CHANGES | 12 ++++++++++++ text/en/CHANGES-1.30 | 7 +++++++ text/ru/CHANGES.ru | 13 +++++++++++++ text/ru/CHANGES.ru-1.30 | 8 ++++++++ xml/en/security_advisories.xml | 7 +++++++ xml/index.xml | 13 +++++++++++++ xml/versions.xml | 2 ++ 7 files changed, 62 insertions(+), 0 deletions(-) diffs (131 lines): diff --git a/text/en/CHANGES b/text/en/CHANGES --- a/text/en/CHANGES +++ b/text/en/CHANGES @@ -1,4 +1,16 @@ +Changes with freenginx 1.31.5 27 Oct 2026 + + *) Security: one of the keys was left uninitialized when using automatic + rotation of TLS session ticket keys, making it possible to forge a + session and bypass client certificate verification (CVE-2026-97629); + + *) Bugfix: a segmentation fault might occur in a worker process if AIO + was used in subrequests. + + *) Bugfix: in HTTP/3. + + Changes with freenginx 1.31.4 01 Sep 2026 *) Bugfix: the "index" directive used old values of non-cacheable diff --git a/text/en/CHANGES-1.30 b/text/en/CHANGES-1.30 --- a/text/en/CHANGES-1.30 +++ b/text/en/CHANGES-1.30 @@ -1,4 +1,11 @@ +Changes with freenginx 1.30.2 27 Oct 2026 + + *) Security: one of the keys was left uninitialized when using automatic + rotation of TLS session ticket keys, making it possible to forge a + session and bypass client certificate verification (CVE-2026-97629); + + Changes with freenginx 1.30.1 02 Jun 2026 *) Change: the logging level of the "invalid ccs message", "not on diff --git a/text/ru/CHANGES.ru b/text/ru/CHANGES.ru --- a/text/ru/CHANGES.ru +++ b/text/ru/CHANGES.ru @@ -1,4 +1,17 @@ +????????? ? freenginx 1.31.5 27.10.2026 + + *) ????????????: ??? ?????????????? ????????? ?????? ?????????? TLS + session tickets ???? ?? ?????? ????????? ????????????????????, ??? + ????????? ????????? ?????? ? ?????? ???????? ?????????? ???????????? + (CVE-2026-97629). + + *) ???????????: ??? ????????????? AIO ? ??????????? ? ??????? ???????? + ??? ????????? segmentation fault. + + *) ???????????: ? HTTP/3. + + ????????? ? freenginx 1.31.4 01.09.2026 *) ???????????: ????????? index ???????????? ?????? ???????? diff --git a/text/ru/CHANGES.ru-1.30 b/text/ru/CHANGES.ru-1.30 --- a/text/ru/CHANGES.ru-1.30 +++ b/text/ru/CHANGES.ru-1.30 @@ -1,4 +1,12 @@ +????????? ? freenginx 1.30.2 27.10.2026 + + *) ????????????: ??? ?????????????? ????????? ?????? ?????????? TLS + session tickets ???? ?? ?????? ????????? ????????????????????, ??? + ????????? ????????? ?????? ? ?????? ???????? ?????????? ???????????? + (CVE-2026-97629). + + ????????? ? freenginx 1.30.1 02.06.2026 *) ?????????: ??????? ???????????? ?????? SSL "invalid ccs message", diff --git a/xml/en/security_advisories.xml b/xml/en/security_advisories.xml --- a/xml/en/security_advisories.xml +++ b/xml/en/security_advisories.xml @@ -25,6 +25,13 @@ Patches are signed using one of the + + + + + +freenginx-1.30.2 +stable and +freenginx-1.31.5 +mainline versions has been released, +addressing the +session forgery +vulnerability +when using automatic rotation of TLS session ticket keys (CVE-2026-97629). + + + freenginx-1.31.4 diff --git a/xml/versions.xml b/xml/versions.xml --- a/xml/versions.xml +++ b/xml/versions.xml @@ -9,6 +9,7 @@ + @@ -20,6 +21,7 @@ +