Skip to content

Commit 2c7772b

Browse files
peterverraedtFiloSottile
authored andcommitted
ssh: send ext-info-c only once
In accordance to RFC8308, send ext-info-c only during the first key exchange. Some server implementations such as OpenSSH 7 will send an extInfoMsg message each time when ext-info-c is received. This results in a closed connection, as our client does not expect this message while handling the mux. See https://bugzilla.mindrot.org/show_bug.cgi?id=2929 regarding the behaviour of OpenSSH if it sees ext-info-c in later key exchanges. Fixes golang/go#51808 Change-Id: Id94f1ef73cec6147136246b0b6048b57db92660d GitHub-Last-Rev: fcfe5ed GitHub-Pull-Request: #208 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/394134 Reviewed-by: Filippo Valsorda <[email protected]> Run-TryBot: Filippo Valsorda <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Trust: Roland Shoemaker <[email protected]>
1 parent 3147a52 commit 2c7772b

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

ssh/handshake.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,12 @@ func (t *handshakeTransport) sendKexInit() error {
479479

480480
// As a client we opt in to receiving SSH_MSG_EXT_INFO so we know what
481481
// algorithms the server supports for public key authentication. See RFC
482-
// 8303, Section 2.1.
483-
msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1)
484-
msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...)
485-
msg.KexAlgos = append(msg.KexAlgos, "ext-info-c")
482+
// 8308, Section 2.1.
483+
if firstKeyExchange := t.sessionID == nil; firstKeyExchange {
484+
msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1)
485+
msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...)
486+
msg.KexAlgos = append(msg.KexAlgos, "ext-info-c")
487+
}
486488
}
487489

488490
packet := Marshal(msg)

0 commit comments

Comments
 (0)