nginx security advisory (CVE-2017-7529)

Maxim Dounin mdounin at mdounin.ru
Wed Aug 9 15:12:50 UTC 2017


Hello!

On Thu, Jul 20, 2017 at 10:32:15PM -0700, Shuxin Yang wrote:

>     I try to exploit this bug in an attempt to do something nasty :-). 
> However, the more I dig into it, the more I get confused.

No comments on this, sorry.  We generally avoid providing 
exploitation details to minimize impact on not-yet-updated 
systems.

[...]

>     d) the patch guarantees the total size of ranges is smaller than 4G 
> (again, assume 32bit system). But what if it ends up very close to 4G, 
> making the "len" variable in function variable 
> ngx_http_range_multipart_header() overflow. The "len" is to calculate 
> the content-length the resulting response, it is the total size of 
> multi-part overhead plus ranges.

This looks like a separate bug, which can result in incorrect 
Content-Length being returned if a file larger than 4G is 
requested using multiple ranges on a 32-bit system.  Thanks for 
reporting this.

The following patch should fix this:

# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1502291117 -10800
#      Wed Aug 09 18:05:17 2017 +0300
# Node ID fc89eec543ee3e41b74347ffa0c59554188dc3f5
# Parent  2f48ab272052d9b2ca00f8192c589b872ee3bc86
Range filter: changed type for total length to off_t.

Total length of a response with multiple ranges can be larger than a size_t
variable can hold, so type changed to off_t.  Previously, an incorrect
Content-Length was returned when requesting more than 4G of ranges from
a large enough file on a 32-bit system.

Reported by Shuxin Yang,
http://mailman.nginx.org/pipermail/nginx/2017-July/054384.html.

diff --git a/src/http/modules/ngx_http_range_filter_module.c b/src/http/modules/ngx_http_range_filter_module.c
--- a/src/http/modules/ngx_http_range_filter_module.c
+++ b/src/http/modules/ngx_http_range_filter_module.c
@@ -463,7 +463,7 @@ static ngx_int_t
 ngx_http_range_multipart_header(ngx_http_request_t *r,
     ngx_http_range_filter_ctx_t *ctx)
 {
-    size_t              len;
+    off_t               len;
     ngx_uint_t          i;
     ngx_http_range_t   *range;
     ngx_atomic_uint_t   boundary;
@@ -569,7 +569,7 @@ ngx_http_range_multipart_header(ngx_http
                                      - range[i].content_range.data;
 
         len += ctx->boundary_header.len + range[i].content_range.len
-                                    + (size_t) (range[i].end - range[i].start);
+                                             + (range[i].end - range[i].start);
     }
 
     r->headers_out.content_length_n = len;

-- 
Maxim Dounin
http://nginx.org/


More information about the nginx mailing list