Debrand for AlmaLinux
This commit is contained in:
commit
cee5d8038d
@ -0,0 +1,72 @@
|
||||
From 6c5bb72a4ba7cfdf0be186020728a71b033d8ae3 Mon Sep 17 00:00:00 2001
|
||||
From: Roman Arutyunyan <arut@nginx.com>
|
||||
Date: Thu, 14 May 2026 18:42:18 +0400
|
||||
Subject: [PATCH] Rewrite: fix buffer overflow with overlapping captures
|
||||
|
||||
When the rewrite replacement string had no variables, but had
|
||||
overlapping captures, the length of the allocated buffer could be
|
||||
smaller than the replacement string. This could happen either
|
||||
when the "redirect" parameter is specified, or when arguments are
|
||||
present in the replacement string.
|
||||
|
||||
The following configurations resulted in heap buffer overflow when
|
||||
using URI "/++++++++++++++++++++++++++++++":
|
||||
|
||||
location / {
|
||||
rewrite ^/((.*))$ http://127.0.0.1:8080/$1$2 redirect;
|
||||
return 200 foo;
|
||||
}
|
||||
|
||||
location / {
|
||||
rewrite ^/((.*))$ http://127.0.0.1:8080/?$1$2;
|
||||
return 200 foo;
|
||||
}
|
||||
|
||||
Reported by Mufeed VH of Winfunc Research.
|
||||
---
|
||||
src/http/ngx_http_script.c | 20 +++++++++++++-------
|
||||
1 file changed, 13 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c
|
||||
index 2ea6113..8a28e23 100644
|
||||
--- a/src/http/ngx_http_script.c
|
||||
+++ b/src/http/ngx_http_script.c
|
||||
@@ -1037,6 +1037,8 @@ ngx_http_script_start_args_code(ngx_http_script_engine_t *e)
|
||||
void
|
||||
ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
|
||||
{
|
||||
+ int *cap;
|
||||
+ u_char *p;
|
||||
size_t len;
|
||||
ngx_int_t rc;
|
||||
ngx_uint_t n;
|
||||
@@ -1143,15 +1145,19 @@ ngx_http_script_regex_start_code(ngx_http_script_engine_t *e)
|
||||
if (code->lengths == NULL) {
|
||||
e->buf.len = code->size;
|
||||
|
||||
- if (code->uri) {
|
||||
- if (r->ncaptures && (r->quoted_uri || r->plus_in_uri)) {
|
||||
- e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,
|
||||
- NGX_ESCAPE_ARGS);
|
||||
- }
|
||||
- }
|
||||
+ cap = r->captures;
|
||||
+ p = r->captures_data;
|
||||
|
||||
for (n = 2; n < r->ncaptures; n += 2) {
|
||||
- e->buf.len += r->captures[n + 1] - r->captures[n];
|
||||
+ e->buf.len += cap[n + 1] - cap[n];
|
||||
+
|
||||
+ if (code->uri) {
|
||||
+ if (r->quoted_uri || r->plus_in_uri) {
|
||||
+ e->buf.len += 2 * ngx_escape_uri(NULL, &p[cap[n]],
|
||||
+ cap[n + 1] - cap[n],
|
||||
+ NGX_ESCAPE_ARGS);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
} else {
|
||||
--
|
||||
2.44.0
|
||||
|
||||
126
SOURCES/0020-Added-max_headers-directive.patch
Normal file
126
SOURCES/0020-Added-max_headers-directive.patch
Normal file
@ -0,0 +1,126 @@
|
||||
From ccb278d26ab1df16b42cf092b793918fcb056a2a Mon Sep 17 00:00:00 2001
|
||||
From: Maxim Dounin <mdounin@mdounin.ru>
|
||||
Date: Fri, 24 May 2024 00:20:01 +0300
|
||||
Subject: [PATCH] Added max_headers directive.
|
||||
|
||||
The directive limits the number of request headers accepted from clients.
|
||||
While the total amount of headers is believed to be sufficiently limited
|
||||
by the existing buffer size limits (client_header_buffer_size and
|
||||
large_client_header_buffers), the additional limit on the number of headers
|
||||
might be beneficial to better protect backend servers.
|
||||
|
||||
Requested by Maksim Yevmenkin.
|
||||
|
||||
Signed-off-by: Elijah Zupancic <e.zupancic@f5.com>
|
||||
Origin: <https://freenginx.org/hg/nginx/rev/199dc0d6b05be814b5c811876c20af58cd361fea>
|
||||
---
|
||||
src/http/ngx_http_core_module.c | 10 ++++++++++
|
||||
src/http/ngx_http_core_module.h | 2 ++
|
||||
src/http/ngx_http_request.c | 9 +++++++++
|
||||
src/http/ngx_http_request.h | 1 +
|
||||
src/http/v2/ngx_http_v2.c | 9 +++++++++
|
||||
5 files changed, 31 insertions(+)
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
index 2140e06..b1872bc 100644
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -252,6 +252,13 @@ static ngx_command_t ngx_http_core_commands[] = {
|
||||
offsetof(ngx_http_core_srv_conf_t, large_client_header_buffers),
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("max_headers"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
|
||||
+ ngx_conf_set_num_slot,
|
||||
+ NGX_HTTP_SRV_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_core_srv_conf_t, max_headers),
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("ignore_invalid_headers"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||
ngx_conf_set_flag_slot,
|
||||
@@ -3459,6 +3466,7 @@ ngx_http_core_create_srv_conf(ngx_conf_t *cf)
|
||||
cscf->request_pool_size = NGX_CONF_UNSET_SIZE;
|
||||
cscf->client_header_timeout = NGX_CONF_UNSET_MSEC;
|
||||
cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
+ cscf->max_headers = NGX_CONF_UNSET_UINT;
|
||||
cscf->ignore_invalid_headers = NGX_CONF_UNSET;
|
||||
cscf->merge_slashes = NGX_CONF_UNSET;
|
||||
cscf->underscores_in_headers = NGX_CONF_UNSET;
|
||||
@@ -3500,6 +3508,8 @@ ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
return NGX_CONF_ERROR;
|
||||
}
|
||||
|
||||
+ ngx_conf_merge_uint_value(conf->max_headers, prev->max_headers, 1000);
|
||||
+
|
||||
ngx_conf_merge_value(conf->ignore_invalid_headers,
|
||||
prev->ignore_invalid_headers, 1);
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h
|
||||
index e41bc68..821736f 100644
|
||||
--- a/src/http/ngx_http_core_module.h
|
||||
+++ b/src/http/ngx_http_core_module.h
|
||||
@@ -196,6 +196,8 @@ typedef struct {
|
||||
|
||||
ngx_msec_t client_header_timeout;
|
||||
|
||||
+ ngx_uint_t max_headers;
|
||||
+
|
||||
ngx_flag_t ignore_invalid_headers;
|
||||
ngx_flag_t merge_slashes;
|
||||
ngx_flag_t underscores_in_headers;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
index 5e0340b..720f93e 100644
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1433,6 +1433,15 @@ ngx_http_process_request_headers(ngx_event_t *rev)
|
||||
|
||||
/* a header line has been parsed successfully */
|
||||
|
||||
+ if (r->headers_in.count++ >= cscf->max_headers) {
|
||||
+ r->lingering_close = 1;
|
||||
+ ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||
+ "client sent too many header lines");
|
||||
+ ngx_http_finalize_request(r,
|
||||
+ NGX_HTTP_REQUEST_HEADER_TOO_LARGE);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
h = ngx_list_push(&r->headers_in.headers);
|
||||
if (h == NULL) {
|
||||
ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
||||
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
|
||||
index 8c9eed2..01ac4f9 100644
|
||||
--- a/src/http/ngx_http_request.h
|
||||
+++ b/src/http/ngx_http_request.h
|
||||
@@ -181,6 +181,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
ngx_list_t headers;
|
||||
+ ngx_uint_t count;
|
||||
|
||||
ngx_table_elt_t *host;
|
||||
ngx_table_elt_t *connection;
|
||||
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
|
||||
index 1116e56..05500a4 100644
|
||||
--- a/src/http/v2/ngx_http_v2.c
|
||||
+++ b/src/http/v2/ngx_http_v2.c
|
||||
@@ -1856,6 +1856,15 @@ ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,
|
||||
}
|
||||
|
||||
} else {
|
||||
+ cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
|
||||
+
|
||||
+ if (r->headers_in.count++ >= cscf->max_headers) {
|
||||
+ ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
|
||||
+ "client sent too many header lines");
|
||||
+ ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE);
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
h = ngx_list_push(&r->headers_in.headers);
|
||||
if (h == NULL) {
|
||||
return ngx_http_v2_connection_error(h2c,
|
||||
--
|
||||
2.44.0
|
||||
|
||||
@ -56,7 +56,7 @@
|
||||
Name: nginx
|
||||
Epoch: 1
|
||||
Version: 1.24.0
|
||||
Release: 7%{?dist}.1.alma.1
|
||||
Release: 7%{?dist}.2.alma.1
|
||||
|
||||
Summary: A high performance web server and reverse proxy server
|
||||
# BSD License (two clause)
|
||||
@ -148,6 +148,13 @@ Patch15: 0017-Mp4-avoid-zero-size-buffers-in-output.patch
|
||||
# upstream patch - https://github.com/nginx/nginx/commit/524977e7
|
||||
Patch16: 0018-Rewrite-fixed-escaping-and-possible-buffer-overrun.patch
|
||||
|
||||
# https://redhat.atlassian.net/browse/RHEL-178669
|
||||
# upstream patch - https://github.com/nginx/nginx/commit/ca4f92a27464ae6c2082245e4f67048c633aa032
|
||||
Patch17: 0019-Rewrite-fix-buffer-overflow-with-overlapping-capture.patch
|
||||
|
||||
# https://redhat.atlassian.net/browse/RHEL-182544
|
||||
# upstream patch - https://github.com/nginx/nginx/commit/365694160a85229a7cb006738de9260d49ff5fa2
|
||||
Patch18: 0020-Added-max_headers-directive.patch
|
||||
|
||||
BuildRequires: make
|
||||
BuildRequires: gcc
|
||||
@ -661,9 +668,15 @@ fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Wed May 20 2026 Eduard Abdullin <eabdullin@almalinux.org> - 1:1.24.0-7.1.alma.1
|
||||
* Thu Jun 25 2026 Eduard Abdullin <eabdullin@almalinux.org> - 1:1.24.0-7.2.alma.1
|
||||
- Debrand for AlmaLinux
|
||||
|
||||
* Wed Jun 10 2026 Luboš Uhliarik <luhliari@redhat.com> - 1:1.24.0-7.2
|
||||
- Resolves: RHEL-178681 - nginx:1.24/nginx: code execution and denial
|
||||
of service (CVE-2026-9256)
|
||||
- Resolves: RHEL-182554 - nginx:1.24/nginx: HTTP/2: Remote Denial of
|
||||
Service via compression bomb and Slowloris-style attack
|
||||
|
||||
* Thu May 14 2026 Luboš Uhliarik <luhliari@redhat.com> - 1:1.24.0-7.1
|
||||
- Resolves: RHEL-176234 - nginx:1.24/nginx: NGINX: Arbitrary Code Execution
|
||||
Vulnerability (CVE-2026-42945)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user