severe error in SSH session key recovery patch
Matt Power
mhpower at bos.bindview.com
Sat Feb 10 06:38:02 EST 2001
http://www.core-sdi.com/advisories/ssh1_sessionkey_recovery.htm
includes the line of code:
kill(SIGALRM, getppid());
This is contained within what is listed as an "unsupported and
untested patch" developed by SSH.com.
The problem is that the arguments to "kill" are in the wrong order. In
other words, to obtain the effect that was apparently intended, the
line of code should have been
kill(getppid(), SIGALRM);
One effect is that the patch does not, in any way, help reduce the
risks associated with the session key recovery vulnerability, since
the parent process will not receive an ALRM signal and thus will not
regenerate a server key. The other possible effect is that there might
be a process whose pid is equal to the numerical value of SIGALRM, and
the value of getppid() might be a signal number that, if sent, would
have an adverse effect on that process and consequently an adverse
effect on system stability. (The call to "kill" is fine in the rare
case where SIGALRM and getppid() happen to be numerically equal.)
(This posting is intended to point out the error in the "kill" line of
that patch; it is not intended to provide a recommendation that the
patch be used if the "kill" line is corrected.)
To determine whether the corrected patch seems appropriate for one's
intended application, here are a few other factors to consider:
-- if sshd is run from tcpserver (see
http://cr.yp.to/ucspi-tcp/tcpserver.html) using a command line
such as "tcpserver 0 ssh /usr/local/sbin/sshd -i", the
"kill(getppid(), SIGALRM);" will cause the tcpserver process to
terminate. Unless another process exists that will automatically
restart that tcpserver process, access to the system via ssh will
be no longer available. There may be a version of inetd or an
inetd derivative that will also terminate upon receiving an ALRM
signal. However, it is commonly the case that an inetd process
will not terminate if it receives an ALRM signal.
It happens to be the case that the patch involving
"kill(getppid(), SIGALRM);" is not needed if sshd is run from
either tcpserver or inetd. Still, some organizations may be
deploying a version of sshd with this patch onto systems where
tcpserver is used, especially if they are using an sshd package
that was put together without this tcpserver issue in mind.
It is not a bug in tcpserver that the process terminates when
it receives an ALRM signal. Any "normal" program started by
tcpserver will not be sending an ALRM signal to getppid(), so
one shouldn't expect the design of tcpserver to anticipate that.
Running an sshd supporting SSH protocol 1.5 from inetd/tcpserver
rather than standalone is a tradeoff between DoS concerns and
session-key-recovery concerns. The right decision will not be
the same in all environments.
-- With the patch, the lifespan of the server key still does not go
below one minute. As mentioned in CORE SDI's advisory, the number
of server connections necessary to carry out the attack is
normally very large but "the number of connections given is for
the average case and specifics cases will fall below the
average". This suggests that is not entirely out of the question
for the attack to succeed within one minute. If that risk is not
appropriate in one's environment, then other measures (which may
include inetd/tcpserver but may also include desupporting use of
SSH protocol 1.5) are needed.
Matt Power
BindView Corporation, RAZOR Team
mhpower at bos.bindview.com
More information about the openssh-unix-dev
mailing list