summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2024-12-13 13:25:26 +0400
committerpluknet <pluknet@nginx.com>2025-02-05 20:40:47 +0400
commit0d11f2885eab99924dbe40d7effb91c80b00d9bf (patch)
treef03043838e2ebe14f49e9aa1fb5e945a31202b6b
parente9e83dbb697c17b7ad51d1dd8536ad1c601fdd0e (diff)
downloadnginx-0d11f2885eab99924dbe40d7effb91c80b00d9bf.tar.gz
nginx-0d11f2885eab99924dbe40d7effb91c80b00d9bf.tar.bz2
QUIC: ignore version negotiation packets.
Previously, such packets were treated as long header packets with unknown version 0, and a version negotiation packet was sent in response. This could be used to set up an infinite traffic reflect loop with another nginx instance. Now version negotiation packets are ignored. As per RFC 9000, Section 6.1: An endpoint MUST NOT send a Version Negotiation packet in response to receiving a Version Negotiation packet.
-rw-r--r--src/event/quic/ngx_event_quic_transport.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/event/quic/ngx_event_quic_transport.c b/src/event/quic/ngx_event_quic_transport.c
index fba098caa..bb13447b5 100644
--- a/src/event/quic/ngx_event_quic_transport.c
+++ b/src/event/quic/ngx_event_quic_transport.c
@@ -295,6 +295,11 @@ ngx_quic_parse_packet(ngx_quic_header_t *pkt)
return NGX_ERROR;
}
+ if (pkt->version == 0) {
+ /* version negotiation */
+ return NGX_ERROR;
+ }
+
if (!ngx_quic_supported_version(pkt->version)) {
return NGX_ABORT;
}