From 1916f26e6ca49296568633d309777e36527e5bb2 Mon Sep 17 00:00:00 2001 From: Vadim Zhestikov Date: Wed, 22 Jul 2026 16:48:37 -0700 Subject: [PATCH] SSL: synced all session ticket keys to the worker process The per-worker ticket key mirror is allocated with three slots (ngx_array_push_n(keys, 3)), matching the shared memory ticket_keys[3] array and the decrypt callback, which scans all keys->nelts slots by key name. Key rotation, however, synced only two slots from shared memory, leaving the third slot's name, hmac_key, and aes_key uninitialized. A ticket whose key name matched the uninitialized slot (which holds unspecified pool memory, all zero in the best case) could therefore be HMAC-verified and decrypted with uninitialized key material, allowing a forged session. Sync all keys->nelts slots, as ngx_ssl_ticket_keys_cleanup() already assumes. Reported by PhiNode Labs. --- src/event/ngx_event_openssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c index e4250ee09..9b8236489 100644 --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -5251,7 +5251,7 @@ ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ctx, ngx_log_t *log) /* sync keys to the worker process memory */ ngx_memcpy(keys->elts, cache->ticket_keys, - 2 * sizeof(ngx_ssl_ticket_key_t)); + keys->nelts * sizeof(ngx_ssl_ticket_key_t)); ngx_shmtx_unlock(&shpool->mutex);