Hi,
I think that I get the same probleme:
- making backup with dump to an ssh-pipe, the stderr output of the dump
command is broken... and may be the data stream (stdout) too...
- using rsync+ssh, the rsync program freeze randomly, while using
rsync+r(em)sh the same process succed.
That a really annoying bug...
freD.
Wout van Albada <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
> I think I encountered a serious bug in ssh 1.2.27. There seems to be
> a race condition where the ssh daemon (sshd) drops data when it has
> to send it over a slow line. I sent this bug report to
> [EMAIL PROTECTED]
> and [EMAIL PROTECTED] on 27/03 but have heard nothing from either so
> far.
>
> I'll try to clarify what happens:
>
> There are two machines, server and client. Both machines run Solaris.
> The client makes an ssh connection to the server to download a file:
>
> server% ls -l /tmp/DATA
> -rw-r--r-- 1 wout staff 200000 Mar 23 11:20 DATA
>
> client% ssh server cat /tmp/DATA > /tmp/DATA
> client% ls -l /tmp/DATA
> -rw-r--r-- 1 wout staff 194560 Mar 24 17:10 /tmp/DATA
>
> This would copy a file '/tmp/DATA' from server to /tmp/DATA on client.
> In this particular case file DATA was 200000 bytes. The size has
> to be larger then the buffers used inside sshd.
>
> When the command is run, most data is sent over the line as it should
> be. However, when the 'cat' process dies, sshd receives a SIGCHLD and
> then fails to read the data left in the pipe to the 'cat' program.
>
> To be more precise, sshd only reads the data left in the pipe to 'cat'
> if it has space for it in the outgoing buffer (the buffer that is used
> to store data going back to the client).
>
> So the following happens (all in serverloop.c):
>
> 1. For a while sshd reads data from the 'cat' command. This data is
> transmitted to the client, where it is put in /tmp/DATA.
> 2. cat writes the final data to the pipe to sshd and exits.
> 3. sshd receives a SIGCHLD and sets child_terminated and
> child_just_terminated to 1.
> 4. sshd falls out of the select() (line 413) it was in
> (it usually receives the signal during the select() call).
> select() returns -1 because it was interrupted by the signal.
> 5. sshd empties readset and writeset (lines 415-422 serverloop.c).
> 6. The if statements on lines 426 and 446 fail.
> 7. sshd does its usual stuff and then calls
> wait_until_can_do_something().
> 8. The call to packet_not_very_much_data_to_write() on line 353
> returns false (because the outgoing buffer contains more than
> 16384 bytes). This causes fdout and fderr not to be set in the
> readset file descriptor set (lines 355-358).
> 9. select() on line 413 returns 0 again (due to slow network
> connection to client). This time the if statement on line
> 426 succeeds (child_just_terminated has been set to 0 earlier).
> 10. Descriptor fdout, fderr and fdin are closed (lines 432-442)
> causing the data available to fdout never being read.
>
> The change I made to fix this is in a patch (diff on original
> serverloop.c and modified serverloop.c) you will find attached
> to this mail. It changes lines 432-439. Instead of blindly closing
> the fdout and fderr descriptors when select() returns 0, it only
> closes them if the fdout_eof and fderr_eof flags have been set,
> respectively. The bug was that the code in lines 426-443 assumed
> that select() always provides information on fdout and fderr, which
> is not the case as they had not been set in the readset.
>
> For completeness, I also attach the 'sshd -d' output for a faulty
> session (original sshd 1.2.27, data is lost) and output for a session
> after having applied my patch.
>
> Please let me know what you make of this.
>
> Wout van Albada
> Software Engineer
>
> [EMAIL PROTECTED]
>
> --- serverloop.c.ORIG Sun Mar 26 13:20:14 2000
> +++ serverloop.c Sun Mar 26 13:25:15 2000
> @@ -429,14 +429,14 @@
> if (cleanup_context)
> pty_cleanup_proc(cleanup_context);
>
> - if (fdout != -1)
> + if (fdout != -1 && fdout_eof) {
> close(fdout);
> - fdout = -1;
> - fdout_eof = 1;
> - if (fderr != -1)
> + fdout = -1;
> + }
> + if (fderr != -1 && fderr_eof) {
> close(fderr);
> - fderr = -1;
> - fderr_eof = 1;
> + fderr = -1;
> + }
> if (fdin != -1)
> close(fdin);
> fdin = -1;
>
> Original sshd 1.2.27 session (server):
>
> 13:39 [wout@dnp2] /usr/local/sbin 18#./sshd1.orig-2000.03.27 -p 5544 -d
> debug: sshd version 1.2.27 [i386-unknown-solaris2.6]
> debug: Initializing random number generator; seed file
> /etc/ssh_random_seed
> log: Server listening on port 5544.
> log: Generating 768 bit RSA key.
> Generating p: ............++ (distance 180)
> Generating q: ....++ (distance 62)
> Computing the keys...
> Testing the keys...
> Key generation complete.
> log: RSA key generation complete.
> debug: Server will not fork when running in debugging mode.
> log: Connection from 194.42.244.44 port 1022
> debug: Client protocol version 1.5; client software version 1.2.27
> debug: Sent 768 bit public key and 1024 bit host key.
> debug: Encryption type: idea
> debug: Received session key; encryption turned on.
> debug: Installing crc compensation attack detector.
> debug: Attempting authentication for wout.
> debug: Trying rhosts with RSA host authentication for wout
> debug: RhostsRSA authentication failed for 'wout', remote 'wout', host \
> 'lisa.365.co.uk'. log: RSA authentication for wout accepted.
> debug: Received request for X11 forwarding with auth spoofing.
> debug: bind port 6010: Address already in use
> debug: Allocated channel 0 of type 1.
> debug: Received authentication agent forwarding request.
> debug: Allocated channel 1 of type 10.
> debug: Executing command 'cat /tmp/DATA'
> debug: Entering interactive session.
> debug: Received SIGCHLD.
> debug: End of interactive session; stdin 0, stdout (read 194560, sent
> 194560), stderr \
> 567 bytes. debug: Command exited with status 0.
> debug: Received exit confirmation.
> log: Closing connection to 194.42.244.44
>
> Corresponding ssh output (client):
>
> 13:39 [wout@lisa] /tmp 32>ssh -v -p 5544 dnp2.football365.co.uk cat
> /tmp/DATA > \
> /tmp/DATA-orig-sshd SSH Version 1.2.27 [sparc-sun-solaris2.7], protocol
> version 1.5.
> Standard version. Does not use RSAREF.
> lisa: Reading configuration data /etc/ssh_config
> lisa: ssh_connect: getuid 1000 geteuid 0 anon 0
> lisa: Connecting to dnp2.football365.co.uk [212.2.1.2] port 5544.
> lisa: Allocated local port 1022.
> lisa: Connection established.
> lisa: Remote protocol version 1.5, remote software version 1.2.27
> lisa: Waiting for server public key.
> lisa: Received server public key (768 bits) and host key (1024 bits).
> lisa: Host 'dnp2.football365.co.uk' is known and matches the host key.
> lisa: Initializing random; seed file /home/wout/.ssh/random_seed
> lisa: Encryption type: idea
> lisa: Sent encrypted session key.
> lisa: Installing crc compensation attack detector.
> lisa: Received encrypted confirmation.
> lisa: Trying rhosts or /etc/hosts.equiv with RSA host authentication.
> lisa: Remote: Rhosts/hosts.equiv authentication refused: client user
> 'wout', server \
> user 'wout', client host 'lisa.365.co.uk'. lisa: Server refused our
> rhosts \
> authentication or host key. lisa: Connection to authentication agent
> opened.
> lisa: Trying RSA authentication via agent with '[EMAIL PROTECTED]'
> lisa: Received RSA challenge from server.
> lisa: Sending response to RSA challenge.
> lisa: Remote: RSA authentication accepted.
> lisa: RSA authentication accepted by server.
> lisa: Failed to get local xauth data.
> lisa: Requesting X11 forwarding with authentication spoofing.
> lisa: Requesting authentication agent forwarding.
> lisa: Sending command: cat /tmp/DATA
> lisa: Entering interactive session.
> log: executing remote command as user wout
> Environment:
> HOME=/homes/home/wout
> USER=wout
> LOGNAME=wout
> PATH=/bin:/usr/bin:/usr/ucb:/usr/bin/X11:/usr/local/bin:/usr/local/bin
> MAIL=/var/mail/wout
> SHELL=/bin/tcsh
> TZ=GB
> SSH_CLIENT=194.42.244.44 1022 5544
> DISPLAY=dnp2.football365.co.uk:11.0
> SSH_AUTH_SOCK=/tmp/ssh-wout/ssh-17388-agent
>
> Running /usr/openwin/bin/xauth add dnp2.football365.co.uk:11.0
> MIT-MAGIC-COOKIE-1 \
> 213d7f173bd7c5698930191fa6ad6f21 Running /usr/openwin/bin/xauth add
> 212.2.1.2:11.0 \
> MIT-MAGIC-COOKIE-1 213d7f173bd7c5698930191fa6ad6f21 lisa: Transferred:
> stdin 0, \
> stdout 195127, stderr 0 bytes in 15.4 seconds lisa: Bytes per second:
> stdin 0.0, \
> stdout 12677.5, stderr 0.0 lisa: Exit status 0
>
> 13:40 [wout@lisa] /tmp 33>ls -l /tmp/DATA-orig-sshd
> -rw-r--r-- 1 wout staff 194560 Mar 27 13:40
> /tmp/DATA-orig-sshd
>
> 13:41 [wout@lisa] /tmp 34>sum
> /tmp/DATA-orig-sshd 11522 \
> 380 /tmp/DATA-orig-sshd
>
> And on server:
>
> 13:43 [wout@dnp2] /usr/local/sbin 20#ls -l /tmp/DATA
> -rw-r--r-- 1 root other 200000 Mar 23 11:20 /tmp/DATA
>
> 13:43 [wout@dnp2] /usr/local/sbin 21#sum /tmp/DATA
> 57919 391 /tmp/DATA
>
> Patched sshd 1.2.27 session (server):
>
> 13:41 [wout@dnp2] /usr/local/sbin 19#./sshd -p 5544 -d
> debug: sshd version 1.2.27 [i386-unknown-solaris2.6]
> debug: Initializing random number generator; seed file
> /etc/ssh_random_seed
> log: Server listening on port 5544.
> log: Generating 768 bit RSA key.
> Generating p: .............++ (distance 218)
> Generating q: ...........++ (distance 196)
> Computing the keys...
> Testing the keys...
> Key generation complete.
> log: RSA key generation complete.
> debug: Server will not fork when running in debugging mode.
> log: Connection from 194.42.244.44 port 1021
> debug: Client protocol version 1.5; client software version 1.2.27
> debug: Sent 768 bit public key and 1024 bit host key.
> debug: Encryption type: idea
> debug: Received session key; encryption turned on.
> debug: Installing crc compensation attack detector.
> debug: Attempting authentication for wout.
> debug: Trying rhosts with RSA host authentication for wout
> debug: RhostsRSA authentication failed for 'wout', remote 'wout', host \
> 'lisa.365.co.uk'. log: RSA authentication for wout accepted.
> debug: Received request for X11 forwarding with auth spoofing.
> debug: bind port 6010: Address already in use
> debug: Allocated channel 0 of type 1.
> debug: Received authentication agent forwarding request.
> debug: Allocated channel 1 of type 10.
> debug: Executing command 'cat /tmp/DATA'
> debug: Entering interactive session.
> debug: Received SIGCHLD.
> debug: End of interactive session; stdin 0, stdout (read 200000, sent
> 200000), stderr \
> 567 bytes. debug: Command exited with status 0.
> debug: Received exit confirmation.
> log: Closing connection to 194.42.244.44
>
> Corresponding ssh output (client):
>
> 13:41 [wout@lisa] /tmp 35>ssh -v -p 5544 dnp2.football365.co.uk cat
> /tmp/DATA > \
> /tmp/DATA-patched-sshd SSH Version 1.2.27 [sparc-sun-solaris2.7],
> protocol version \
> 1.5. Standard version. Does not use RSAREF.
> lisa: Reading configuration data /etc/ssh_config
> lisa: ssh_connect: getuid 1000 geteuid 0 anon 0
> lisa: Connecting to dnp2.football365.co.uk [212.2.1.2] port 5544.
> lisa: Allocated local port 1021.
> lisa: Connection established.
> lisa: Remote protocol version 1.5, remote software version 1.2.27
> lisa: Waiting for server public key.
> lisa: Received server public key (768 bits) and host key (1024 bits).
> lisa: Host 'dnp2.football365.co.uk' is known and matches the host key.
> lisa: Initializing random; seed file /home/wout/.ssh/random_seed
> lisa: Encryption type: idea
> lisa: Sent encrypted session key.
> lisa: Installing crc compensation attack detector.
> lisa: Received encrypted confirmation.
> lisa: Trying rhosts or /etc/hosts.equiv with RSA host authentication.
> lisa: Remote: Rhosts/hosts.equiv authentication refused: client user
> 'wout', server \
> user 'wout', client host 'lisa.365.co.uk'. lisa: Server refused our
> rhosts \
> authentication or host key. lisa: Connection to authentication agent
> opened.
> lisa: Trying RSA authentication via agent with '[EMAIL PROTECTED]'
> lisa: Received RSA challenge from server.
> lisa: Sending response to RSA challenge.
> lisa: Remote: RSA authentication accepted.
> lisa: RSA authentication accepted by server.
> lisa: Failed to get local xauth data.
> lisa: Requesting X11 forwarding with authentication spoofing.
> lisa: Requesting authentication agent forwarding.
> lisa: Sending command: cat /tmp/DATA
> lisa: Entering interactive session.
> log: executing remote command as user wout
> Environment:
> HOME=/homes/home/wout
> USER=wout
> LOGNAME=wout
> PATH=/bin:/usr/bin:/usr/ucb:/usr/bin/X11:/usr/local/bin:/usr/local/bin
> MAIL=/var/mail/wout
> SHELL=/bin/tcsh
> TZ=GB
> SSH_CLIENT=194.42.244.44 1021 5544
> DISPLAY=dnp2.football365.co.uk:11.0
> SSH_AUTH_SOCK=/tmp/ssh-wout/ssh-17462-agent
>
> Running /usr/openwin/bin/xauth add dnp2.football365.co.uk:11.0
> MIT-MAGIC-COOKIE-1 \
> 89baa674c215da2f6c290a8e9442426d Running /usr/openwin/bin/xauth add
> 212.2.1.2:11.0 \
> MIT-MAGIC-COOKIE-1 89baa674c215da2f6c290a8e9442426d lisa: Transferred:
> stdin 0, \
> stdout 200567, stderr 0 bytes in 14.8 seconds lisa: Bytes per second:
> stdin 0.0, \
> stdout 13547.2, stderr 0.0 lisa: Exit status 0
>
> 13:42 [wout@lisa] /tmp 36>ls -l /tmp/DATA-patched-sshd
> -rw-r--r-- 1 wout staff 200000 Mar 27 13:42
> /tmp/DATA-patched-sshd
>
> 13:43 [wout@lisa] /tmp 37>sum /tmp/DATA-patched-sshd
> 57919 391 /tmp/DATA-patched-sshd
>
> And on server:
>
> 13:43 [wout@dnp2] /usr/local/sbin 20#ls -l /tmp/DATA
> -rw-r--r-- 1 root other 200000 Mar 23 11:20 /tmp/DATA
>
> 13:43 [wout@dnp2] /usr/local/sbin 21#sum /tmp/DATA
> 57919 391 /tmp/DATA