]> git.kaiwu.me - nginx.git/commitdiff
QUIC: rejected CRYPTO frames received in 1-RTT packets
authorVadim Zhestikov <v.zhestikov@f5.com>
Wed, 12 Aug 2026 19:41:54 +0000 (12:41 -0700)
committerVadimZhestikov <108960056+VadimZhestikov@users.noreply.github.com>
Tue, 25 Aug 2026 21:36:09 +0000 (14:36 -0700)
If a CRYPTO frame was received after the handshake, ngx_quic_handshake()
ran the handshake completion for the second time.  With the check added
in 6f8c520f4, this is limited to short header packets.

Since a client has nothing to send in a CRYPTO frame once the handshake
is complete, such frames are now rejected with the "unexpected_message"
connection error, as does TLS 1.3 for handshake messages received out of
order, and QUIC requires for KeyUpdate.

src/event/quic/ngx_event_quic_ssl.c

index 705f39f6cb05e88171440d3361315d68be7a5349..259f5525c39f4085a44d8415b87b84813fa7eb12 100644 (file)
@@ -638,6 +638,15 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
         return NGX_OK;
     }
 
+    if (c->ssl->handshaked) {
+        /* QUIC doesn't define post-handshake messages for a client */
+
+        qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_UNEXPECTED_MESSAGE);
+        qc->error_reason = "unexpected CRYPTO frame";
+
+        return NGX_ERROR;
+    }
+
     ctx = ngx_quic_get_send_ctx(qc, pkt->level);
     f = &frame->u.crypto;