the peer sends non-KEX messages during a key re-exchange.
Previously an evil peer could continue sending non-KEX messages
without penalty, causing memory to be wasted up until the
connection terminated or the server/client hit a OOM limit.
reported by Marko Jevtic; ok markus@
OpenBSD-Commit-ID:
8937f0f2096156f5c68ae2dce77956373589d757
-/* $OpenBSD: kex.c,v 1.193 2026/03/05 05:40:35 djm Exp $ */
+/* $OpenBSD: kex.c,v 1.194 2026/05/31 04:44:38 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
*
kex->done = 1;
kex->flags &= ~KEX_INITIAL;
sshbuf_reset(kex->peer);
- kex->flags &= ~KEX_INIT_SENT;
+ kex->flags &= ~(KEX_INIT_SENT|KEX_INIT_RECVD);
return 0;
}
}
free(kex->name);
kex->name = NULL;
+ if ((kex->flags & KEX_INIT_RECVD) != 0) {
+ ssh_packet_disconnect(ssh,
+ "multiple KEXINIT received from peer");
+ }
+ kex->flags |= KEX_INIT_RECVD;
ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_protocol_error);
ptr = sshpkt_ptr(ssh, &dlen);
if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0)
-/* $OpenBSD: kex.h,v 1.129 2026/03/05 05:40:36 djm Exp $ */
+/* $OpenBSD: kex.h,v 1.130 2026/05/31 04:44:38 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
#define KEX_HAS_PING 0x0020
#define KEX_HAS_EXT_INFO_IN_AUTH 0x0040
#define KEX_HAS_NEWAGENT 0x0080 /* only set in client */
+#define KEX_INIT_RECVD 0x0100
/* kex->pq */
#define KEX_NOT_PQ 0
-/* $OpenBSD: packet.c,v 1.337 2026/05/31 04:37:56 djm Exp $ */
+/* $OpenBSD: packet.c,v 1.338 2026/05/31 04:44:38 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
DBG(debug("Received SSH2_MSG_PONG len %zu", len));
break;
default:
+ if (ssh->kex != NULL &&
+ (ssh->kex->flags & KEX_INIT_RECVD) != 0 &&
+ !ssh_packet_type_is_kex(*typep)) {
+ error("non-transport message %u received "
+ "from peer during key exchange", *typep);
+ return SSH_ERR_PROTOCOL_ERROR;
+ }
return 0;
}
}