Re: Client-side SSH_MSG_EXT_INFO: Use it or lose it principle!
denis bider <[email protected]> Mon, 27 Apr 2020 00:33:46 -0500
| Newsgroups | gmane.ietf.curdle,gmane.ietf.secsh |
|---|---|
| Message-ID | <CADPMZDAvv23SKg2ZiTBH+Ec6M135zonsnNFaiinAKwszj-ap8g@mail.gmail.com> |
Awesome! Yes, the idea of "global-requests-ok" is not to make the client do anything different. It's to reassure the server that the client won't violate the spec if the server sends a global request. The main motivating usage case is so the server can feel at liberty to send the global request "hostkeys-00-ZT/[email protected]" after user authentication: https://cvsweb.openbsd.org/src/usr.bin/ssh/PROTOCOL?annotate=HEAD This is essential functionality which allows clients and servers to change host keys without requiring administrative intervention at each client installation. Without "global-requests-ok", the server needs a database of client version strings to which it's safe to send the "hostkeys" global request. Otherwise, it can't send it because a bunch of half-baked clients (I'm counting 7 in our list) are borked and can't handle receiving a global request. Or they can handle it usually, but not when they're expecting a response to a channel open. Meanwhile I've received more info about the implementation that disconnects on receiving EXT_INFO from the client. The bug is unfortunately in a widely used Java SSH library. The information I received suggests it's going to be fixed, but I'm afraid there are already a fair number of deployed servers that have the issue. While I'm wishing things - I would also like the "delay-compression" extension to be more widely supported because it's the only delayed-compression mechanism that (1) does not have a race condition by design (zlib-ZT/[email protected]), and (2) does not require a second key exchange after user authentication (PuTTY mitigation). denis On Sun, Apr 26, 2020 at 12:33 PM Ron Frederick <ronf-vmXfByGZ37geIZ0/[email protected]> wrote: > Hi Denis, > > On Apr 26, 2020, at 5:03 AM, denis bider <[email protected]> > wrote: > > it has come to my attention that at least one SSH server implementation > (a) advertises support for SSH_MSG_EXT_INFO as defined in RFC 8308, and (b) > disconnects on actual receipt of an EXT_INFO message from the client. > > This happens when we define a general mechanism, but then the most widely > used implementations only use certain aspects of it. Lots of > implementations now support EXT_INFO sent by the server because it's needed > for RSA-SHA2 signatures, but only a handful implementations send EXT_INFO > by the client. > > Bitvise SSH Client sends EXT_INFO if the server supports it. It's free to > use or test with - but it runs on Windows and lots of people don't want to > test with that. > > It's possible that your implementation has no need for any of the > extensions that would appear in EXT_INFO from the client. However, if you > wish for this extensibility to be available in the future, then if your > client supports EXT_INFO, I would strongly suggest that it sends it. > > If you want to send a client-side EXT_INFO that takes minimal effort, I > suggest: > > 1. Ensure that your SSH client can correctly handle SSH_MSG_GLOBAL_REQUEST > received at any point. Your client should not disconnect when it receives > this message, or act like it received a channel open failure if it receives > a global request when it's waiting for a channel open confirmation. These > are the two most common error modes relating to global requests. > > 2. Once you have ensured the above, if the server supports EXT_INFO, send > a client-side EXT_INFO implementing the extension "global-requests-ok" as > defined in this draft: > > https://tools.ietf.org/html/draft-ssh-global-requests-ok-00 > > This tells the server that your client properly implements global requests > so that the server can use them for things like active keep-alives. > > Implementing this would take minimal effort and would help ensure that > client-side EXT_INFO remains an available extension mechanism 10 years down > the road for SSH. > > > I’ve made this change in the AsyncSSH “develop” branch as commit > https://github.com/ronf/asyncssh/commit/b87291d, and will roll this into > the next release. Most of the support was already in place as I already had > common code for generating and parsing EXT_INFO on both the client and > server. The changes are as follows: > > - AsyncSSH now advertises that it will accept EXT_INFO from clients > when acting as a server > > - AsyncSSH will send the global-requests-ok extension when acting as a > client and talking to a server that supports EXT_INFO from clients > > Since AsyncSSH doesn’t actually have any heuristics around disabling the > use of global requests based on client software/version, it doesn’t > actually do anything right now when it receives the ‘global-requests-ok’ > extension. However, I confirmed it successfully parses received extensions, > so it should be easy to process future extensions from the client when this > is needed. > > I also specifically tested this against the Bitvise server (thanks for > making that available for free for non-commercial use!), and it seems to > work well. > -- > Ron Frederick > ronf-vmXfByGZ37geIZ0/[email protected] > > > > _______________________________________________ Curdle mailing list [email protected] https://www.ietf.org/mailman/listinfo/curdle