Commit graph

8621 commits

Author SHA1 Message Date
Andrew Clayton
da80db978f GH: fix check-whitespace.yaml error return with multiple commits
Some checks failed
buildbot / buildbot (push) Has been cancelled
Commit 126cb16e3 ("GH: fix check-whitespace.yaml error return with
multiple commits") removed the wrong err=0. Put it back and remove the
*right* one!
2026-06-11 06:23:00 +01:00
Nitin Swami
e09c0d32d5 Access log: fix "request_length" format length
The variable handler uses "%O" format specifier.

Reported by Mufeed VH of Winfunc Research.
2026-06-11 09:12:57 +05:30
Sergey Kandaurov
bedf18f95d Secure link: compare hashes in constant time
Some checks are pending
buildbot / buildbot (push) Waiting to run
Reported by kodareef5
2026-06-11 01:40:19 +05:30
Sergey Kandaurov
b23fdb91ee Secure link: style 2026-06-11 01:40:19 +05:30
Andrew Clayton
126cb16e3d GH: fix check-whitespace.yaml error return with multiple commits
We erroneously reset err to 0 for each commit.
2026-06-10 19:23:40 +01:00
Andrew Clayton
fefae70f63 GH: fix summary formatting for check-whitespace.yaml
Wrap the git log --check output in a markdown code block to prevent
undesirable formatting.
2026-06-10 19:23:40 +01:00
Sergey Kandaurov
8bbaf83d48 Updated link to OpenSSL commit 2026-06-10 22:21:10 +04:00
Sergey Kandaurov
455fbf8c45 Style 2026-06-10 22:21:10 +04:00
Sergey Kandaurov
d994f5b822 Split clients: improved calculation of range boundaries
Some checks are pending
buildbot / buildbot (push) Waiting to run
If the last variant was given an explicit percentage to reach 100%, it
did not cover hash values on the range boundary or due to accumulating
rounding error.  Now this corresponds to the configuration with "*".
2026-06-09 19:04:17 +04:00
Andrew Clayton
cab0697310 GH: remove the set-creation-date.yaml workflow
Some checks are pending
buildbot / buildbot (push) Waiting to run
Now that GitHub has introduced various date fields, including 'Created',
in projects, we no longer require this workflow.
2026-06-08 15:49:02 +01:00
Boris Tonofa
ac4bedfafe Xslt: fix handling of vsnprintf() return value
Some checks are pending
buildbot / buildbot (push) Waiting to run
2026-06-08 14:29:08 +04:00
Vadim Zhestikov
1c387799ca SSL: add $ssl_sigalgs variable
Some checks failed
buildbot / buildbot (push) Has been cancelled
The new $ssl_sigalgs variable lists all signature algorithms
advertised by the client in its ClientHello message,
colon-separated, in analogy to $ssl_ciphers and $ssl_curves.

On OpenSSL 4.0+, SSL_get0_sigalg() is used, which returns proper
TLS scheme names (e.g. "rsa_pkcs1_sha256", "ecdsa_secp256r1_sha256")
and falls back to "0xHHHH" hex for unknown schemes.

On OpenSSL 1.0.2+, SSL_get_sigalgs() is used.  Since OBJ_nid2sn()
on the combined psignhash NID is not injective across TLS
SignatureScheme codes (e.g. 0x0403 and 0x081a both yield
"ecdsa-with-SHA256"), raw SignatureScheme codes are reported to
avoid ambiguity and to match the hex fallback format of
SSL_get0_sigalg().

With older versions, as well as BoringSSL, LibreSSL, and AWS-LC,
the variable is empty.
2026-06-04 09:50:50 -07:00
Eugene Grebenschikov
c5f2afd50e Switched $request_id to SipHash-based generation
Some checks are pending
buildbot / buildbot (push) Waiting to run
Replaced RAND_bytes() and random() based $request_id
generation with SipHash-2-4.  The previous implementation
used RAND_bytes() when built with OpenSSL, which is
50-100x slower than needed for a non-security identifier,
and fell back to random() which produces poor 128-bit
random numbers.

The new implementation calls SipHash twice with a secret
key and a monotonic counter, producing 128 bits with good
statistical distribution at a fraction of the cost.
2026-06-02 15:30:30 -07:00
Eugene Grebenschikov
6067896f03 Core: added SipHash-2-4 implementation
Added ngx_siphash() function implementing the SipHash-2-4
algorithm for fast pseudorandom number generation with good
statistical properties.

Co-authored-by: Sergey Kandaurov <pluknet@nginx.com>
2026-06-02 15:30:30 -07:00
Eugene Grebenschikov
25273ede01 Version bump 2026-06-02 15:30:30 -07:00
Sergey Kandaurov
d44205284f nginx-1.31.1-RELEASE
Some checks failed
buildbot / buildbot (push) Has been cancelled
2026-05-22 19:02:07 +04:00
Roman Arutyunyan
ca4f92a274 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.
2026-05-22 18:55:09 +04:00
Roman Arutyunyan
475732a3f9 Rewrite: harden escape flags control
Some checks are pending
buildbot / buildbot (push) Waiting to run
Following 2046b45aa0, this change introduces better control of memory
allocation flags for escaped values.  Notably:

- The e->is_args flag is now explicitly reset on rewrite start.
  If the flag was set prior to rewrite start, then buffer overflow
  could happen before 2046b45aa0.

- The le->is_args flag value is now copied from e->is_args when
  calculating complex value length for "if" and "set" directives.
  If e->is_args was set, but le->is_args was not, then buffer overflow
  could happen before 2046b45aa0.
2026-05-21 18:00:00 +04:00
Roman Arutyunyan
eff1108854 Mail: style
Some checks failed
buildbot / buildbot (push) Has been cancelled
2026-05-15 16:25:01 +04:00
Roman Arutyunyan
a4d5da3e40 Mail: fix session cleanup on error path
Previously, when ngx_handle_read_event() or ngx_handle_write_event()
returned an error while handling an SMTP, POP3 or IMAP session, the
released session memory could be accessed after handling the error.
2026-05-15 16:25:01 +04:00
Roman Arutyunyan
58a7bc3406 HTTP/2: limit Content-Type and Location response header length
Previously, when these fields were larger than ~2M, the number of bytes
allocated for the field length was insufficient for such a large number.
The deficit is 1 byte up until ~4M, 2 bytes for sizes above, and grows
bigger with even larger fields.

Currently, nginx does not have modules which allow to exploit this
overflow with reasonably large Content-Type and Location.  The reason is
other response fields make up for this deficit.  For example, the Date
header value contains the characters compressed well by Huffman
encoding, which frees up spare bytes in the header buffer.

Reported by Leo Lin.
2026-05-15 16:23:39 +04:00
Roman Arutyunyan
18a70a4d58 Mp4: avoid adding or comparing to null pointer
It is considered undefined behavior.

Reported by Geonwoo.kim (awo@kakao.com).
2026-05-15 16:20:30 +04:00
Andrew Clayton
7d76d67241 GH: fix set-creation-date.yaml workflow
Some checks are pending
buildbot / buildbot (push) Waiting to run
Fix the name of the 'Created At' field.

Fixes: 319b4ea63 ("GH: set new issues creation date")
2026-05-13 20:19:15 +01:00
Andrew Clayton
80ee028b80 Version bump 2026-05-13 20:19:15 +01:00
Sergey Kandaurov
e8053c867f nginx-1.31.0-RELEASE
Some checks are pending
buildbot / buildbot (push) Waiting to run
2026-05-13 21:19:47 +04:00
Roman Arutyunyan
c24fb259d1 Proxy: fix large body with proxy_set_body and HTTP/2
Previously, if proxy_set_body was used with HTTP/2, and body size exceeded
16M, then an overflow happened in the 24-bit DATA frame size, which resulted
in sending unframed bytes, potentially allowing for an injection.

Also, DATA frame size could exceed NGX_HTTP_V2_DEFAULT_FRAME_SIZE (16K) and
available send window.

Reported by Mufeed VH of Winfunc Research.
2026-05-13 21:19:47 +04:00
Roman Arutyunyan
2046b45aa0 Rewrite: fixed escaping and possible buffer overrun
The following code resulted in incorrect escaping of $1 and possible
segfault:

    location / {
        rewrite ^(.*) /new?c=1;
        set $myvar $1;
        return 200 $myvar;
    }

If there were arguments in a rewrite's replacement string, the is_args flag
was set and incorrectly never cleared.  This resulted in escaping applied
to any captures evaluated afterwards in set or if.  Additionally buffer was
allocated by ngx_http_script_complex_value_code() without escaping expected,
thus this also resulted in buffer overrun and possible segfault.

A similar issue was fixed in 74d939974d.

Reported by Leo Lin.
2026-05-13 21:19:47 +04:00
Sergey Kandaurov
5f86648ef8 Upstream: fixed parsing of split status lines
If the first response line was split across reads and it didn't appear
a status line, the portion already processed was lost.  The change
introduces a new field for proper backtracking on status line fallback.
2026-05-13 21:19:47 +04:00
Sergey Kandaurov
f79c286b34 Upstream: reset parsing state after invalid status line
Previously, it was possible to start parsing headers with a wrong
parsing state after status line was not recognized, as a fallback
used in the scgi and uwsgi modules.

Reported by Leo Lin.
2026-05-13 21:19:47 +04:00
David Carlier
696a7f1b91 Charset: fix buffer over-read in recode_from_utf8().
When a multi-byte UTF-8 character was split across 3+ single-byte
buffers, the saved bytes continuation path had two related bugs:

ngx_utf8_decode() was called with the last saved-array index instead
of the byte count, causing it to report "incomplete" even when the
sequence was already complete.

The subsequent ngx_memcpy() used that same index as the copy length,
reading past the input buffer boundary.
2026-05-13 21:19:47 +04:00
Roman Arutyunyan
f37ec3e5d4 QUIC: avoid assigning unvalidated address to new streams
Previously, when a client migrated to a new address, new QUIC streams
received this address before validation.  This allowed an attacker to
create QUIC streams with a spoofed address.

Reported by Rodrigo Laneth.
2026-05-13 21:19:47 +04:00
Roman Arutyunyan
71841dcedf OCSP: resolve cleanup on connection close
Previously, when a client SSL connection was terminated (typically due to a
timeout) while resolving an OCSP responder, the OCSP context was freed, but
the resolve context was not.  This resulted in use-after-free on resolve
completion.

Reported by Leo Lin.
2026-05-13 21:19:47 +04:00
Andrew Clayton
319b4ea63f GH: set new issues creation date
Some checks are pending
buildbot / buildbot (push) Waiting to run
When a new issue is created, set its 'Created at' date in the
corresponding project.
2026-05-12 19:42:40 +01:00
Sergey Kandaurov
a43c76b4e3 Reject HTTP CONNECT method with no port after colon
Some checks are pending
buildbot / buildbot (push) Waiting to run
2026-05-11 19:40:47 +04:00
Roman Arutyunyan
631bfa194d Support 407 code in "satisfy any" and "auth_delay"
Some checks are pending
buildbot / buildbot (push) Waiting to run
Notably, "auth_delay" now delays the response for both 401 and 407.
Also, in the "satisfy any" mode, the next access/auth attempt is made
for 401, 403 and 407.
2026-05-08 09:42:58 +04:00
Roman Arutyunyan
4e9289e51a Proxy authentication for CONNECT requests
Notably, ngx_http_auth_basic_module uses Proxy-Authorization input
header, Proxy-Authenticate output header and HTTP code 407 instead
of Authorization, WWW-Authenticate and 401 respectively.
2026-05-08 09:42:58 +04:00
Roman Arutyunyan
8599df49d6 HTTP tunnel module
The module handles CONNECT requests and establishes a tunnel to a
backend.

Example config:

http {

    map $request_port $allow_port {
        80             1;
        443            1;
    }

    map $host $allow_host {
        hostnames;

        example.com    1;
        *.example.org  1;
    }

    server {
        listen 8000;

        resolver dns.example.com;

        if ($allow_port != 1) {
            return 403;
        }

        if ($allow_host != 1) {
            return 403;
        }

        tunnel_pass;
    }
}

Request:

    $ curl -x 127.0.0.1:8000 https://example.com
2026-05-08 09:42:58 +04:00
Andrew Clayton
8de740f89d GH: update the stale PR/issue workflow
To avoid future churn give the workflow a generic name, don't operate on
pull-requests, and extend the issues stale date to 365 days and update
its message.
2026-05-07 15:27:02 +01:00
Roman Arutyunyan
1a2adac356 Proxy: fix keepalive for HTTP/2 with explicit or no body
Previously, when an HTTP/2 request had no body or an explicit body
was set by proxy_set_body, the request consisted of only one buffer,
which had no b->last_buf flag set.  This prevented ctx->output_closed
from being set after processing this buffer.  Consequently,
u->keepalive might not be set to store the connection in the
keepalive cache.
2026-05-07 13:18:39 +04:00
Sai Krishna Kumar Reddy Yadamakanti
f0a084645b Dav: improved path validation for COPY and MOVE operations
The COPY and MOVE handler did not validate whether source and
destination paths referred to the same resource or a parent-child
collection relationship, which could corrupt or destroy files.

Now 403 is returned if paths match or one is a prefix of the other.

Reported by Mufeed VH of Winfunc Research.
2026-05-06 19:35:17 +05:30
Vladimir Homutov
3b5da468b3 Stream: least_time balancer module
Some checks failed
buildbot / buildbot (push) Has been cancelled
Example configuration:

upstream u {
    least_time connect | first_byte | last_byte [inflight];
    server a;
    server b;
}

Co-authored-by: Roman Arutyunyan <arut@nginx.com>
2026-05-04 21:19:40 +05:30
Vladimir Homutov
5760d6148e Upstream: least_time balancer module
The module implements load-balancing algorithm based on least average
response header/last_byte time and least number of active connections.

The optional "inflight" mode enables accounting of incomplete
requests/sessions.  This allows to mitigate cases when an upstream
server hangs and does not close connections.

Example configuration:

upstream u {
    least_time header | last_byte [inflight];
    server a;
    server b;
}

Co-authored-by: Roman Arutyunyan <arut@nginx.com>
2026-05-04 21:19:40 +05:30
Vladimir Homutov
45554176ca Upstream: locked version of ngx_*_upstream_free_round_robin_peer().
This allows optimizing ngx_http_upstream_free_least_time_peer() by
not releasing and re-taking the same lock.
2026-05-04 21:19:40 +05:30
Andrew Clayton
35510ddc94 Configure: fix gcc version detection in some corner cases
If the "gcc version ... " string appeared within "Configured with:", it
was picked up rather than the real gcc version string. This might then
break the configure scripts due to a malformed NGX_COMPILER macro.

The simple fix is to look for "gcc version ... " at the start of the
line, rather than anywhere within.

Suggested-by: Aleksei Bavshin <a.bavshin@nginx.com>
Closes: https://github.com/nginx/nginx/issues/1278
2026-05-01 22:43:35 +01:00
Sergey Kandaurov
6eb7dcdd98 Request body: restored buffered empty body special case
This restores a long-standing optimization when the entire request
body is empty and r->request_body_in_file_only is set, used to avoid
writing an empty file as initially introduced in 4c7f51136 (0.4.4).
The previous condition never worked with chunked body filter, where
rb->bufs holds at least the final chunk; in length body filter, it is
used to indicate the last received buffer since 2a7092138 (1.21.2).

The fix is to additionally check if it is the only empty buffer.

Found with UndefinedBehaviorSanitizer (pointer-overflow)
2026-04-30 15:09:24 +04:00
Sergey Kandaurov
484a9863e7 Stream: evaluate proxy_ssl_alpn once
To avoid disagreement with non-cacheable variables.
2026-04-30 15:07:34 +04:00
Henry Yuan
297b096464 Configure: renamed the upstream sticky module option.
The module can now be disabled with the
--without-http_upstream_sticky_module option to match
the naming convention used by other upstream modules.
Deprecated the --without-http_upstream_sticky option.

Closes: https://github.com/nginx/nginx/issues/1273
2026-04-29 09:58:29 -07:00
Andrew Clayton
bac04c1b66 Update CONTRIBUTING.md
Some checks failed
buildbot / buildbot (push) Has been cancelled
Adjust the subject and commit message body line length limits to 72
characters to match the commit message linter.
2026-04-24 17:33:41 +01:00
Andrew Clayton
07c7adfc7f GH: add a workflow to check for whitespace issues
This runs git-log(1) --check on *each* commit and will report any
issues, e.g.

  --- afe5753fa ("Changes made in upstream")
  src/http/ngx_http_upstream.c:415: trailing whitespace.
  +
  src/http/ngx_http_upstream.c:417: trailing whitespace.
  +      ngx_http_upstream_backend_ssl_protocol, 0,

Specific exceptions can be handled via gitattributes(5).
2026-04-24 17:33:41 +01:00
Andrew Clayton
1f27ab1c8f GH: check commit messages for the most common errors
This checks commit messages in a pull-request for the most common
problems we see.
2026-04-24 17:33:41 +01:00