1
1

dh: fix libcrypto leak via ssh_dh_keypair_set_keys

Upon SSH_OK, callers of `ssh_dh_keypair_set_keys` expect for ownership
of the `priv` and `pub` values to be transferred away and eventually
later managed by way of the `struct dh_ctx` at hand.

The mbedTLS and gcrypt builds transfer ownership of these values in
that way, but the libcrypto `ssh_dh_keypair_set_keys` is copying the
given values with `BN_dup`.  This causes a memory leak that can be
seen with pkd and valgrind:

    valgrind --leak-check=full \
      ./pkd_hello -i1 -t torture_pkd_openssh_dsa_rsa_diffie_hellman_group16_sha512

Fix the leak by replacing the `BN_dup` with direct assignment.
Now the bignums will eventually be freed via `ssh_dh_cleanup`.

Signed-off-by: Jon Simons <jon@jonsimons.org>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Этот коммит содержится в:
Jon Simons 2019-04-30 12:37:26 -07:00 коммит произвёл Andreas Schneider
родитель ee42e3badb
Коммит 0849e44220

Просмотреть файл

@ -73,10 +73,10 @@ int ssh_dh_keypair_set_keys(struct dh_ctx *ctx, int peer,
} }
if (priv) { if (priv) {
priv_key = BN_dup(priv); priv_key = priv;
} }
if (pub) { if (pub) {
pub_key = BN_dup(pub); pub_key = pub;
} }
(void)DH_set0_key(ctx->keypair[peer], pub_key, priv_key); (void)DH_set0_key(ctx->keypair[peer], pub_key, priv_key);