Since
3d7304b52, sessions are serialized into the static buffer
ngx_ssl_session_buffer, so the last cached, resumed, or proxied session
remains in memory, master secret included, until overwritten. Clear the
buffer on all exits that write to it.
While here, the session id length check is moved before serialization,
which removes an exit path with a populated buffer and a needless
i2d_SSL_SESSION() call for sessions that are not cached.
Note that sessions are still kept in shared memory until evicted.
Assisted-by: opencode:claude-opus-5
Closes: https://github.com/nginx/nginx/issues/1736
#endif
+ session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);
+
+ /* do not cache sessions with too long session id */
+
+ if (session_id_length > 32) {
+ return 0;
+ }
+
len = i2d_SSL_SESSION(sess, NULL);
/* do not cache too big session */
p = ngx_ssl_session_buffer;
i2d_SSL_SESSION(sess, &p);
- session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length);
-
- /* do not cache sessions with too long session id */
-
- if (session_id_length > 32) {
- return 0;
- }
-
c = ngx_ssl_get_connection(ssl_conn);
ssl_ctx = c->ssl->session_ctx;
ngx_shmtx_unlock(&shpool->mutex);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
return 0;
failed:
ngx_shmtx_unlock(&shpool->mutex);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
if (cache->fail_time != ngx_time()) {
cache->fail_time = ngx_time();
ngx_log_error(NGX_LOG_WARN, c->log, 0,
p = ngx_ssl_session_buffer;
sess = d2i_SSL_SESSION(NULL, &p, slen);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, slen);
+
return sess;
}
p = ngx_ssl_session_buffer;
ssl_session = d2i_SSL_SESSION(NULL, &p, len);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
rc = ngx_ssl_set_session(pc->connection, ssl_session);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
ngx_http_upstream_rr_peer_unlock(peers, peer);
ngx_http_upstream_rr_peers_unlock(peers);
+
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
return;
}
ngx_http_upstream_rr_peer_unlock(peers, peer);
ngx_http_upstream_rr_peers_unlock(peers);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
return;
}
#endif
p = ngx_ssl_session_buffer;
ssl_session = d2i_SSL_SESSION(NULL, &p, len);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
rc = ngx_ssl_set_session(pc->connection, ssl_session);
ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0,
ngx_stream_upstream_rr_peer_unlock(peers, peer);
ngx_stream_upstream_rr_peers_unlock(peers);
+
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
return;
}
ngx_stream_upstream_rr_peer_unlock(peers, peer);
ngx_stream_upstream_rr_peers_unlock(peers);
+ ngx_explicit_memzero(ngx_ssl_session_buffer, len);
+
return;
}
#endif