details: https://hg.nginx.org/nginx/rev/b71e69247483 branches: changeset: 8164:b71e69247483 user: Sergey Kandaurov <pluk...@nginx.com> date: Mon May 01 19:16:05 2023 +0400 description: Variables: avoid possible buffer overrun with some "$sent_http_*".
The existing logic to evaluate multi header "$sent_http_*" variables, such as $sent_http_cache_control, as previously introduced in 1.23.0, doesn't take into account that one or more elements can be cleared, yet still present in a linked list, pointed to by the next field. Such elements don't contribute to the resulting variable length, an attempt to append a separator for them ends up in out of bounds write. This is not possible with standard modules, though at least one third party module is known to override multi header values this way, so it makes sense to harden the logic. The fix restores a generic boundary check. diffstat: src/http/ngx_http_variables.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diffs (30 lines): diff -r 77d5c662f3d9 -r b71e69247483 src/http/ngx_http_variables.c --- a/src/http/ngx_http_variables.c Tue Apr 18 06:28:46 2023 +0300 +++ b/src/http/ngx_http_variables.c Mon May 01 19:16:05 2023 +0400 @@ -828,7 +828,7 @@ ngx_http_variable_headers_internal(ngx_h ngx_http_variable_value_t *v, uintptr_t data, u_char sep) { size_t len; - u_char *p; + u_char *p, *end; ngx_table_elt_t *h, *th; h = *(ngx_table_elt_t **) ((char *) r + data); @@ -870,6 +870,8 @@ ngx_http_variable_headers_internal(ngx_h v->len = len; v->data = p; + end = p + len; + for (th = h; th; th = th->next) { if (th->hash == 0) { @@ -878,7 +880,7 @@ ngx_http_variable_headers_internal(ngx_h p = ngx_copy(p, th->value.data, th->value.len); - if (th->next == NULL) { + if (p == end) { break; } _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel