hierynomus / sshj

ssh, scp and sftp for java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

hostkeys-00@openssh.com unhandled

TheConstructor opened this issue · comments

According to this mail-thread clients may receive "hostkeys-00@openssh.com" after authentication. While OpenSSH-6.9-Release-Notes already list issues with Terra Term, it seems your software is also affected.

If net.schmizz.sshj.userauth.UserAuthImpl#handle is called post-auth with a GLOBAL_REQUEST like hostkeys-00@openssh.com it will simply throw a NullPointerException, if the message is received before currentMethod is set to null you get the following stack-trace:

Caused by: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods
    at net.schmizz.sshj.SSHClient.auth(SSHClient.java:232) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:331) ~[sshj-0.15.0.jar:na]
    ...
            ... 3 common frames omitted
Caused by: net.schmizz.sshj.userauth.UserAuthException: Received SSH_MSG_UNIMPLEMENTED while exchanging keys
    at net.schmizz.sshj.userauth.UserAuthException$1.chain(UserAuthException.java:33) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.userauth.UserAuthException$1.chain(UserAuthException.java:26) ~[sshj-0.15.0.jar:na]
    at net.schmizz.concurrent.Promise.deliverError(Promise.java:95) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.userauth.UserAuthImpl.notifyError(UserAuthImpl.java:151) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:597) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Reader.run(Reader.java:68) ~[sshj-0.15.0.jar:na]
Caused by: net.schmizz.sshj.transport.TransportException: Received SSH_MSG_UNIMPLEMENTED while exchanging keys
    at net.schmizz.sshj.transport.TransportImpl.gotUnimplemented(TransportImpl.java:574) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:506) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

I am connecting against a OpenSSH_7.1p2-hpn14v10, OpenSSL 1.0.2f 28 Jan 2016 server on a raspberry pi. Distribution is Gentoo.

Strangely this error only occurs once every 5-10 connections. I used the debugger to verify it actually is a hostkeys-00@openssh.com-message.

And here is the mentioned NPE-variant:

Caused by: net.schmizz.sshj.connection.ConnectionException: null
    at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:32) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:26) ~[sshj-0.15.0.jar:na]
    at net.schmizz.concurrent.Promise.deliverError(Promise.java:95) ~[sshj-0.15.0.jar:na]
    at net.schmizz.concurrent.Event.deliverError(Event.java:72) ~[sshj-0.15.0.jar:na]
    at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(ErrorDeliveryUtil.java:34) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.connection.channel.AbstractChannel.notifyError(AbstractChannel.java:218) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.connection.channel.direct.SessionChannel.notifyError(SessionChannel.java:229) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.common.ErrorNotifiable$Util.alertAll(ErrorNotifiable.java:35) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.connection.ConnectionImpl.notifyError(ConnectionImpl.java:262) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:597) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Reader.run(Reader.java:68) ~[sshj-0.15.0.jar:na]
Caused by: net.schmizz.sshj.common.SSHException: null
    at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:36) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:29) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:591) ~[sshj-0.15.0.jar:na]
    ... 1 common frames omitted
Caused by: java.lang.NullPointerException: null
    at net.schmizz.sshj.userauth.UserAuthImpl.handle(UserAuthImpl.java:134) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
    at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

Work-arround: pick a client with SSH_BUG_HOSTKEYS in OpenSSH's compat.c and set it as Version on your Config:

SSH_CONFIG.setVersion("TeraTerm SSH - " + SSH_CONFIG.getVersion());

Can you send a debug log for both scenarios with the following levels:

    <logger name="net.schmizz.sshj" level="debug"/>
    <logger name="net.schmizz.sshj.transport" level="trace" />

If I left out important stuff, just ask. I'm not sure what is important and what just would give details about my application unreleted to this problem.

