6063371 2001-02-07 22:38 +0100 /578 rader/ Kent Engström <kent@unit.liu.se> Sänt av: kent@unit.liu.se Importerad: 2001-02-07 22:38 av Brevbäraren (som är implementerad i) Python Ärende: Re: [CORE SDI ADVISORY] SSH1 session key recovery vulnerability ------------------------------------------------------------ Från BUGTRAQ. Det här är kanske inte ett jättehot från skriptkiddisarna idag, kanske inte ens från lite mer seriösa crackers ens, men hål i SSH ska det bara inte finnas! Rekommenderade åtgärder: - Uppgradera till OpenSSH 2.3.0 som inte ska vara känslig tack vare "MaxStartups" som har defalt "10". - När nästa version av OpenSSH kommer och fixar denna bugg mera direkt: uppgradera till den. Det mesta jobbet med att uppgradera till OpenSSH från andra SSH-versioner har ni ju redan gjort då. Iván Arce <core.lists.bugtraq@CORE-SDI.COM> writes: > CORE SDI > http://www.core-sdi.com > SSH protocol 1.5 session key recovery vulnerability > > > Date Published: 2001-02-07 > > Advisory ID: CORE-20010116 > > Bugtraq ID: 2344 > > CVE CAN: Not currently assigned. > > Title: Session Key recovery in SSH protocol 1.5 > > Class: Design/implementation error > > Remotely Exploitable: Yes > > Locally Exploitable: Yes > > Release Mode: USER RELEASE > > Vulnerability Description: > > SSH is a widely used client-server application for authentication > and encryption of network communications. In order to ensure that all > data exchanged between client and server is kept confidential a > symmetric algorithm is used with a key obtained from the key exchange > and authentication process done upon connection from the client to > an SSH server. > A would be attacker could obtain and store all the encrypted packets > belonging to a specific client-server connection but that would > provide no real value unless she is able to: > > . Decrypt them without having the session key used for the encryption > This is equivalent to breaking the crypto algorithm used. > > or > > . Exploit some design or implementation problem on either client or > server to obtain the session key and the proceed to decrypt the > stored session using any implementation of the crypto algorithm > used. > > This advisory describes a vulnerability in the SSH 1.5 protocol > that allows an attacker to do the later. > > The key exchange in SSH protocol 1.5 uses PKCS#1_1.5 public key > encryption standard to make the key exchange between client and > server upon connection. > > An attack (see [1] and [2]) discovered by David Bleichenbacher > on PKCS#1_1.5 can be exploited to recover arbitrary session keys. > > Combining Bleichenbacher's attack with a timing attack designed > to obtain information about crypto operations performed on a > SSH server it is possible to obtain a session key for an SSH > session and therefore decrypt it or even alter it if it is > still active. > > Vulnerable Packages/Systems: > > All versions of SSH supporting the protocol 1.5 key exchange. > This vulnerability applies to SSH servers only. > > See the following section for vendor specific information. > > > Solution/Vendor Information/Workaround: > > OpenSSH > The vulnerability is present in OpenSSH up to version 2.3.0, > although it is not possible to exploit it due to limits imposed > on the number of simultaneous connections the server is allowed > to handle, > Nonetheless, Markus Friedl of OpenSSH.com has produced a patch that > sets a random session key if RSA operations on the session key sent by > the client fail. This effectively solves the problem by closing the > oracle that leaks information. > The patch was integrated to the OpenSSH source tree on January 29, 2001 > > AppGate > The default configuration of the AppGate server is not > vulnerable since it has SSH-1 support disabled. However it > is possible for administrators to enable SSH-1 backwards > compatibility to be able to use legacy clients. Those customers > should apply the patches we have prepared. Patches can be > downloaded from the AppGate support web or requested from > support@appgate.com > > Mindbright > The Mindbright ssh1-server is only an experimental product and > we are not aware of anybody actually using it, it has never been > sold or available as a separate entity. Since it is written in > java it will need a really extreme machine to be able to handle > the load needed to exploit this vulnerability. Anybody who feels > that they need a patch for it is welcome to contact > mindbright@mindbright.se. > > SSH.com > ssh-1 up to version 1.2.31 is vulnerable. > The official response from SSH.com follows: > > -SSH1 is deprecated and SSH.com does not support it > anymore, the official response is upgrade to SSH2 > -The SSH1 compatibility code built into SSH-2.4.0 always executes a > fresh copy of SSHD1, which causes the server key to be regenerated > for every connection. Thus, the attack is not at all feasible when > using SSH1 with an SSH2 server in compatibility mode. > Ssh-2.4.0 also includes code for limiting the maximum number of > simultaneous connections. The maximum is controlled by the > MaxConnections flag in /etc/ssh2/sshd2_config or with the > --with-ssh-connection-limit=<limit> compile-time configure option. > However, as noted, the limit is not required for protection when using > SSH1 with SSHD2 in compatibility mode. > -The following unsupported and untested patch can be applied to > ssh-1.2.31 and earlier. It addresses the problem by regenerating the > server key when the RSA operations fail. This is done at a rate of > at most one key regeneration per minute to avoid possible DoS attacks. > > -------------- cut here ---------------------------------------------- > > --- rsaglue.c 1999/12/10 23:27:25 1.8 > +++ rsaglue.c 2001/02/03 09:42:05 > @@ -264,7 +268,15 @@ > mpz_clear(&aux); > > if (value[0] != 0 || value[1] != 2) > - fatal("Bad result from rsa_private_decrypt"); > + { > + static time_t last_kill_time = 0; > + if (time(NULL) - last_kill_time > 60 && getppid() != 1) > + { > + last_kill_time = time(NULL); > + kill(SIGALRM, getppid()); > + } > + fatal("Bad result from rsa_private_decrypt"); > + } > > for (i = 2; i < len && value[i]; i++) > ; > > -------------- cut here --------------------------------------------- > > LSH > Not vulnerable. Does not support protocol version 1 > > Cisco Systems, F-Secure, other SSH server vendors > No information provided. > > Additionally, advisories and information on security issues > in SSH can be obtained from: > > http://www.core-sdi.com/advisories/buffer_over_ing.htm > http://www.core-sdi.com/advisories/ssh-advisory.htm > http://www.core-sdi.com/bid/1949 > http://www.core-sdi.com/bid/1426 > http://www.core-sdi.com/bid/1323 > http://www.core-sdi.com/bid/1006 > http://www.core-sdi.com/bid/843 > http://www.core-sdi.com/bid/660 > > Vendor notified on: 2001-01-16 > > Credits: > > This vulnerability was found and researched by Ariel Waissbein > and Agustin Azubel of CORE SDI, Buenos Aires, Argentina. > > This advisory was drafted with the help of the SecurityFocus.com > Vulnerability Help Team. For more information or assistance drafting > advisories please mail vulnhelp@securityfocus.com. > > This and other CORE SDI security advisories can be obtained from: > > http://www.core-sdi.com/english/publications.html > > > Technical Description - Exploit/Concept Code: > > In Section 1 we introduce the SSH1 key exchange, in Section 2 we > introduce the attack, finally in Section 3 we discuss the attack's > feasibility and argue why it is insecure to continue using > this protocol. > > 1) SSH1 KEY-EXCHANGE PROTOCOL DESCRIPTION: > > 1.1.- The keys. > > Each host has a host unique permanent RSA key set which > identifies it. A host is a SSH server (referenced as server), > which runs the 'sshd' daemon or a SSH client (referenced as client) > which runs the 'ssh' client program. > The length of the host key is by default 1024 bits. > > Each server has its own server RSA key set which is automatically > generated after a specified timeout (1 hour by default). This > key set is never saved in any file. The length of this key is by > default 768 bits. In every client-to-server connection, a 256 bits > session key is generated by the client using pseudo-random data > provided by the same client. > This session key will be used in a symmetric algorithm (e.g. DES, > Blowfish, 3DES) to encrypt the data flow on the connected channel > after the key exchange is completed. > > To send the session key over an insecure channel to the server, > it is encrypted by the client with the server key and the server host > key together with other data using an asymmetric encryption algorithm > (RSA-PKCS #1 1.5) as we explain in Subsection 1.4. The purpose > of the two separate server keys is to make it impossible to decrypt > a captured session by breaking into the server machine and getting access > to the server key at a later time; one hour after the connection start > not even the server machine can decipher the session key! > > 1.2.- Initiating a connection. > > Whenever a client connects to the server, the daemon forks. The parent > stays in a loop waiting to accept more connections and the child manages > the accepted connection. Before authenticating both endpoints, they do > an identification exchange. > > 1.3.- The identification exchange. > > First, the server sends a formatted string to the client in plaintext, > specifying the protocol supported versions and the server version. > This string looks like "SSH-1.99-OpenSSH_2.3.0", where "1" denotes the > protocol version major number, "99" the protocol version minor number > and "OpenSSH_2.3.0" is the software version of the server. > > If the client does not support the received protocol, it closes the > connection. If the protocol is supported by the client, it responds with > a formatted string of the same plaintext format. The server then checks > the client's response. If the versions do not match or the client > version > is not valid, the server closes the connection. > If the versions do match, the key exchange is started. > > 1.4.- The key exchange. > > The server will send both of its public keys. First the server will fetch > 64 bits from a PRNG, that will be used as a cookie to prevent IP > spoofing attacks and TCP sequence number prediction. This only affects > rhosts authentication. > > The client must send back this cookie when the session key is sent. > This only works against somebody doing IP spoofing from a remote network; > any machine on the local network can still see outgoing packets and catch > the random cookie. > > The server then builds a packet of type SSH_SMSG_PUBLIC_KEY, concatenating > the cookie, the size of the 'n' component of the RSA server key, the 'e' > public exponent of the RSA server key and the modulus 'n' of the RSA serve > r > key (the public RSA server key), the size of the 'n' component of the RSA > host key, the 'e' public exponent of the RSA host key and the modulus 'n' > of the RSA host key (the public RSA host key), the SSH protocol flags, > the supported symmetric ciphers, and the supported authentication methods. > > Once the client has received the SSH_SMSG_PUBLIC_KEY packet, > it computes a session ID in the same way the server > does: > > [mpaux.c:compute_session_id()] > > The session ID is equal to a MD5 hash of the concatenation of > the modulus of the host key of the server, the modulus of the server > key and the server generated cookie. > > session_id := MD5(HostKey_RSAModulus||ServerKey_RSAModulus||Cookie) > > The length of a session_id is the same as the output of the MD5 > function: 128 bits. > > The client generates a session key of 256 bits fetching data from > a PRNG. This key will be the used in a symmetric algorithm to encrypt > all the future flow of this SSH session. > > Before this key is encrypted and sent, the first 128 bits of this key, > are XORed with the session_id. The client then uses the RSA algorithm > (PKCS1 1.5) to encrypt consecutively the XORed session key and > session_id with the server key and host key. > Encryption is made using the smaller key first. > > Finally the client builds a packet containing the symmetric > algorithm to use, the received cookie, the encrypted session key and > the SSH protocol flags and sends it to the server. > > The server receives this packet and retrieves the symmetric algorithm > chosen by the client and checks its compliance sending a > "Warning: client selects unsupported cipher." message if it is not. > > It then checks that the received cookie matches the old cookie sent, > sending another error message if it is not. > > It retrieves the encrypted key, processes the SSH algorithm flags and > decrypts the session key (OpenSSH does an integrity check on the > packet lenght before this). > > We explain this in detail since it is of great interest for our attack. > To do this we introduce the PKCS #1 1.5 encoding. > > 1.5 - PKCS#1 - 1.5 (from rsaglue.c in ssh-1.2.30) > > To send a message m using a RSA public exponent e, with a public > modulus n, the encrypter encodes the message m as > > M := 0x00 || 0x02 || P || 0x00 || m > > > where 0x00 and 0x02 are the value of the first 2 bytes in hexa, > and P is an hexadecimal padding string containing no zero octets. > The ciphertext is: > c := M^e mod (n) . (i.e. M to the e-th power modulo n) > > To recover m, the decrypter calculates c^d, where d is the private > exponent, checks whether the first two bytes are 0x00 and 0x02 > and calls the function fatal() in log-server.c closing the > connection if the check failed. > Otherwise it sets all the data after the second zero as the > message (in case the format is correct this will return m). > > OpenSSH uses OpenSSL which behaves different, see the > RSA_padding_check_PCKS1_type2() function for more details. > > The cleartext for this session key is recovered by checking which > is the bigger public modulus and decrypting first with the key > corresponding to the bigger modulus and secondly with the smaller > one (in case of a tie the server key goes first). This is done > using the rsa_private_decrypt() function. > > When this is done the server computes the session key, and does > a XOR of the decrypted data with the computed session id to obtain > the session key generated by the client. > > Finally the server sets the symmetric encryption scheme and key to > the ones chosen by the client, and sends a packet describing the success > to the client. > > This packet is the first encrypted packet of the flow secured by the > symmetric algorithm. > > > 2) ATTACK DESCRIPTION. > > 2.1.- Bleichenbacher's attack. > > Daniel Bleichenbacher presented an adaptive ciphertext attack to > RSA encryption standard PKCS1_1.5 at the Crypto 98 Conference ([1]), > which on input of a ciphertext c, outputs the cleartext m corresponding > to this ciphertext. > To carry out this attack the attacker needs to make use of a decryption > oracle. As we shall see, this is automatically provided by the RSA > functions used in SSH1 ( or in the OpenSSL library used in > OpenSSH). > > This is the protocol flaw that enables the attack we present. > Specifically, an attacker needs only to access an oracle that will > answer if a string c' calculated by her is or is not PKCS#1_1.5-format > compliant, even less, she only needs to know if it holds true that the > hexadecimal representation of the string (c')^d mod (n) starts with the > octets 0x00 and 0x02 (here d is the private secret exponent and n the > public modulus). > > To decrypt a ciphertext without the private key, the attacker needs to > access to this oracle 2^{20} times (average-time complexity). > This estimation holds true for a 1024 bit key size. > > We shall not explain the attack in detail. To decrypt a ciphertext c > an attacker will need to access the oracle with messages of the type > c.s^e mod (n) > > where e and n are the public exponent and public modulus, and s is > chosen by the attacker algorithm following certain rules. > > We refer to the paper [1] for further details. > In each step of the attack, the attacker finds a collection of intervals > in which the cleartext is contained, first starting with a big interval > of size 2^{1018}=2^{1024-16} and reducing it until a single interval of > size one - whose only member is the cleartext- is left. > > 2.2.- The attack on SSH-1 > > Suppose that we are sniffing a connection between a client and > the server. We can then easily detect when this connection starts and > get the packet containing the encrypted session key. We can then work in > parallel, saving all successive packets exchanged between server and > client, and at the same time attempt a session key decryption with the > attack we present. > > Once the session key is decrypted all the saved encrypted packets sent > between this client and the server can be decrypted in a straight-forward > manner. > > To obtain the session key we will make use of Bleichenbacher's attack > together with a simple timing attack technique. > > Let c := E_{K1}(E_{K2}(K)) denote the captured ciphertext, where K1 > and K2 are the server and host key (the order of these keys does not > alter the way in which the attack is made, since the order can be easily > deduced as we explain in the following section, we suppose without loss of > generality that K1 is the host key and K2 is the server key), K is the > session key or rather the plaintext string containing the session key, and > E_{A}(B) denotes RSA-PKCS1_1.5 encryption of the cleartext B using the > public > key A. The attack is divided in two main steps, > > Firstly the attacker will first attempt to recover E_{K2}(K) from c using > a plain Bleichenbacher attack, and secondly K is calculated by the > attacker > from E_{K2}(K) using a reduction we explain in the next subsection > together > with Bleichenbacher's attack. > > Notice that the calls to the function fatal() can be used as the > needed oracle. > Successful negotiation of a session key will end with > the reception of a SSH_SMSG_SUCCESS packet at the client. A failure > will end with the connection being shutdown due to the calls to the > fatal() function from within the rash_private_decrypt() function. > > An attacker can -prior to the attack- determine what is the > time needed for the server to reach the connection shutdown call in the > fatal() function if the first encryption is not format compliant, and what > is the time needed for the server to reach it if the first encryption is > format compliant and the second encryption is not. This is basically > the way of retrieving answers from the oracle and it implies a timing > attack as well as a few modifications to Bleichenbacher's attack. > > To carry out the attack and recover the session key the host key needs to > remain the same during the attack, we suppose that this is the case and > shall discuss the feasibility of this in the following section. > > Suppose now that E_{K2}(K) is already calculated and known to the > attacker, and call c':=E_{K2}(K). The attacker then uses c' to recover K. > To do this, instead of accessing the oracle with messages of the form > c.s^e mod (n), she will access the oracle with messages of the form > c'.s'^{e'} mod (n'), where c' is defined as c':=E_{K2}(K), and e' and n' > are the second public exponent and modulus (corresponding to E_{K1}(-)), > and s' is chosen following the same rules as defined by Bleichenbacher's > attack. > > > 3. Implementation and Feasibility > > The estimation for the number of times needed to access the oracle on a > adaptive ciphertext Bleichenbacher's attack for a 1024 bits modulus is > approximately 2^{20}, as we said before. This means that the server > should handle about 2^{20} connections to make the first decryption, > i.e. to get E_{K2}(K). After this is done, to recover K, another > adaptive ciphertext attack of the same sort should be carried out, with > presumably less accesses to the oracle --say 2^{19}-- since the second > key is smaller than the first one, to recover K. Hence, to carry out the > attack we present here, an attacker should perform around > (2^{20}+2^{19}) connections to the server during the lifespan of > a server key K (default is one hour) which implies a rate of oracle > queries of around 400/sec. > > Limiting the number of simultaneous connections to the server will > greatly reduce the feasibility of this attack, this is in fact a > standard feature in at least the OpenSSH implementation of SSH-1. > > It is necessary to note that the attacker also needs to perform crypto > operations (RSA encryptions with a small exponent) for each query during > the attack but those are computationally cheaper the ones performed on the > server side. > > This seems to make our attack infeasible for most cases. nonetheless, > high end servers are still a possible target for this attack. It is > also worth mentioning that the number of connections given is for the > average case and specifics cases will fall below the average. > > We follow to discuss other vulnerable cases in which our attack becomes > feasible. > > An issue to be taken into account is the order of the keys K1 and K2, > that is whether K1 is the server key and K2 the host key, or the other > way around. > This issue, we deferred to this section, is of some importance to our > attack. > As we mentioned the order of the keys is changed to K2 for the host key, > and K1 for the server key in case the size of K2 is strictly greater > than K1. > > In that case, the attacker has limited time to recover E_{K2}(K) > (because K1 has a default timeout of one hour), but has an indefinite > amount of time to recover K from E_{K2}(K). This would make the attack > easier since it reduces the initial recovery attack to 2^{20} oracle > queries within an hour > The second phase could be done at a much slower connection rate. > > It might also happen that the public modulus n is much smaller than the > specified values, and this lucky stroke would speed up the attack > considerably. > > Another issue to be taken into account, is when the default settings > for the server key timeout are changed increasing the key lifespan > and thus the time window for the attack. > It is not likely, however, that the default settings for the key size will > be purposely reduced. > > There is also a technology or rather server efficiency issue to be taken > into account. Although the average case of the attack we present seems > infeasible today, this might not be the case for specific attacks that > deviates from the average or for specific attack scenarios en the present > or the near future. > > The conclusion of this report is that although the attack described > might not be a direct threat to the wide audience that relies on SSH1 for > secure network communications, there is, nonetheless an exploitable flaw > in the SSH-1 key exchange protocol that should be either fixed or > addressed during the deployment of SSH as a security component. > > References > > [1] Daniel Bleichenbacher, "Chosen ciphertext attacks on RSA > encryption standard PKCS #1", Advances in Cryptology, > CRYPTO 98. Springer. > > [2] Daniel Bleichenbacher, Burt Kaliski and Jessica Staddon, > "Recent results on PKCS#1: RSA encryption standard ". > RSA Laboratories' Bulletin 7. http://www.rsa.com/rsalabs > > $Id: SSH1-sessionkey-recovery.txt,v 1.9 2001/02/07 18:41:13 iarce Exp $ > > --- > > "Understanding. A cerebral secretion that enables one having it to know > a house from a horse by the roof on the house, > Its nature and laws have been exhaustively expounded by Locke, > who rode a house, and Kant, who lived in a horse." - Ambrose Bierce > > > ==================[ CORE Seguridad de la Informacion S.A. ]========= > Iván Arce > Presidente > PGP Fingerprint: C7A8 ED85 8D7B 9ADC 6836 B25D 207B E78E 2AD1 F65A > email : iarce@core-sdi.com > http://www.core-sdi.com > Florida 141 2do cuerpo Piso 7 > C1005AAG Buenos Aires, Argentina. > Tel/Fax : +(54-11) 4331-5402 > ===================================================================== > > > > > > --- For a personal reply use iarce@core-sdi.com > > -- Kent Engström, Linköping University Incident Response Team kent@unit.liu.se abuse@liu.se +46 13 28 1744 UNIT, Linköping University; SE-581 83 LINKÖPING; SWEDEN (6063371) --------------------------------(Ombruten)