From ba3ed53e0bf6682f89940bc2c3e83da6b1524024 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 14 May 2026 18:15:56 +0100 Subject: [PATCH] Don't call sfree after ssh_rsakex_freekey. ssh_rsakex_freekey(), given an RSAKey structure, calls freersakey() to free all the pieces dangling off it, and then finally frees the RSAKey itself. So calling ssh_rsakex_freekey() and _then_ sfree() is a double free. Upstream: https://git.tartarus.org/?p=simon/putty.git;a=commitdiff;h=ba3ed53e0bf6682f89940bc2c3e83da6b1524024 CVE: CVE-2026-48850 Signed-off-by: Thomas Perale --- ssh/kex2-server.c | 4 +--- ssh/transport2.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ssh/kex2-server.c b/ssh/kex2-server.c index 570d7750..8c3dc2f4 100644 --- a/ssh/kex2-server.c +++ b/ssh/kex2-server.c @@ -321,10 +321,8 @@ void ssh2kex_coroutine(struct ssh2_transport_state *s, bool *aborted) put_mp_ssh2(s->kex_shared_secret, K); mp_free(K); - if (s->rsa_kex_key_needs_freeing) { + if (s->rsa_kex_key_needs_freeing) ssh_rsakex_freekey(s->rsa_kex_key); - sfree(s->rsa_kex_key); - } s->rsa_kex_key = NULL; s->rsa_kex_key_needs_freeing = false; diff --git a/ssh/transport2.c b/ssh/transport2.c index 64f40560..60a99c29 100644 --- a/ssh/transport2.c +++ b/ssh/transport2.c @@ -251,10 +251,8 @@ static void ssh2_transport_free(PacketProtocolLayer *ppl) if (s->kex_shared_secret) strbuf_free(s->kex_shared_secret); if (s->dh_ctx) dh_cleanup(s->dh_ctx); - if (s->rsa_kex_key_needs_freeing) { + if (s->rsa_kex_key_needs_freeing) ssh_rsakex_freekey(s->rsa_kex_key); - sfree(s->rsa_kex_key); - } if (s->ecdh_key) ecdh_key_free(s->ecdh_key); if (s->exhash) -- 2.54.0