NPE-case:

    2016-03-18 14:28:52.882  INFO 42561 --- [pool-4-thread-1] n.schmizz.sshj.transport.TransportImpl   : Client identity string: SSH-2.0-SSHJ_0_14_0
    2016-03-18 14:28:53.113  INFO 42561 --- [pool-4-thread-1] n.schmizz.sshj.transport.TransportImpl   : Server identity string: SSH-2.0-OpenSSH_7.1p2-hpn14v10
    2016-03-18 14:28:53.113 DEBUG 42561 --- [pool-4-thread-1] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_KEXINIT
    2016-03-18 14:28:53.116 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_KEXINIT
    2016-03-18 14:28:53.116 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Negotiated algorithms: [ kex=curve25519-sha256@libssh.org; sig=ecdsa-sha2-nistp256; c2sCipher=aes128-ctr; s2cCipher=aes128-ctr; c2sMAC=hmac-sha1; s2cMAC=hmac-sha1; c2sComp=none; s2cComp=none ]
    2016-03-18 14:28:53.117 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Sending SSH_MSG_KEXDH_INIT
    2016-03-18 14:28:53.338 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received kex followup data
    2016-03-18 14:28:53.338 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Received SSH_MSG_KEXDH_REPLY

...

    2016-03-18 14:28:53.339 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_NEWKEYS
    2016-03-18 14:28:53.339 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_NEWKEYS
    2016-03-18 14:28:53.340 DEBUG 42561 --- [pool-4-thread-1] net.schmizz.sshj.SSHClient               : Key exchange took 0.227 seconds
    2016-03-18 14:28:53.341 DEBUG 42561 --- [pool-4-thread-1] n.schmizz.sshj.transport.TransportImpl   : Sending SSH_MSG_SERVICE_REQUEST for ssh-userauth
    2016-03-18 14:28:53.344 DEBUG 42561 --- [pool-4-thread-1] n.schmizz.sshj.transport.TransportImpl   : Setting active service to ssh-userauth
    2016-03-18 14:28:53.344 DEBUG 42561 --- [pool-4-thread-1] net.schmizz.sshj.userauth.UserAuthImpl   : Trying `publickey` auth...
    2016-03-18 14:28:53.344 DEBUG 42561 --- [pool-4-thread-1] n.s.sshj.userauth.method.AuthPublickey   : Attempting 
    authentication using PKCS8KeyFile{resource=[PrivateKeyFileResource] ...}
    2016-03-18 14:28:53.425 DEBUG 42561 --- [         reader] net.schmizz.sshj.userauth.UserAuthImpl   : Asking `publickey` method to handle USERAUTH_60 packet
    2016-03-18 14:28:53.425 DEBUG 42561 --- [         reader] n.s.sshj.userauth.method.AuthPublickey   : Key acceptable, sending signed request
    2016-03-18 14:28:53.425 DEBUG 42561 --- [         reader] n.s.sshj.userauth.method.AuthPublickey   : Attempting 
    authentication using PKCS8KeyFile{resource=[PrivateKeyFileResource] ...}
    2016-03-18 14:28:53.824 DEBUG 42561 --- [pool-4-thread-1] net.schmizz.sshj.userauth.UserAuthImpl   : `publickey` auth successful
    2016-03-18 14:28:53.824 DEBUG 42561 --- [pool-4-thread-1] n.schmizz.sshj.transport.TransportImpl   : Setting active service to ssh-connection
    2016-03-18 14:28:53.824 DEBUG 42561 --- [pool-4-thread-1] n.s.sshj.connection.ConnectionImpl       : Attaching `session` channel (#0)
    2016-03-18 14:28:58.538 ERROR 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Dying because - {}

    java.lang.NullPointerException: null
        at net.schmizz.sshj.userauth.UserAuthImpl.handle(UserAuthImpl.java:134) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

    2016-03-18 14:28:58.538  INFO 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Disconnected - UNKNOWN
    2016-03-18 14:28:58.538 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Got notified of net.schmizz.sshj.common.SSHException
    2016-03-18 14:28:58.539 DEBUG 42561 --- [         reader] n.s.sshj.connection.ConnectionImpl       : Notified of net.schmizz.sshj.common.SSHException
    2016-03-18 14:28:58.539 DEBUG 42561 --- [         reader] n.s.s.c.channel.direct.SessionChannel    : Channel #0 got notified of net.schmizz.sshj.common.SSHException
    2016-03-18 14:28:58.539 DEBUG 42561 --- [         reader] n.s.sshj.connection.ConnectionImpl       : Forgetting `session` channel (#0)
    2016-03-18 14:28:58.539 ERROR 42561 --- [pool-4-thread-1] net.schmizz.concurrent.Promise           : <<chan#0 / open>> woke to: net.schmizz.sshj.connection.ConnectionException
    2016-03-18 14:28:58.539 DEBUG 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Setting active service to null-service
    2016-03-18 14:28:58.539 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.Reader        : Stopping
    2016-03-18 14:28:58.539 ERROR 42561 --- [     keep-alive] n.schmizz.sshj.transport.TransportImpl   : Dying because - {}

    java.lang.InterruptedException: sleep interrupted
        at java.lang.Thread.sleep(Native Method) ~[na:1.8.0_74]
        at net.schmizz.keepalive.KeepAlive.run(KeepAlive.java:66) ~[sshj-0.15.0.jar:na]

    2016-03-18 14:28:58.539  INFO 42561 --- [     keep-alive] n.schmizz.sshj.transport.TransportImpl   : Disconnected - UNKNOWN
    2016-03-18 14:28:58.539 DEBUG 42561 --- [     keep-alive] net.schmizz.sshj.transport.KeyExchanger  : Got notified of net.schmizz.sshj.common.SSHException: sleep interrupted
    2016-03-18 14:28:58.539 DEBUG 42561 --- [     keep-alive] n.s.s.t.TransportImpl$NullService        : Notified of net.schmizz.sshj.common.SSHException: sleep interrupted
    2016-03-18 14:28:58.539 DEBUG 42561 --- [     keep-alive] n.schmizz.sshj.transport.TransportImpl   : Setting active service to null-service

    java.util.concurrent.ExecutionException: net.schmizz.sshj.connection.ConnectionException
        ...
    Caused by: net.schmizz.sshj.connection.ConnectionException: null
        at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:32) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.connection.ConnectionException$1.chain(ConnectionException.java:26) ~[sshj-0.15.0.jar:na]
        at net.schmizz.concurrent.Promise.deliverError(Promise.java:95) ~[sshj-0.15.0.jar:na]
        at net.schmizz.concurrent.Event.deliverError(Event.java:72) ~[sshj-0.15.0.jar:na]
        at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(ErrorDeliveryUtil.java:34) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.connection.channel.AbstractChannel.notifyError(AbstractChannel.java:218) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.connection.channel.direct.SessionChannel.notifyError(SessionChannel.java:229) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.common.ErrorNotifiable$Util.alertAll(ErrorNotifiable.java:35) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.connection.ConnectionImpl.notifyError(ConnectionImpl.java:262) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:597) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:68) ~[sshj-0.15.0.jar:na]
    Caused by: net.schmizz.sshj.common.SSHException: null
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:36) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.common.SSHException$1.chain(SSHException.java:29) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:591) ~[sshj-0.15.0.jar:na]
        ... 1 common frames omitted
    Caused by: java.lang.NullPointerException: null
        at net.schmizz.sshj.userauth.UserAuthImpl.handle(UserAuthImpl.java:134) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

