From: William Lallemand Date: Fri, 25 Sep 2026 08:01:03 +0000 (+0000) Subject: MINOR: ssl: cleanse TLS ticket keys before freeing X-Git-Tag: v3.5-dev8~114 X-Git-Url: https://git.kaiwu.me/$%7BISSUES%7D/static/gitweb.js?a=commitdiff_plain;h=e06fd5f8a8ad44a776c3dea9e8111bab1e2e693a;p=haproxy.git MINOR: ssl: cleanse TLS ticket keys before freeing Cleanse tlskeys with ha_memset_s() before freeing. tlskeys contains tls_sess_key structures holding encryption keys for session resumption. Leaving these secrets in freed heap memory risks exposure through core dumps or memory disclosure bugs. This patch cleanses intermediate buffers used to parse the tlskeys as well. This fixes issue #3504. --- diff --git a/src/cfgparse-ssl.c b/src/cfgparse-ssl.c index 08a9ade9e..d9d213b70 100644 --- a/src/cfgparse-ssl.c +++ b/src/cfgparse-ssl.c @@ -1551,6 +1551,7 @@ static int bind_parse_tls_ticket_keys(char **args, int cur_arg, struct proxy *px thisline[--len] = 0; dec_size = base64dec(thisline, len, (char *) (keys_ref->tlskeys + i % TLS_TICKETS_NO), sizeof(union tls_sess_key)); + ha_memset_s(thisline, 0, sizeof(thisline)); if (dec_size < 0) { memprintf(err, "'%s' : unable to decode base64 key on line %d", args[cur_arg+1], i + 1); goto fail; @@ -1590,11 +1591,16 @@ static int bind_parse_tls_ticket_keys(char **args, int cur_arg, struct proxy *px return 0; fail: + ha_memset_s(thisline, 0, sizeof(thisline)); if (f) fclose(f); if (keys_ref) { free(keys_ref->filename); - free(keys_ref->tlskeys); + if (keys_ref->tlskeys) { + ha_memset_s(keys_ref->tlskeys, 0, + sizeof(*keys_ref->tlskeys) * TLS_TICKETS_NO); + free(keys_ref->tlskeys); + } free(keys_ref); } return ERR_ALERT | ERR_FATAL; diff --git a/src/ssl_sock.c b/src/ssl_sock.c index 1f971d717..c216b70cc 100644 --- a/src/ssl_sock.c +++ b/src/ssl_sock.c @@ -6026,7 +6026,11 @@ void ssl_sock_destroy_bind_conf(struct bind_conf *bind_conf) free(bind_conf->ca_sign_pass); if (bind_conf->keys_ref && !--bind_conf->keys_ref->refcount) { free(bind_conf->keys_ref->filename); - free(bind_conf->keys_ref->tlskeys); + if (bind_conf->keys_ref->tlskeys) { + ha_memset_s(bind_conf->keys_ref->tlskeys, 0, + sizeof(*bind_conf->keys_ref->tlskeys) * TLS_TICKETS_NO); + free(bind_conf->keys_ref->tlskeys); + } LIST_DELETE(&bind_conf->keys_ref->list); free(bind_conf->keys_ref); } @@ -8608,7 +8612,10 @@ static int cli_parse_set_tlskeys(char **args, char *payload, struct appctx *appc return cli_err(appctx, "'set ssl tls-key' received invalid base64 encoded TLS key.\n"); trash.data = ret; - if (ssl_sock_update_tlskey_ref(ref, &trash) < 0) + ret = ssl_sock_update_tlskey_ref(ref, &trash); + ha_memset_s(trash.area, 0, trash.data); + chunk_reset(&trash); + if (ret < 0) return cli_err(appctx, "'set ssl tls-key' received a key of wrong size.\n"); return cli_msg(appctx, LOG_INFO, "TLS ticket key updated!\n");