Skip to content

Commit 53567c2

Browse files
committed
x/crypto/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 Signed-off-by: Peter Verraedt <[email protected]>
1 parent 3147a52 commit 53567c2

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

ssh/handshake.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,14 @@ 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.
482+
// 8308, Section 2.1.
483483
msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1)
484484
msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...)
485-
msg.KexAlgos = append(msg.KexAlgos, "ext-info-c")
485+
// Add ext-info-c as algorithm during the first key exchange only, as
486+
// specified in RFC 8308, Section 2.1.
487+
if t.sessionID == nil {
488+
msg.KexAlgos = append(msg.KexAlgos, "ext-info-c")
489+
}
486490
}
487491

488492
packet := Marshal(msg)

0 commit comments

Comments
 (0)