SSHException: Unexpected: SSH_MSG_UNIMPLEMENTED-Case:

    2016-03-18 14:36:05.729  INFO 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Client identity string: SSH-2.0-SSHJ_0_14_0
    2016-03-18 14:36:05.821  INFO 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Server identity string: SSH-2.0-OpenSSH_7.1p2-hpn14v10
    2016-03-18 14:36:05.821 DEBUG 42561 --- [pool-7-thread-1] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_KEXINIT
    2016-03-18 14:36:05.830 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_KEXINIT
    2016-03-18 14:36:05.830 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Negotiated algorithms: [ kex=curve25519-sha256@libssh.org; sig=ecdsa-sha2-nistp256; c2sCipher=aes128-ctr; s2cCipher=aes128-ctr; c2sMAC=hmac-sha1; s2cMAC=hmac-sha1; c2sComp=none; s2cComp=none ]
    2016-03-18 14:36:05.830 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Sending SSH_MSG_KEXDH_INIT
    2016-03-18 14:36:05.917 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received kex followup data
    2016-03-18 14:36:05.917 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Received SSH_MSG_KEXDH_REPLY
    2016-03-18 14:36:05.917 DEBUG 42561 --- [         reader] net.schmizz.sshj.common.KeyType$3        : Key algo: ecdsa-sha2-nistp256, Key curve: nistp256, Key Len: 65, 0x04: 4

