Compare commits
6 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b93db3264 | ||
|
|
0a0410dba7 | ||
|
|
117fc2156f | ||
|
|
fce697b5bc | ||
|
|
ccedd1185b | ||
|
|
e3f6ed2d65 |
7 changed files with 249 additions and 0 deletions
18
debian/changelog
vendored
18
debian/changelog
vendored
|
|
@ -1,3 +1,19 @@
|
|||
nginx (1.14.2-2+deb10u2) buster-security; urgency=high
|
||||
|
||||
* Handle CVE-2019-20372, error page request smuggling
|
||||
(Closes: #948579)
|
||||
|
||||
-- Christos Trochalakis <ctrochalakis@debian.org> Sat, 11 Jan 2020 09:28:05 +0200
|
||||
|
||||
nginx (1.14.2-2+deb10u1) buster-security; urgency=high
|
||||
|
||||
* Backport upstream fixes for 3 CVEs (Closes: #935037)
|
||||
Those fixes affect Nginx HTTP/2 implementation, which might cause
|
||||
excessive memory consumption and CPU usage.
|
||||
(CVE-2019-9511, CVE-2019-9513, CVE-2019-9516).
|
||||
|
||||
-- Christos Trochalakis <ctrochalakis@debian.org> Tue, 13 Aug 2019 21:10:28 +0300
|
||||
|
||||
nginx (1.14.2-2) unstable; urgency=medium
|
||||
|
||||
[ Kartik Mistry ]
|
||||
|
|
@ -7,6 +23,8 @@ nginx (1.14.2-2) unstable; urgency=medium
|
|||
|
||||
[ Christos Trochalakis ]
|
||||
* http-dav-ext: Upgrade to 3.0.0 (Closes: #851651)
|
||||
* Use a minimal export of the upstream signing key
|
||||
* Bump Standards-Version, no changes needed
|
||||
|
||||
-- Christos Trochalakis <ctrochalakis@debian.org> Thu, 27 Dec 2018 12:49:34 +0200
|
||||
|
||||
|
|
|
|||
2
debian/gbp.conf
vendored
2
debian/gbp.conf
vendored
|
|
@ -2,3 +2,5 @@
|
|||
pristine-tar = True
|
||||
upstream-branch = upstream
|
||||
upstream-tag = upstream/%(version)s
|
||||
dist=buster
|
||||
debian-branch=buster
|
||||
|
|
|
|||
31
debian/patches/CVE-2019-20372.patch
vendored
Normal file
31
debian/patches/CVE-2019-20372.patch
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
From 8bffc01d084b4881e3eed2052c115b8f04268cb9 Mon Sep 17 00:00:00 2001
|
||||
From: Ruslan Ermilov <ru@nginx.com>
|
||||
Date: Mon, 23 Dec 2019 15:45:46 +0300
|
||||
Subject: [PATCH] Discard request body when redirecting to a URL via
|
||||
error_page.
|
||||
|
||||
Reported by Bert JW Regeer and Francisco Oca Gonzalez.
|
||||
---
|
||||
src/http/ngx_http_special_response.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c
|
||||
index 2c1ff174..e2a5e9dc 100644
|
||||
--- a/src/http/ngx_http_special_response.c
|
||||
+++ b/src/http/ngx_http_special_response.c
|
||||
@@ -623,6 +623,12 @@ ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
|
||||
return ngx_http_named_location(r, &uri);
|
||||
}
|
||||
|
||||
+ r->expect_tested = 1;
|
||||
+
|
||||
+ if (ngx_http_discard_request_body(r) != NGX_OK) {
|
||||
+ r->keepalive = 0;
|
||||
+ }
|
||||
+
|
||||
location = ngx_list_push(&r->headers_out.headers);
|
||||
|
||||
if (location == NULL) {
|
||||
--
|
||||
2.23.0
|
||||
|
||||
87
debian/patches/CVE-2019-9511.patch
vendored
Normal file
87
debian/patches/CVE-2019-9511.patch
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
From 3f64486e0c15414dc6368139453dcaca338ddf3e Mon Sep 17 00:00:00 2001
|
||||
From: Ruslan Ermilov <ru@nginx.com>
|
||||
Date: Tue, 13 Aug 2019 15:43:36 +0300
|
||||
Subject: [PATCH 2/3] HTTP/2: limited number of DATA frames.
|
||||
|
||||
Fixed excessive memory growth and CPU usage if stream windows are
|
||||
manipulated in a way that results in generating many small DATA frames.
|
||||
Fix is to limit the number of simultaneously allocated DATA frames.
|
||||
---
|
||||
src/http/v2/ngx_http_v2.c | 2 ++
|
||||
src/http/v2/ngx_http_v2.h | 2 ++
|
||||
src/http/v2/ngx_http_v2_filter_module.c | 22 +++++++++++++++++-----
|
||||
3 files changed, 21 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
|
||||
index be2ef82b..1b01f271 100644
|
||||
--- a/src/http/v2/ngx_http_v2.c
|
||||
+++ b/src/http/v2/ngx_http_v2.c
|
||||
@@ -4339,6 +4339,8 @@ ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)
|
||||
*/
|
||||
pool = stream->pool;
|
||||
|
||||
+ h2c->frames -= stream->frames;
|
||||
+
|
||||
ngx_http_free_request(stream->request, rc);
|
||||
|
||||
if (pool != h2c->state.pool) {
|
||||
diff --git a/src/http/v2/ngx_http_v2.h b/src/http/v2/ngx_http_v2.h
|
||||
index bec22160..715b7d30 100644
|
||||
--- a/src/http/v2/ngx_http_v2.h
|
||||
+++ b/src/http/v2/ngx_http_v2.h
|
||||
@@ -192,6 +192,8 @@ struct ngx_http_v2_stream_s {
|
||||
|
||||
ngx_buf_t *preread;
|
||||
|
||||
+ ngx_uint_t frames;
|
||||
+
|
||||
ngx_http_v2_out_frame_t *free_frames;
|
||||
ngx_chain_t *free_frame_headers;
|
||||
ngx_chain_t *free_bufs;
|
||||
diff --git a/src/http/v2/ngx_http_v2_filter_module.c b/src/http/v2/ngx_http_v2_filter_module.c
|
||||
index 029e8ece..c7ee5536 100644
|
||||
--- a/src/http/v2/ngx_http_v2_filter_module.c
|
||||
+++ b/src/http/v2/ngx_http_v2_filter_module.c
|
||||
@@ -1661,22 +1661,34 @@ static ngx_http_v2_out_frame_t *
|
||||
ngx_http_v2_filter_get_data_frame(ngx_http_v2_stream_t *stream,
|
||||
size_t len, ngx_chain_t *first, ngx_chain_t *last)
|
||||
{
|
||||
- u_char flags;
|
||||
- ngx_buf_t *buf;
|
||||
- ngx_chain_t *cl;
|
||||
- ngx_http_v2_out_frame_t *frame;
|
||||
+ u_char flags;
|
||||
+ ngx_buf_t *buf;
|
||||
+ ngx_chain_t *cl;
|
||||
+ ngx_http_v2_out_frame_t *frame;
|
||||
+ ngx_http_v2_connection_t *h2c;
|
||||
|
||||
frame = stream->free_frames;
|
||||
+ h2c = stream->connection;
|
||||
|
||||
if (frame) {
|
||||
stream->free_frames = frame->next;
|
||||
|
||||
- } else {
|
||||
+ } else if (h2c->frames < 10000) {
|
||||
frame = ngx_palloc(stream->request->pool,
|
||||
sizeof(ngx_http_v2_out_frame_t));
|
||||
if (frame == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
+
|
||||
+ stream->frames++;
|
||||
+ h2c->frames++;
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||
+ "http2 flood detected");
|
||||
+
|
||||
+ h2c->connection->error = 1;
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
flags = last->buf->last_buf ? NGX_HTTP_V2_END_STREAM_FLAG : 0;
|
||||
--
|
||||
2.20.1
|
||||
|
||||
62
debian/patches/CVE-2019-9513.patch
vendored
Normal file
62
debian/patches/CVE-2019-9513.patch
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
From bbdc81631b6d322785d8e92788fd400e25a931e6 Mon Sep 17 00:00:00 2001
|
||||
From: Ruslan Ermilov <ru@nginx.com>
|
||||
Date: Tue, 13 Aug 2019 15:43:40 +0300
|
||||
Subject: [PATCH 3/3] HTTP/2: limited number of PRIORITY frames.
|
||||
|
||||
Fixed excessive CPU usage caused by a peer that continuously shuffles
|
||||
priority of streams. Fix is to limit the number of PRIORITY frames.
|
||||
---
|
||||
src/http/v2/ngx_http_v2.c | 10 ++++++++++
|
||||
src/http/v2/ngx_http_v2.h | 1 +
|
||||
2 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
|
||||
index 1b01f271..fd6ecb05 100644
|
||||
--- a/src/http/v2/ngx_http_v2.c
|
||||
+++ b/src/http/v2/ngx_http_v2.c
|
||||
@@ -275,6 +275,7 @@ ngx_http_v2_init(ngx_event_t *rev)
|
||||
h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module);
|
||||
|
||||
h2c->concurrent_pushes = h2scf->concurrent_pushes;
|
||||
+ h2c->priority_limit = h2scf->concurrent_streams;
|
||||
|
||||
h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log);
|
||||
if (h2c->pool == NULL) {
|
||||
@@ -1806,6 +1807,13 @@ ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, u_char *pos,
|
||||
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
|
||||
}
|
||||
|
||||
+ if (--h2c->priority_limit == 0) {
|
||||
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||
+ "client sent too many PRIORITY frames");
|
||||
+
|
||||
+ return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM);
|
||||
+ }
|
||||
+
|
||||
if (end - pos < NGX_HTTP_V2_PRIORITY_SIZE) {
|
||||
return ngx_http_v2_state_save(h2c, pos, end,
|
||||
ngx_http_v2_state_priority);
|
||||
@@ -3120,6 +3128,8 @@ ngx_http_v2_create_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t push)
|
||||
h2c->processing++;
|
||||
}
|
||||
|
||||
+ h2c->priority_limit += h2scf->concurrent_streams;
|
||||
+
|
||||
return stream;
|
||||
}
|
||||
|
||||
diff --git a/src/http/v2/ngx_http_v2.h b/src/http/v2/ngx_http_v2.h
|
||||
index 715b7d30..69d55d1c 100644
|
||||
--- a/src/http/v2/ngx_http_v2.h
|
||||
+++ b/src/http/v2/ngx_http_v2.h
|
||||
@@ -122,6 +122,7 @@ struct ngx_http_v2_connection_s {
|
||||
ngx_uint_t processing;
|
||||
ngx_uint_t frames;
|
||||
ngx_uint_t idle;
|
||||
+ ngx_uint_t priority_limit;
|
||||
|
||||
ngx_uint_t pushing;
|
||||
ngx_uint_t concurrent_pushes;
|
||||
--
|
||||
2.20.1
|
||||
|
||||
45
debian/patches/CVE-2019-9516.patch
vendored
Normal file
45
debian/patches/CVE-2019-9516.patch
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
From 840d8a3e2f126384eb4ee3e5dd7ffe875a5634c5 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Kandaurov <pluknet@nginx.com>
|
||||
Date: Tue, 13 Aug 2019 15:43:32 +0300
|
||||
Subject: [PATCH 1/3] HTTP/2: reject zero length headers with PROTOCOL_ERROR.
|
||||
|
||||
Fixed uncontrolled memory growth if peer sends a stream of
|
||||
headers with a 0-length header name and 0-length header value.
|
||||
Fix is to reject headers with zero name length.
|
||||
---
|
||||
src/http/v2/ngx_http_v2.c | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
|
||||
index 12214e15..be2ef82b 100644
|
||||
--- a/src/http/v2/ngx_http_v2.c
|
||||
+++ b/src/http/v2/ngx_http_v2.c
|
||||
@@ -1548,6 +1548,14 @@ ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos,
|
||||
header->name.len = h2c->state.field_end - h2c->state.field_start;
|
||||
header->name.data = h2c->state.field_start;
|
||||
|
||||
+ if (header->name.len == 0) {
|
||||
+ ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
|
||||
+ "client sent zero header name length");
|
||||
+
|
||||
+ return ngx_http_v2_connection_error(h2c,
|
||||
+ NGX_HTTP_V2_PROTOCOL_ERROR);
|
||||
+ }
|
||||
+
|
||||
return ngx_http_v2_state_field_len(h2c, pos, end);
|
||||
}
|
||||
|
||||
@@ -3249,10 +3257,6 @@ ngx_http_v2_validate_header(ngx_http_request_t *r, ngx_http_v2_header_t *header)
|
||||
ngx_uint_t i;
|
||||
ngx_http_core_srv_conf_t *cscf;
|
||||
|
||||
- if (header->name.len == 0) {
|
||||
- return NGX_ERROR;
|
||||
- }
|
||||
-
|
||||
r->invalid_header = 0;
|
||||
|
||||
cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
|
||||
--
|
||||
2.20.1
|
||||
|
||||
4
debian/patches/series
vendored
4
debian/patches/series
vendored
|
|
@ -1,2 +1,6 @@
|
|||
0002-Make-sure-signature-stays-the-same-in-all-nginx-buil.patch
|
||||
0003-define_gnu_source-on-other-glibc-based-platforms.patch
|
||||
CVE-2019-9516.patch
|
||||
CVE-2019-9511.patch
|
||||
CVE-2019-9513.patch
|
||||
CVE-2019-20372.patch
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue