[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] kex: server fix to include first_kex_packet_follows
[Thread Prev] | [Thread Next]
- Subject: [PATCH] kex: server fix to include first_kex_packet_follows
- From: Jon Simons <jon@xxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Wed, 19 Mar 2014 19:57:36 -0700
- To: libssh@xxxxxxxxxx
Hi, Attached is a patch which fixes a host key signature validation bug that can be hit when testing with dropbear clients at or beyond version 2013.57. The issue is that dropbear now always sets the 'first_kex_packet_follows' field in its KEXINIT message. Until now libssh would assume this field is zero; but, it needs to be used when computing the session ID. Before the patch I'm able to hit 'Bad hostkey signature' errors with dbclient; after, dbclient is working for me. Thanks, -Jon
From 9961da6770cbbb43e9b9ab6e2648a4a1e7307c97 Mon Sep 17 00:00:00 2001
From: Jon Simons <jon@xxxxxxxxxxxxx>
Date: Tue, 18 Mar 2014 13:26:43 -0700
Subject: [PATCH] kex: server fix to include first_kex_packet_follows
Signed-off-by: Jon Simons <jon@xxxxxxxxxxxxx>
---
src/dh.c | 24 ++++++++++++++++++------
src/kex.c | 17 +++++++++++++++++
2 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/src/dh.c b/src/dh.c
index 3c2e5ad..c72f63e 100644
--- a/src/dh.c
+++ b/src/dh.c
@@ -638,17 +638,29 @@ int make_sessionid(ssh_session session) {
client_hash = session->in_hashbuf;
}
- if (buffer_add_u32(server_hash, 0) < 0) {
- goto error;
- }
+ /*
+ * Handle the two final fields for the KEXINIT message (RFC 4253 7.1):
+ *
+ * boolean first_kex_packet_follows
+ * uint32 0 (reserved for future extension)
+ */
if (buffer_add_u8(server_hash, 0) < 0) {
goto error;
}
- if (buffer_add_u32(client_hash, 0) < 0) {
+ if (buffer_add_u32(server_hash, 0) < 0) {
goto error;
}
- if (buffer_add_u8(client_hash, 0) < 0) {
- goto error;
+
+ /*
+ * These fields are handled for the server case in ssh_packet_kexinit.
+ */
+ if (session->client) {
+ if (buffer_add_u8(client_hash, 0) < 0) {
+ goto error;
+ }
+ if (buffer_add_u32(client_hash, 0) < 0) {
+ goto error;
+ }
}
len = ntohl(buffer_get_rest_len(client_hash));
diff --git a/src/kex.c b/src/kex.c
index f19beb8..4629363 100644
--- a/src/kex.c
+++ b/src/kex.c
@@ -281,6 +281,9 @@ SSH_PACKET_CALLBACK(ssh_packet_kexinit){
char *strings[KEX_METHODS_SIZE];
int i;
+ uint8_t first_kex_packet_follows = 0;
+ uint32_t kexinit_reserved = 0;
+
(void)type;
(void)user;
memset(strings, 0, sizeof(strings));
@@ -343,6 +346,20 @@ SSH_PACKET_CALLBACK(ssh_packet_kexinit){
}
}
+ /*
+ * Handle the two final fields for the KEXINIT message (RFC 4253 7.1):
+ *
+ * boolean first_kex_packet_follows
+ * uint32 0 (reserved for future extension)
+ *
+ * Notably if clients set 'first_kex_packet_follows', it is expected
+ * that its value is included when computing the session ID (see
+ * 'make_sessionid').
+ */
+ buffer_get_u8(packet, &first_kex_packet_follows);
+ buffer_add_u8(session->in_hashbuf, first_kex_packet_follows);
+ buffer_add_u32(session->in_hashbuf, kexinit_reserved);
+
session->session_state=SSH_SESSION_STATE_KEXINIT_RECEIVED;
session->dh_handshake_state=DH_STATE_INIT;
session->ssh_connection_callback(session);
--
1.8.4.21.g992c386
| Re: [PATCH] kex: server fix to include first_kex_packet_follows | Andreas Schneider <asn@xxxxxxxxxxxxxx> |