mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-04 12:20:42 +09:00
CVE-2023-1667:kex: Add support for sending first_kex_packet_follows flag
This is not completely straightforward as it requires us to do some state shuffling. We introduce internal flag that can turn this on in client side, so far for testing only as we do not want to universally enable this. We also repurpose the server flag indicating the guess was wrong also for the client to make desired decisions. If we found out our guess was wrong, we need to hope the server was able to figure out this much, we need to revert the DH FSM state, drop the callbacks from the "wrong" key exchange method and initiate the right one. The server side is already tested by the pkd_hello_i1, which is executing tests against dropbrear clients, which is using this flag by default out of the box. Tested manually also with the pkd_hello --rekey to make sure the server is able to handle the rekeying with all key exchange methods. Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Norbert Pocs <npocs@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
committed by
Andreas Schneider
parent
8dbe055328
commit
08386d4787
@@ -77,6 +77,7 @@ int ssh_dh_get_current_server_publickey_blob(ssh_session session,
|
||||
ssh_key ssh_dh_get_next_server_publickey(ssh_session session);
|
||||
int ssh_dh_get_next_server_publickey_blob(ssh_session session,
|
||||
ssh_string *pubkey_blob);
|
||||
int dh_handshake(ssh_session session);
|
||||
|
||||
int ssh_client_dh_init(ssh_session session);
|
||||
void ssh_client_dh_remove_callbacks(ssh_session session);
|
||||
|
||||
@@ -172,14 +172,21 @@ struct ssh_session_struct {
|
||||
uint32_t current_method;
|
||||
} auth;
|
||||
|
||||
/* Sending this flag before key exchange to save one round trip during the
|
||||
* key exchange. This might make sense on high-latency connections.
|
||||
* So far internal only for testing. Usable only on the client side --
|
||||
* there is no key exchange method that would start with server message */
|
||||
bool send_first_kex_follows;
|
||||
/*
|
||||
* RFC 4253, 7.1: if the first_kex_packet_follows flag was set in
|
||||
* the received SSH_MSG_KEXINIT, but the guess was wrong, this
|
||||
* field will be set such that the following guessed packet will
|
||||
* be ignored. Once that packet has been received and ignored,
|
||||
* this field is cleared.
|
||||
* be ignored on the receiving side. Once that packet has been received and
|
||||
* ignored, this field is cleared.
|
||||
* On the sending side, this is set after we got peer KEXINIT message and we
|
||||
* need to resend the initial message of the negotiated KEX algorithm.
|
||||
*/
|
||||
int first_kex_follows_guess_wrong;
|
||||
bool first_kex_follows_guess_wrong;
|
||||
|
||||
ssh_buffer in_hashbuf;
|
||||
ssh_buffer out_hashbuf;
|
||||
|
||||
Reference in New Issue
Block a user