...

    2016-03-18 14:36:07.745 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_NEWKEYS
    2016-03-18 14:36:07.745 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_NEWKEYS
    2016-03-18 14:36:07.745 DEBUG 42561 --- [pool-7-thread-1] net.schmizz.sshj.SSHClient               : Key exchange took 0.23 seconds
    2016-03-18 14:36:07.746 DEBUG 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Sending SSH_MSG_SERVICE_REQUEST for ssh-userauth
    2016-03-18 14:36:07.749 DEBUG 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Setting active service to ssh-userauth
    2016-03-18 14:36:07.749 DEBUG 42561 --- [pool-7-thread-1] net.schmizz.sshj.userauth.UserAuthImpl   : Trying `publickey` auth...
    2016-03-18 14:36:07.749 DEBUG 42561 --- [pool-7-thread-1] n.s.sshj.userauth.method.AuthPublickey   : Attempting authentication using PKCS8KeyFile{resource=[PrivateKeyFileResource] ...}
    2016-03-18 14:36:07.832 DEBUG 42561 --- [         reader] net.schmizz.sshj.userauth.UserAuthImpl   : Asking `publickey` method to handle USERAUTH_60 packet
    2016-03-18 14:36:07.832 DEBUG 42561 --- [         reader] n.s.sshj.userauth.method.AuthPublickey   : Key acceptable, sending signed request
    2016-03-18 14:36:07.832 DEBUG 42561 --- [         reader] n.s.sshj.userauth.method.AuthPublickey   : Attempting authentication using PKCS8KeyFile{resource=[PrivateKeyFileResource] ...}
    2016-03-18 14:36:11.247 DEBUG 42561 --- [         reader] net.schmizz.sshj.userauth.UserAuthImpl   : Asking `publickey` method to handle GLOBAL_REQUEST packet
    2016-03-18 14:36:11.247 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_KEXINIT
    2016-03-18 14:36:11.247 ERROR 42561 --- [pool-7-thread-1] net.schmizz.concurrent.Promise           : <<authenticated>> woke to: net.schmizz.sshj.userauth.UserAuthException: Unknown packet received during publickey auth: GLOBAL_REQUEST
    2016-03-18 14:36:11.247 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_KEXINIT
    2016-03-18 14:36:11.247 DEBUG 42561 --- [pool-7-thread-1] net.schmizz.sshj.userauth.UserAuthImpl   : Trying `publickey` auth...
    2016-03-18 14:36:11.247 DEBUG 42561 --- [pool-7-thread-1] n.s.sshj.userauth.method.AuthPublickey   : Attempting authentication using PKCS8KeyFile{resource=[PrivateKeyFileResource] ...}
    2016-03-18 14:36:11.247 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Negotiated algorithms: [ kex=curve25519-sha256@libssh.org; sig=ecdsa-sha2-nistp256; c2sCipher=aes128-ctr; s2cCipher=aes128-ctr; c2sMAC=hmac-sha1; s2cMAC=hmac-sha1; c2sComp=none; s2cComp=none ]
    2016-03-18 14:36:11.248 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Sending SSH_MSG_KEXDH_INIT
    2016-03-18 14:36:11.352 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received kex followup data
    2016-03-18 14:36:11.352 DEBUG 42561 --- [         reader] n.s.sshj.transport.kex.Curve25519SHA256  : Received SSH_MSG_KEXDH_REPLY
    2016-03-18 14:36:11.352 DEBUG 42561 --- [         reader] net.schmizz.sshj.common.KeyType$3        : Key algo: ecdsa-sha2-nistp256, Key curve: nistp256, Key Len: 65, 0x04: 4
    x: [20, 108, 121, 78, 33, -20, -21, 59, -115, 6, -49, -14, -55, -88, 31, -103, -105, 3, -16, 105, 107, 46, 87, 44, 63, -79, 75, 87, 10, -100, 20, -62]
    y: [-83, -48, -49, 105, -117, 74, 7, 110, 29, 64, -101, 126, -7, -45, -61, 105, -7, -35, -104, 117, 74, -47, -77, 125, 16, -126, -128, -11, -90, 119, -53, 81]
    2016-03-18 14:36:11.353 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Trying to verify host key with net.schmizz.sshj.transport.verification.OpenSSHKnownHosts@190b87c5
    2016-03-18 14:36:11.353 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Trying to verify host key with net.schmizz.sshj.transport.verification.OpenSSHKnownHosts@17cc7a94
    2016-03-18 14:36:11.353 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Trying to verify host key with de.uni_muenster.cs.comsys.tbmgmt.experiment_control.support.SSHClientUtils$$Lambda$55/1535928681@556a8db4
    2016-03-18 14:36:11.354 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Sending SSH_MSG_NEWKEYS
    2016-03-18 14:36:11.354 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Received SSH_MSG_NEWKEYS
    2016-03-18 14:36:11.376 DEBUG 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Received SSH_MSG_UNIMPLEMENTED #9
    2016-03-18 14:36:11.376 ERROR 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Dying because - {}

    net.schmizz.sshj.common.SSHException: Unexpected: SSH_MSG_UNIMPLEMENTED
        at net.schmizz.sshj.AbstractService.notifyUnimplemented(AbstractService.java:63) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.gotUnimplemented(TransportImpl.java:575) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:506) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

    2016-03-18 14:36:11.376  INFO 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Disconnected - PROTOCOL_ERROR
    2016-03-18 14:36:11.376 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.KeyExchanger  : Got notified of net.schmizz.sshj.common.SSHException: [PROTOCOL_ERROR] Unexpected: SSH_MSG_UNIMPLEMENTED
    2016-03-18 14:36:11.376 DEBUG 42561 --- [         reader] net.schmizz.sshj.userauth.UserAuthImpl   : Notified of net.schmizz.sshj.common.SSHException: [PROTOCOL_ERROR] Unexpected: SSH_MSG_UNIMPLEMENTED
    2016-03-18 14:36:11.376 DEBUG 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Setting active service to null-service
    2016-03-18 14:36:11.376 DEBUG 42561 --- [         reader] n.schmizz.sshj.transport.TransportImpl   : Sending SSH_MSG_DISCONNECT: reason=[PROTOCOL_ERROR], msg=[Unexpected: SSH_MSG_UNIMPLEMENTED]
    2016-03-18 14:36:11.377 ERROR 42561 --- [pool-7-thread-1] net.schmizz.concurrent.Promise           : <<authenticated>> woke to: net.schmizz.sshj.userauth.UserAuthException: Unexpected: SSH_MSG_UNIMPLEMENTED
    2016-03-18 14:36:11.377 DEBUG 42561 --- [         reader] net.schmizz.sshj.transport.Reader        : Stopping
    2016-03-18 14:36:11.377  INFO 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Disconnected - BY_APPLICATION
    2016-03-18 14:36:11.377 DEBUG 42561 --- [pool-7-thread-1] n.s.s.t.TransportImpl$NullService        : Notified of net.schmizz.sshj.transport.TransportException: [BY_APPLICATION] Disconnected
    2016-03-18 14:36:11.377 DEBUG 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Sending SSH_MSG_DISCONNECT: reason=[BY_APPLICATION], msg=[]
    2016-03-18 14:36:11.377 DEBUG 42561 --- [pool-7-thread-1] n.schmizz.sshj.transport.TransportImpl   : Error writing packet: net.schmizz.sshj.transport.TransportException: Socket closed
    2016-03-18 14:36:11.379  WARN 42561 --- [pool-3-thread-1] d.u.c.c.t.e.impl.ExperimentExecutor      : experiment: 39 -> Cancelling experiment 39 due to exception: java.util.concurrent.ExecutionException: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods

    java.util.concurrent.ExecutionException: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods
    ...
    Caused by: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods
        at net.schmizz.sshj.SSHClient.auth(SSHClient.java:232) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.SSHClient.authPublickey(SSHClient.java:331) ~[sshj-0.15.0.jar:na]
        at de.uni_muenster.cs.comsys.tbmgmt.experiment_control.support.SSHClientUtils.clientFor(SSHClientUtils.java:112) ~[classes/:na]
        at de.uni_muenster.cs.comsys.tbmgmt.experiment_control.impl.ExperimentExecutor.getSSHClient(ExperimentExecutor.java:125) ~[classes/:na]
        at de.uni_muenster.cs.comsys.tbmgmt.experiment_control.impl.ExperimentExecutor.sftpConnectionTo(ExperimentExecutor.java:164) ~[classes/:na]
        at de.uni_muenster.cs.comsys.tbmgmt.experiment_control.impl.executionSteps.OutputEvaluator.lambda$0(OutputEvaluator.java:142) ~[classes/:na]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_74]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_74]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_74]
        ... 3 common frames omitted
    Caused by: net.schmizz.sshj.userauth.UserAuthException: Unexpected: SSH_MSG_UNIMPLEMENTED
        at net.schmizz.sshj.userauth.UserAuthException$1.chain(UserAuthException.java:33) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.userauth.UserAuthException$1.chain(UserAuthException.java:26) ~[sshj-0.15.0.jar:na]
        at net.schmizz.concurrent.Promise.deliverError(Promise.java:95) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.userauth.UserAuthImpl.notifyError(UserAuthImpl.java:151) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.die(TransportImpl.java:597) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:68) ~[sshj-0.15.0.jar:na]
    Caused by: net.schmizz.sshj.common.SSHException: Unexpected: SSH_MSG_UNIMPLEMENTED
        at net.schmizz.sshj.AbstractService.notifyUnimplemented(AbstractService.java:63) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.gotUnimplemented(TransportImpl.java:575) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:506) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:107) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Decoder.received(Decoder.java:175) ~[sshj-0.15.0.jar:na]
        at net.schmizz.sshj.transport.Reader.run(Reader.java:60) ~[sshj-0.15.0.jar:na]

