aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2015-04-15 16:08:37 +0200
committerAndreas Schneider <asn@cryptomilk.org>2015-04-23 10:15:47 +0200
commitbf0c7ae0aeb0ebe661d11ea6785fff2cbf4f3dbe (patch)
tree0375ca3419731a32b6192b362e8d78db01dfd8f9
parentb5dc8197f78b6639ca75aa93d6c421c0181d0f32 (diff)
downloadlibssh-bf0c7ae0aeb0ebe661d11ea6785fff2cbf4f3dbe.tar.gz
libssh-bf0c7ae0aeb0ebe661d11ea6785fff2cbf4f3dbe.tar.xz
libssh-bf0c7ae0aeb0ebe661d11ea6785fff2cbf4f3dbe.zip
CVE-2015-3146: Fix state validation in packet handlers
The state validation in the packet handlers for SSH_MSG_NEWKEYS and SSH_MSG_KEXDH_REPLY had a bug which did not raise an error. The issue has been found and reported by Mariusz Ziule. Signed-off-by: Aris Adamantiadis <aris@0xbadc0de.be> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r--src/packet_cb.c16
-rw-r--r--src/server.c8
2 files changed, 15 insertions, 9 deletions
diff --git a/src/packet_cb.c b/src/packet_cb.c
index 17e39a4c..4fe6402a 100644
--- a/src/packet_cb.c
+++ b/src/packet_cb.c
@@ -97,7 +97,7 @@ SSH_PACKET_CALLBACK(ssh_packet_dh_reply){
(void)type;
(void)user;
SSH_LOG(SSH_LOG_PROTOCOL,"Received SSH_KEXDH_REPLY");
- if(session->session_state!= SSH_SESSION_STATE_DH &&
+ if (session->session_state != SSH_SESSION_STATE_DH ||
session->dh_handshake_state != DH_STATE_INIT_SENT){
ssh_set_error(session,SSH_FATAL,"ssh_packet_dh_reply called in wrong state : %d:%d",
session->session_state,session->dh_handshake_state);
@@ -138,12 +138,16 @@ SSH_PACKET_CALLBACK(ssh_packet_newkeys){
(void)user;
(void)type;
SSH_LOG(SSH_LOG_PROTOCOL, "Received SSH_MSG_NEWKEYS");
- if(session->session_state!= SSH_SESSION_STATE_DH &&
- session->dh_handshake_state != DH_STATE_NEWKEYS_SENT){
- ssh_set_error(session,SSH_FATAL,"ssh_packet_newkeys called in wrong state : %d:%d",
- session->session_state,session->dh_handshake_state);
- goto error;
+
+ if (session->session_state != SSH_SESSION_STATE_DH ||
+ session->dh_handshake_state != DH_STATE_NEWKEYS_SENT) {
+ ssh_set_error(session,
+ SSH_FATAL,
+ "ssh_packet_newkeys called in wrong state : %d:%d",
+ session->session_state,session->dh_handshake_state);
+ goto error;
}
+
if(session->server){
/* server things are done in server.c */
session->dh_handshake_state=DH_STATE_FINISHED;
diff --git a/src/server.c b/src/server.c
index 61641a6e..01145764 100644
--- a/src/server.c
+++ b/src/server.c
@@ -172,7 +172,7 @@ static int ssh_server_kexdh_init(ssh_session session, ssh_buffer packet){
}
SSH_PACKET_CALLBACK(ssh_packet_kexdh_init){
- int rc;
+ int rc = SSH_ERROR;
(void)type;
(void)user;
@@ -209,9 +209,11 @@ SSH_PACKET_CALLBACK(ssh_packet_kexdh_init){
ssh_set_error(session,SSH_FATAL,"Wrong kex type in ssh_packet_kexdh_init");
rc = SSH_ERROR;
}
- if (rc == SSH_ERROR)
+
+error:
+ if (rc == SSH_ERROR) {
session->session_state = SSH_SESSION_STATE_ERROR;
- error:
+ }
return SSH_PACKET_USED;
}