I would presume that you don't expect the server to send a message on it's own directly after the authentication is done and then it matters how far the process in net.schmizz.sshj.userauth.UserAuthImpl#authenticate runs before the transport-thread receives the message.

public boolean authenticate(String username, Service nextService, AuthMethod method, int timeoutMs)
        throws UserAuthException, TransportException {
    final boolean outcome;

    authenticated.lock();
    try {
        super.request(); // Request "ssh-userauth" service (if not already active)

        currentMethod = method;
        currentMethod.init(makeAuthParams(username, nextService));
        authenticated.clear();
        log.debug("Trying `{}` auth...", method.getName());
        currentMethod.request();
        outcome = authenticated.retrieve(timeoutMs, TimeUnit.MILLISECONDS);

        if (outcome) {
            log.debug("`{}` auth successful", method.getName());
            trans.setAuthenticated(); // So it can put delayed compression into force if applicable
            trans.setService(nextService); // We aren't in charge anymore, next service is
        } else {
            log.debug("`{}` auth failed", method.getName());
        }

    } finally {
        currentMethod = null;
        authenticated.unlock();
    }

    return outcome;
}

More common case seems to be the NPE as usually the locks prevent the transport-layer from passing the message unto currentMethod in time. I guess the easiest solution would be to make net.schmizz.sshj.userauth.UserAuthImpl#handle forward all requests to nextService once the authentication is done by flipping a switch in case USERAUTH_SUCCESS of UserAuthImpl#handle.

Hi @TheConstructor,

Yes, I was looking at the same piece of code, it seems like a nasty race condition, not the first one I've solved today ;). Thanks for attaching the logs.

Hi @TheConstructor,

I think I've fixed this, could you see whether you can still reproduce this with a latest snapshot. I have unfortunately not had time yet to setup a testing box myself.

Ok, checked and verified with an Debian Stretch VM with OpenSSH 7.2p2. The fix fixes the race condition. Thanks for reporting this!

Thanks for fixing! Any idea when 0.16.0 will be released?