]> andersk Git - gssapi-openssh.git/blob - openssh/sshd.c
update patch date to today; prepare for release
[gssapi-openssh.git] / openssh / sshd.c
1 /*
2  * Author: Tatu Ylonen <ylo@cs.hut.fi>
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  * This program is the ssh daemon.  It listens for connections from clients,
6  * and performs authentication, executes use commands or shell, and forwards
7  * information to/from the application to the user client over an encrypted
8  * connection.  This can also handle forwarding of X11, TCP/IP, and
9  * authentication agent connections.
10  *
11  * As far as I am concerned, the code I have written for this software
12  * can be used freely for any purpose.  Any derived versions of this
13  * software must be clearly marked as such, and if the derived work is
14  * incompatible with the protocol description in the RFC file, it must be
15  * called by a name other than "ssh" or "Secure Shell".
16  *
17  * SSH2 implementation:
18  * Privilege Separation:
19  *
20  * Copyright (c) 2000, 2001, 2002 Markus Friedl.  All rights reserved.
21  * Copyright (c) 2002 Niels Provos.  All rights reserved.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the above copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  *
32  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
33  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
35  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
36  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
41  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  */
43
44 #include "includes.h"
45 RCSID("$OpenBSD: sshd.c,v 1.312 2005/07/25 11:59:40 markus Exp $");
46
47 #include <openssl/dh.h>
48 #include <openssl/bn.h>
49 #include <openssl/md5.h>
50 #include <openssl/rand.h>
51 #ifdef HAVE_SECUREWARE
52 #include <sys/security.h>
53 #include <prot.h>
54 #endif
55
56 #include "ssh.h"
57 #include "ssh1.h"
58 #include "ssh2.h"
59 #include "xmalloc.h"
60 #include "rsa.h"
61 #include "sshpty.h"
62 #include "packet.h"
63 #include "log.h"
64 #include "servconf.h"
65 #include "uidswap.h"
66 #include "compat.h"
67 #include "buffer.h"
68 #include "bufaux.h"
69 #include "cipher.h"
70 #include "kex.h"
71 #include "key.h"
72 #include "dh.h"
73 #include "myproposal.h"
74 #include "authfile.h"
75 #include "pathnames.h"
76 #include "atomicio.h"
77 #include "canohost.h"
78 #include "auth.h"
79 #include "misc.h"
80 #include "msg.h"
81 #include "dispatch.h"
82 #include "channels.h"
83 #include "session.h"
84 #include "monitor_mm.h"
85 #include "monitor.h"
86 #include "monitor_wrap.h"
87 #include "monitor_fdpass.h"
88
89 #ifdef GSSAPI
90 #include "ssh-gss.h"
91 #endif
92
93 #ifdef GSSAPI
94 #include <openssl/md5.h>
95 #include "bufaux.h"
96 #endif /* GSSAPI */
97
98 #ifdef LIBWRAP
99 #include <tcpd.h>
100 #include <syslog.h>
101 int allow_severity = LOG_INFO;
102 int deny_severity = LOG_WARNING;
103 #endif /* LIBWRAP */
104
105 #ifndef O_NOCTTY
106 #define O_NOCTTY        0
107 #endif
108
109 /* Re-exec fds */
110 #define REEXEC_DEVCRYPTO_RESERVED_FD    (STDERR_FILENO + 1)
111 #define REEXEC_STARTUP_PIPE_FD          (STDERR_FILENO + 2)
112 #define REEXEC_CONFIG_PASS_FD           (STDERR_FILENO + 3)
113 #define REEXEC_MIN_FREE_FD              (STDERR_FILENO + 4)
114
115 extern char *__progname;
116
117 /* Server configuration options. */
118 ServerOptions options;
119
120 /* Name of the server configuration file. */
121 char *config_file_name = _PATH_SERVER_CONFIG_FILE;
122
123 /*
124  * Debug mode flag.  This can be set on the command line.  If debug
125  * mode is enabled, extra debugging output will be sent to the system
126  * log, the daemon will not go to background, and will exit after processing
127  * the first connection.
128  */
129 int debug_flag = 0;
130
131 /* Flag indicating that the daemon should only test the configuration and keys. */
132 int test_flag = 0;
133
134 /* Flag indicating that the daemon is being started from inetd. */
135 int inetd_flag = 0;
136
137 /* Flag indicating that sshd should not detach and become a daemon. */
138 int no_daemon_flag = 0;
139
140 /* debug goes to stderr unless inetd_flag is set */
141 int log_stderr = 0;
142
143 /* Saved arguments to main(). */
144 char **saved_argv;
145 int saved_argc;
146
147 /* re-exec */
148 int rexeced_flag = 0;
149 int rexec_flag = 1;
150 int rexec_argc = 0;
151 char **rexec_argv;
152
153 /*
154  * The sockets that the server is listening; this is used in the SIGHUP
155  * signal handler.
156  */
157 #define MAX_LISTEN_SOCKS        16
158 int listen_socks[MAX_LISTEN_SOCKS];
159 int num_listen_socks = 0;
160
161 /*
162  * the client's version string, passed by sshd2 in compat mode. if != NULL,
163  * sshd will skip the version-number exchange
164  */
165 char *client_version_string = NULL;
166 char *server_version_string = NULL;
167
168 /* for rekeying XXX fixme */
169 Kex *xxx_kex;
170
171 /*
172  * Any really sensitive data in the application is contained in this
173  * structure. The idea is that this structure could be locked into memory so
174  * that the pages do not get written into swap.  However, there are some
175  * problems. The private key contains BIGNUMs, and we do not (in principle)
176  * have access to the internals of them, and locking just the structure is
177  * not very useful.  Currently, memory locking is not implemented.
178  */
179 struct {
180         Key     *server_key;            /* ephemeral server key */
181         Key     *ssh1_host_key;         /* ssh1 host key */
182         Key     **host_keys;            /* all private host keys */
183         int     have_ssh1_key;
184         int     have_ssh2_key;
185         u_char  ssh1_cookie[SSH_SESSION_KEY_LENGTH];
186 } sensitive_data;
187
188 /*
189  * Flag indicating whether the RSA server key needs to be regenerated.
190  * Is set in the SIGALRM handler and cleared when the key is regenerated.
191  */
192 static volatile sig_atomic_t key_do_regen = 0;
193
194 /* This is set to true when a signal is received. */
195 static volatile sig_atomic_t received_sighup = 0;
196 static volatile sig_atomic_t received_sigterm = 0;
197
198 /* session identifier, used by RSA-auth */
199 u_char session_id[16];
200
201 /* same for ssh2 */
202 u_char *session_id2 = NULL;
203 u_int session_id2_len = 0;
204
205 /* record remote hostname or ip */
206 u_int utmp_len = MAXHOSTNAMELEN;
207
208 /* options.max_startup sized array of fd ints */
209 int *startup_pipes = NULL;
210 int startup_pipe;               /* in child */
211
212 /* variables used for privilege separation */
213 int use_privsep;
214 struct monitor *pmonitor = NULL;
215
216 /* global authentication context */
217 Authctxt *the_authctxt = NULL;
218
219 /* message to be displayed after login */
220 Buffer loginmsg;
221
222 /* Prototypes for various functions defined later in this file. */
223 void destroy_sensitive_data(void);
224 void demote_sensitive_data(void);
225
226 static void do_ssh1_kex(void);
227 static void do_ssh2_kex(void);
228
229 /*
230  * Close all listening sockets
231  */
232 static void
233 close_listen_socks(void)
234 {
235         int i;
236
237         for (i = 0; i < num_listen_socks; i++)
238                 close(listen_socks[i]);
239         num_listen_socks = -1;
240 }
241
242 static void
243 close_startup_pipes(void)
244 {
245         int i;
246
247         if (startup_pipes)
248                 for (i = 0; i < options.max_startups; i++)
249                         if (startup_pipes[i] != -1)
250                                 close(startup_pipes[i]);
251 }
252
253 /*
254  * Signal handler for SIGHUP.  Sshd execs itself when it receives SIGHUP;
255  * the effect is to reread the configuration file (and to regenerate
256  * the server key).
257  */
258 static void
259 sighup_handler(int sig)
260 {
261         int save_errno = errno;
262
263         received_sighup = 1;
264         signal(SIGHUP, sighup_handler);
265         errno = save_errno;
266 }
267
268 /*
269  * Called from the main program after receiving SIGHUP.
270  * Restarts the server.
271  */
272 static void
273 sighup_restart(void)
274 {
275         logit("Received SIGHUP; restarting.");
276         close_listen_socks();
277         close_startup_pipes();
278         execv(saved_argv[0], saved_argv);
279         logit("RESTART FAILED: av[0]='%.100s', error: %.100s.", saved_argv[0],
280             strerror(errno));
281         exit(1);
282 }
283
284 /*
285  * Generic signal handler for terminating signals in the master daemon.
286  */
287 static void
288 sigterm_handler(int sig)
289 {
290         received_sigterm = sig;
291 }
292
293 /*
294  * SIGCHLD handler.  This is called whenever a child dies.  This will then
295  * reap any zombies left by exited children.
296  */
297 static void
298 main_sigchld_handler(int sig)
299 {
300         int save_errno = errno;
301         pid_t pid;
302         int status;
303
304         while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
305             (pid < 0 && errno == EINTR))
306                 ;
307
308         signal(SIGCHLD, main_sigchld_handler);
309         errno = save_errno;
310 }
311
312 /*
313  * Signal handler for the alarm after the login grace period has expired.
314  */
315 static void
316 grace_alarm_handler(int sig)
317 {
318         /* XXX no idea how fix this signal handler */
319
320         if (use_privsep && pmonitor != NULL && pmonitor->m_pid > 0)
321                 kill(pmonitor->m_pid, SIGALRM);
322
323         /* Log error and exit. */
324         fatal("Timeout before authentication for %s", get_remote_ipaddr());
325 }
326
327 /*
328  * Signal handler for the key regeneration alarm.  Note that this
329  * alarm only occurs in the daemon waiting for connections, and it does not
330  * do anything with the private key or random state before forking.
331  * Thus there should be no concurrency control/asynchronous execution
332  * problems.
333  */
334 static void
335 generate_ephemeral_server_key(void)
336 {
337         u_int32_t rnd = 0;
338         int i;
339
340         verbose("Generating %s%d bit RSA key.",
341             sensitive_data.server_key ? "new " : "", options.server_key_bits);
342         if (sensitive_data.server_key != NULL)
343                 key_free(sensitive_data.server_key);
344         sensitive_data.server_key = key_generate(KEY_RSA1,
345             options.server_key_bits);
346         verbose("RSA key generation complete.");
347
348         for (i = 0; i < SSH_SESSION_KEY_LENGTH; i++) {
349                 if (i % 4 == 0)
350                         rnd = arc4random();
351                 sensitive_data.ssh1_cookie[i] = rnd & 0xff;
352                 rnd >>= 8;
353         }
354         arc4random_stir();
355 }
356
357 static void
358 key_regeneration_alarm(int sig)
359 {
360         int save_errno = errno;
361
362         signal(SIGALRM, SIG_DFL);
363         errno = save_errno;
364         key_do_regen = 1;
365 }
366
367 static void
368 sshd_exchange_identification(int sock_in, int sock_out)
369 {
370         u_int i;
371         int mismatch;
372         int remote_major, remote_minor;
373         int major, minor;
374         char *s;
375         char buf[256];                  /* Must not be larger than remote_version. */
376         char remote_version[256];       /* Must be at least as big as buf. */
377
378         if ((options.protocol & SSH_PROTO_1) &&
379             (options.protocol & SSH_PROTO_2)) {
380                 major = PROTOCOL_MAJOR_1;
381                 minor = 99;
382         } else if (options.protocol & SSH_PROTO_2) {
383                 major = PROTOCOL_MAJOR_2;
384                 minor = PROTOCOL_MINOR_2;
385         } else {
386                 major = PROTOCOL_MAJOR_1;
387                 minor = PROTOCOL_MINOR_1;
388         }
389         snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n", major, minor, SSH_VERSION);
390         server_version_string = xstrdup(buf);
391
392         /* Send our protocol version identification. */
393         if (atomicio(vwrite, sock_out, server_version_string,
394             strlen(server_version_string))
395             != strlen(server_version_string)) {
396                 logit("Could not write ident string to %s", get_remote_ipaddr());
397                 cleanup_exit(255);
398         }
399
400         /* Read other sides version identification. */
401         memset(buf, 0, sizeof(buf));
402         for (i = 0; i < sizeof(buf) - 1; i++) {
403                 if (atomicio(read, sock_in, &buf[i], 1) != 1) {
404                         logit("Did not receive identification string from %s",
405                             get_remote_ipaddr());
406                         cleanup_exit(255);
407                 }
408                 if (buf[i] == '\r') {
409                         buf[i] = 0;
410                         /* Kludge for F-Secure Macintosh < 1.0.2 */
411                         if (i == 12 &&
412                             strncmp(buf, "SSH-1.5-W1.0", 12) == 0)
413                                 break;
414                         continue;
415                 }
416                 if (buf[i] == '\n') {
417                         buf[i] = 0;
418                         break;
419                 }
420         }
421         buf[sizeof(buf) - 1] = 0;
422         client_version_string = xstrdup(buf);
423
424         /*
425          * Check that the versions match.  In future this might accept
426          * several versions and set appropriate flags to handle them.
427          */
428         if (sscanf(client_version_string, "SSH-%d.%d-%[^\n]\n",
429             &remote_major, &remote_minor, remote_version) != 3) {
430                 s = "Protocol mismatch.\n";
431                 (void) atomicio(vwrite, sock_out, s, strlen(s));
432                 close(sock_in);
433                 close(sock_out);
434                 logit("Bad protocol version identification '%.100s' from %s",
435                     client_version_string, get_remote_ipaddr());
436                 cleanup_exit(255);
437         }
438         debug("Client protocol version %d.%d; client software version %.100s",
439             remote_major, remote_minor, remote_version);
440
441         compat_datafellows(remote_version);
442
443         if (datafellows & SSH_BUG_PROBE) {
444                 logit("probed from %s with %s.  Don't panic.",
445                     get_remote_ipaddr(), client_version_string);
446                 cleanup_exit(255);
447         }
448
449         if (datafellows & SSH_BUG_SCANNER) {
450                 logit("scanned from %s with %s.  Don't panic.",
451                     get_remote_ipaddr(), client_version_string);
452                 cleanup_exit(255);
453         }
454
455         mismatch = 0;
456         switch (remote_major) {
457         case 1:
458                 if (remote_minor == 99) {
459                         if (options.protocol & SSH_PROTO_2)
460                                 enable_compat20();
461                         else
462                                 mismatch = 1;
463                         break;
464                 }
465                 if (!(options.protocol & SSH_PROTO_1)) {
466                         mismatch = 1;
467                         break;
468                 }
469                 if (remote_minor < 3) {
470                         packet_disconnect("Your ssh version is too old and "
471                             "is no longer supported.  Please install a newer version.");
472                 } else if (remote_minor == 3) {
473                         /* note that this disables agent-forwarding */
474                         enable_compat13();
475                 }
476                 break;
477         case 2:
478                 if (options.protocol & SSH_PROTO_2) {
479                         enable_compat20();
480                         break;
481                 }
482                 /* FALLTHROUGH */
483         default:
484                 mismatch = 1;
485                 break;
486         }
487         chop(server_version_string);
488         debug("Local version string %.200s", server_version_string);
489
490         if (mismatch) {
491                 s = "Protocol major versions differ.\n";
492                 (void) atomicio(vwrite, sock_out, s, strlen(s));
493                 close(sock_in);
494                 close(sock_out);
495                 logit("Protocol major versions differ for %s: %.200s vs. %.200s",
496                     get_remote_ipaddr(),
497                     server_version_string, client_version_string);
498                 cleanup_exit(255);
499         }
500 }
501
502 /* Destroy the host and server keys.  They will no longer be needed. */
503 void
504 destroy_sensitive_data(void)
505 {
506         int i;
507
508         if (sensitive_data.server_key) {
509                 key_free(sensitive_data.server_key);
510                 sensitive_data.server_key = NULL;
511         }
512         for (i = 0; i < options.num_host_key_files; i++) {
513                 if (sensitive_data.host_keys[i]) {
514                         key_free(sensitive_data.host_keys[i]);
515                         sensitive_data.host_keys[i] = NULL;
516                 }
517         }
518         sensitive_data.ssh1_host_key = NULL;
519         memset(sensitive_data.ssh1_cookie, 0, SSH_SESSION_KEY_LENGTH);
520 }
521
522 /* Demote private to public keys for network child */
523 void
524 demote_sensitive_data(void)
525 {
526         Key *tmp;
527         int i;
528
529         if (sensitive_data.server_key) {
530                 tmp = key_demote(sensitive_data.server_key);
531                 key_free(sensitive_data.server_key);
532                 sensitive_data.server_key = tmp;
533         }
534
535         for (i = 0; i < options.num_host_key_files; i++) {
536                 if (sensitive_data.host_keys[i]) {
537                         tmp = key_demote(sensitive_data.host_keys[i]);
538                         key_free(sensitive_data.host_keys[i]);
539                         sensitive_data.host_keys[i] = tmp;
540                         if (tmp->type == KEY_RSA1)
541                                 sensitive_data.ssh1_host_key = tmp;
542                 }
543         }
544
545         /* We do not clear ssh1_host key and cookie.  XXX - Okay Niels? */
546 }
547
548 static void
549 privsep_preauth_child(void)
550 {
551         u_int32_t rnd[256];
552         gid_t gidset[1];
553         struct passwd *pw;
554         int i;
555
556         /* Enable challenge-response authentication for privilege separation */
557         privsep_challenge_enable();
558
559         for (i = 0; i < 256; i++)
560                 rnd[i] = arc4random();
561         RAND_seed(rnd, sizeof(rnd));
562
563         /* Demote the private keys to public keys. */
564         demote_sensitive_data();
565
566         if ((pw = getpwnam(SSH_PRIVSEP_USER)) == NULL)
567                 fatal("Privilege separation user %s does not exist",
568                     SSH_PRIVSEP_USER);
569         memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));
570         endpwent();
571
572         /* Change our root directory */
573         if (chroot(_PATH_PRIVSEP_CHROOT_DIR) == -1)
574                 fatal("chroot(\"%s\"): %s", _PATH_PRIVSEP_CHROOT_DIR,
575                     strerror(errno));
576         if (chdir("/") == -1)
577                 fatal("chdir(\"/\"): %s", strerror(errno));
578
579         /* Drop our privileges */
580         debug3("privsep user:group %u:%u", (u_int)pw->pw_uid,
581             (u_int)pw->pw_gid);
582 #if 0
583         /* XXX not ready, too heavy after chroot */
584         do_setusercontext(pw);
585 #else
586         gidset[0] = pw->pw_gid;
587         if (setgroups(1, gidset) < 0)
588                 fatal("setgroups: %.100s", strerror(errno));
589         permanently_set_uid(pw);
590 #endif
591 }
592
593 static int
594 privsep_preauth(Authctxt *authctxt)
595 {
596         int status;
597         pid_t pid;
598
599         /* Set up unprivileged child process to deal with network data */
600         pmonitor = monitor_init();
601         /* Store a pointer to the kex for later rekeying */
602         pmonitor->m_pkex = &xxx_kex;
603
604         pid = fork();
605         if (pid == -1) {
606                 fatal("fork of unprivileged child failed");
607         } else if (pid != 0) {
608                 debug2("Network child is on pid %ld", (long)pid);
609
610                 close(pmonitor->m_recvfd);
611                 pmonitor->m_pid = pid;
612                 monitor_child_preauth(authctxt, pmonitor);
613                 close(pmonitor->m_sendfd);
614
615                 /* Sync memory */
616                 monitor_sync(pmonitor);
617
618                 /* Wait for the child's exit status */
619                 while (waitpid(pid, &status, 0) < 0)
620                         if (errno != EINTR)
621                                 break;
622                 return (1);
623         } else {
624                 /* child */
625
626                 close(pmonitor->m_sendfd);
627
628                 /* Demote the child */
629                 if (getuid() == 0 || geteuid() == 0)
630                         privsep_preauth_child();
631                 setproctitle("%s", "[net]");
632         }
633         return (0);
634 }
635
636 static void
637 privsep_postauth(Authctxt *authctxt)
638 {
639 #ifdef DISABLE_FD_PASSING
640         if (1) {
641 #else
642         if (authctxt->pw->pw_uid == 0 || options.use_login) {
643 #endif
644                 /* File descriptor passing is broken or root login */
645                 monitor_apply_keystate(pmonitor);
646                 use_privsep = 0;
647                 return;
648         }
649
650         /* Authentication complete */
651         alarm(0);
652         if (startup_pipe != -1) {
653                 close(startup_pipe);
654                 startup_pipe = -1;
655         }
656
657         /* New socket pair */
658         monitor_reinit(pmonitor);
659
660         pmonitor->m_pid = fork();
661         if (pmonitor->m_pid == -1)
662                 fatal("fork of unprivileged child failed");
663         else if (pmonitor->m_pid != 0) {
664                 debug2("User child is on pid %ld", (long)pmonitor->m_pid);
665                 close(pmonitor->m_recvfd);
666                 buffer_clear(&loginmsg);
667                 monitor_child_postauth(pmonitor);
668
669                 /* NEVERREACHED */
670                 exit(0);
671         }
672
673         close(pmonitor->m_sendfd);
674
675         /* Demote the private keys to public keys. */
676         demote_sensitive_data();
677
678         /* Drop privileges */
679         do_setusercontext(authctxt->pw);
680
681         /* It is safe now to apply the key state */
682         monitor_apply_keystate(pmonitor);
683
684         /*
685          * Tell the packet layer that authentication was successful, since
686          * this information is not part of the key state.
687          */
688         packet_set_authenticated();
689 }
690
691 static char *
692 list_hostkey_types(void)
693 {
694         Buffer b;
695         const char *p;
696         char *ret;
697         int i;
698
699         buffer_init(&b);
700         for (i = 0; i < options.num_host_key_files; i++) {
701                 Key *key = sensitive_data.host_keys[i];
702                 if (key == NULL)
703                         continue;
704                 switch (key->type) {
705                 case KEY_RSA:
706                 case KEY_DSA:
707                         if (buffer_len(&b) > 0)
708                                 buffer_append(&b, ",", 1);
709                         p = key_ssh_name(key);
710                         buffer_append(&b, p, strlen(p));
711                         break;
712                 }
713         }
714         buffer_append(&b, "\0", 1);
715         ret = xstrdup(buffer_ptr(&b));
716         buffer_free(&b);
717         debug("list_hostkey_types: %s", ret);
718         return ret;
719 }
720
721 Key *
722 get_hostkey_by_type(int type)
723 {
724         int i;
725
726         for (i = 0; i < options.num_host_key_files; i++) {
727                 Key *key = sensitive_data.host_keys[i];
728                 if (key != NULL && key->type == type)
729                         return key;
730         }
731         return NULL;
732 }
733
734 Key *
735 get_hostkey_by_index(int ind)
736 {
737         if (ind < 0 || ind >= options.num_host_key_files)
738                 return (NULL);
739         return (sensitive_data.host_keys[ind]);
740 }
741
742 int
743 get_hostkey_index(Key *key)
744 {
745         int i;
746
747         for (i = 0; i < options.num_host_key_files; i++) {
748                 if (key == sensitive_data.host_keys[i])
749                         return (i);
750         }
751         return (-1);
752 }
753
754 /*
755  * returns 1 if connection should be dropped, 0 otherwise.
756  * dropping starts at connection #max_startups_begin with a probability
757  * of (max_startups_rate/100). the probability increases linearly until
758  * all connections are dropped for startups > max_startups
759  */
760 static int
761 drop_connection(int startups)
762 {
763         int p, r;
764
765         if (startups < options.max_startups_begin)
766                 return 0;
767         if (startups >= options.max_startups)
768                 return 1;
769         if (options.max_startups_rate == 100)
770                 return 1;
771
772         p  = 100 - options.max_startups_rate;
773         p *= startups - options.max_startups_begin;
774         p /= options.max_startups - options.max_startups_begin;
775         p += options.max_startups_rate;
776         r = arc4random() % 100;
777
778         debug("drop_connection: p %d, r %d", p, r);
779         return (r < p) ? 1 : 0;
780 }
781
782 static void
783 usage(void)
784 {
785         fprintf(stderr, "%s, %s\n",
786             SSH_RELEASE, SSLeay_version(SSLEAY_VERSION));
787         fprintf(stderr,
788 "usage: sshd [-46Ddeiqt] [-b bits] [-f config_file] [-g login_grace_time]\n"
789 "            [-h host_key_file] [-k key_gen_time] [-o option] [-p port] [-u len]\n"
790         );
791         exit(1);
792 }
793
794 static void
795 send_rexec_state(int fd, Buffer *conf)
796 {
797         Buffer m;
798
799         debug3("%s: entering fd = %d config len %d", __func__, fd,
800             buffer_len(conf));
801
802         /*
803          * Protocol from reexec master to child:
804          *      string  configuration
805          *      u_int   ephemeral_key_follows
806          *      bignum  e               (only if ephemeral_key_follows == 1)
807          *      bignum  n                       "
808          *      bignum  d                       "
809          *      bignum  iqmp                    "
810          *      bignum  p                       "
811          *      bignum  q                       "
812          */
813         buffer_init(&m);
814         buffer_put_cstring(&m, buffer_ptr(conf));
815
816         if (sensitive_data.server_key != NULL &&
817             sensitive_data.server_key->type == KEY_RSA1) {
818                 buffer_put_int(&m, 1);
819                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->e);
820                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->n);
821                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->d);
822                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->iqmp);
823                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->p);
824                 buffer_put_bignum(&m, sensitive_data.server_key->rsa->q);
825         } else
826                 buffer_put_int(&m, 0);
827
828         if (ssh_msg_send(fd, 0, &m) == -1)
829                 fatal("%s: ssh_msg_send failed", __func__);
830
831         buffer_free(&m);
832
833         debug3("%s: done", __func__);
834 }
835
836 static void
837 recv_rexec_state(int fd, Buffer *conf)
838 {
839         Buffer m;
840         char *cp;
841         u_int len;
842
843         debug3("%s: entering fd = %d", __func__, fd);
844
845         buffer_init(&m);
846
847         if (ssh_msg_recv(fd, &m) == -1)
848                 fatal("%s: ssh_msg_recv failed", __func__);
849         if (buffer_get_char(&m) != 0)
850                 fatal("%s: rexec version mismatch", __func__);
851
852         cp = buffer_get_string(&m, &len);
853         if (conf != NULL)
854                 buffer_append(conf, cp, len + 1);
855         xfree(cp);
856
857         if (buffer_get_int(&m)) {
858                 if (sensitive_data.server_key != NULL)
859                         key_free(sensitive_data.server_key);
860                 sensitive_data.server_key = key_new_private(KEY_RSA1);
861                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->e);
862                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->n);
863                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->d);
864                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->iqmp);
865                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->p);
866                 buffer_get_bignum(&m, sensitive_data.server_key->rsa->q);
867                 rsa_generate_additional_parameters(
868                     sensitive_data.server_key->rsa);
869         }
870         buffer_free(&m);
871
872         debug3("%s: done", __func__);
873 }
874
875 /*
876  * Main program for the daemon.
877  */
878 int
879 main(int ac, char **av)
880 {
881         extern char *optarg;
882         extern int optind;
883         int opt, j, i, fdsetsz, on = 1;
884         int sock_in = -1, sock_out = -1, newsock = -1;
885         pid_t pid;
886         socklen_t fromlen;
887         fd_set *fdset;
888         struct sockaddr_storage from;
889         const char *remote_ip;
890         int remote_port;
891         FILE *f;
892         struct addrinfo *ai;
893         char ntop[NI_MAXHOST], strport[NI_MAXSERV];
894         char *line;
895         int listen_sock, maxfd;
896         int startup_p[2] = { -1 , -1 }, config_s[2] = { -1 , -1 };
897         int startups = 0;
898         Key *key;
899         Authctxt *authctxt;
900         int ret, key_used = 0;
901         Buffer cfg;
902
903 #ifdef HAVE_SECUREWARE
904         (void)set_auth_parameters(ac, av);
905 #endif
906         __progname = ssh_get_progname(av[0]);
907         init_rng();
908
909         /* Save argv. Duplicate so setproctitle emulation doesn't clobber it */
910         saved_argc = ac;
911         rexec_argc = ac;
912         saved_argv = xmalloc(sizeof(*saved_argv) * (ac + 1));
913         for (i = 0; i < ac; i++)
914                 saved_argv[i] = xstrdup(av[i]);
915         saved_argv[i] = NULL;
916
917 #ifndef HAVE_SETPROCTITLE
918         /* Prepare for later setproctitle emulation */
919         compat_init_setproctitle(ac, av);
920         av = saved_argv;
921 #endif
922
923         if (geteuid() == 0 && setgroups(0, NULL) == -1)
924                 debug("setgroups(): %.200s", strerror(errno));
925
926         /* Initialize configuration options to their default values. */
927         initialize_server_options(&options);
928
929         /* Parse command-line arguments. */
930         while ((opt = getopt(ac, av, "f:p:b:k:h:g:u:o:dDeiqrtQR46")) != -1) {
931                 switch (opt) {
932                 case '4':
933                         options.address_family = AF_INET;
934                         break;
935                 case '6':
936                         options.address_family = AF_INET6;
937                         break;
938                 case 'f':
939                         config_file_name = optarg;
940                         break;
941                 case 'd':
942                         if (debug_flag == 0) {
943                                 debug_flag = 1;
944                                 options.log_level = SYSLOG_LEVEL_DEBUG1;
945                         } else if (options.log_level < SYSLOG_LEVEL_DEBUG3)
946                                 options.log_level++;
947                         break;
948                 case 'D':
949                         no_daemon_flag = 1;
950                         break;
951                 case 'e':
952                         log_stderr = 1;
953                         break;
954                 case 'i':
955                         inetd_flag = 1;
956                         break;
957                 case 'r':
958                         rexec_flag = 0;
959                         break;
960                 case 'R':
961                         rexeced_flag = 1;
962                         inetd_flag = 1;
963                         break;
964                 case 'Q':
965                         /* ignored */
966                         break;
967                 case 'q':
968                         options.log_level = SYSLOG_LEVEL_QUIET;
969                         break;
970                 case 'b':
971                         options.server_key_bits = atoi(optarg);
972                         break;
973                 case 'p':
974                         options.ports_from_cmdline = 1;
975                         if (options.num_ports >= MAX_PORTS) {
976                                 fprintf(stderr, "too many ports.\n");
977                                 exit(1);
978                         }
979                         options.ports[options.num_ports++] = a2port(optarg);
980                         if (options.ports[options.num_ports-1] == 0) {
981                                 fprintf(stderr, "Bad port number.\n");
982                                 exit(1);
983                         }
984                         break;
985                 case 'g':
986                         if ((options.login_grace_time = convtime(optarg)) == -1) {
987                                 fprintf(stderr, "Invalid login grace time.\n");
988                                 exit(1);
989                         }
990                         break;
991                 case 'k':
992                         if ((options.key_regeneration_time = convtime(optarg)) == -1) {
993                                 fprintf(stderr, "Invalid key regeneration interval.\n");
994                                 exit(1);
995                         }
996                         break;
997                 case 'h':
998                         if (options.num_host_key_files >= MAX_HOSTKEYS) {
999                                 fprintf(stderr, "too many host keys.\n");
1000                                 exit(1);
1001                         }
1002                         options.host_key_files[options.num_host_key_files++] = optarg;
1003                         break;
1004                 case 't':
1005                         test_flag = 1;
1006                         break;
1007                 case 'u':
1008                         utmp_len = atoi(optarg);
1009                         if (utmp_len > MAXHOSTNAMELEN) {
1010                                 fprintf(stderr, "Invalid utmp length.\n");
1011                                 exit(1);
1012                         }
1013                         break;
1014                 case 'o':
1015                         line = xstrdup(optarg);
1016                         if (process_server_config_line(&options, line,
1017                             "command-line", 0) != 0)
1018                                 exit(1);
1019                         xfree(line);
1020                         break;
1021                 case '?':
1022                 default:
1023                         usage();
1024                         break;
1025                 }
1026         }
1027         if (rexeced_flag || inetd_flag)
1028                 rexec_flag = 0;
1029         if (rexec_flag && (av[0] == NULL || *av[0] != '/'))
1030                 fatal("sshd re-exec requires execution with an absolute path");
1031         if (rexeced_flag)
1032                 closefrom(REEXEC_MIN_FREE_FD);
1033         else
1034                 closefrom(REEXEC_DEVCRYPTO_RESERVED_FD);
1035
1036         SSLeay_add_all_algorithms();
1037
1038         /*
1039          * Force logging to stderr until we have loaded the private host
1040          * key (unless started from inetd)
1041          */
1042         log_init(__progname,
1043             options.log_level == SYSLOG_LEVEL_NOT_SET ?
1044             SYSLOG_LEVEL_INFO : options.log_level,
1045             options.log_facility == SYSLOG_FACILITY_NOT_SET ?
1046             SYSLOG_FACILITY_AUTH : options.log_facility,
1047             log_stderr || !inetd_flag);
1048
1049         /*
1050          * Unset KRB5CCNAME, otherwise the user's session may inherit it from
1051          * root's environment
1052          */
1053         if (getenv("KRB5CCNAME") != NULL)
1054                 unsetenv("KRB5CCNAME");
1055
1056 #ifdef _UNICOS
1057         /* Cray can define user privs drop all privs now!
1058          * Not needed on PRIV_SU systems!
1059          */
1060         drop_cray_privs();
1061 #endif
1062
1063         seed_rng();
1064
1065         sensitive_data.server_key = NULL;
1066         sensitive_data.ssh1_host_key = NULL;
1067         sensitive_data.have_ssh1_key = 0;
1068         sensitive_data.have_ssh2_key = 0;
1069
1070         /* Fetch our configuration */
1071         buffer_init(&cfg);
1072         if (rexeced_flag)
1073                 recv_rexec_state(REEXEC_CONFIG_PASS_FD, &cfg);
1074         else
1075                 load_server_config(config_file_name, &cfg);
1076
1077         parse_server_config(&options,
1078             rexeced_flag ? "rexec" : config_file_name, &cfg);
1079
1080         if (!rexec_flag)
1081                 buffer_free(&cfg);
1082
1083         /* Fill in default values for those options not explicitly set. */
1084         fill_default_server_options(&options);
1085
1086         /* set default channel AF */
1087         channel_set_af(options.address_family);
1088
1089         /* Check that there are no remaining arguments. */
1090         if (optind < ac) {
1091                 fprintf(stderr, "Extra argument %s.\n", av[optind]);
1092                 exit(1);
1093         }
1094
1095         debug("sshd version %.100s", SSH_RELEASE);
1096
1097         /* load private host keys */
1098         sensitive_data.host_keys = xmalloc(options.num_host_key_files *
1099             sizeof(Key *));
1100         for (i = 0; i < options.num_host_key_files; i++)
1101                 sensitive_data.host_keys[i] = NULL;
1102
1103         for (i = 0; i < options.num_host_key_files; i++) {
1104                 key = key_load_private(options.host_key_files[i], "", NULL);
1105                 sensitive_data.host_keys[i] = key;
1106                 if (key == NULL) {
1107                         error("Could not load host key: %s",
1108                             options.host_key_files[i]);
1109                         sensitive_data.host_keys[i] = NULL;
1110                         continue;
1111                 }
1112                 switch (key->type) {
1113                 case KEY_RSA1:
1114                         sensitive_data.ssh1_host_key = key;
1115                         sensitive_data.have_ssh1_key = 1;
1116                         break;
1117                 case KEY_RSA:
1118                 case KEY_DSA:
1119                         sensitive_data.have_ssh2_key = 1;
1120                         break;
1121                 }
1122                 debug("private host key: #%d type %d %s", i, key->type,
1123                     key_type(key));
1124         }
1125         if ((options.protocol & SSH_PROTO_1) && !sensitive_data.have_ssh1_key) {
1126                 logit("Disabling protocol version 1. Could not load host key");
1127                 options.protocol &= ~SSH_PROTO_1;
1128         }
1129 #ifndef GSSAPI
1130         /* The GSSAPI key exchange can run without a host key */
1131         if ((options.protocol & SSH_PROTO_2) && !sensitive_data.have_ssh2_key) {
1132                 logit("Disabling protocol version 2. Could not load host key");
1133                 options.protocol &= ~SSH_PROTO_2;
1134         }
1135 #endif
1136         if (!(options.protocol & (SSH_PROTO_1|SSH_PROTO_2))) {
1137                 logit("sshd: no hostkeys available -- exiting.");
1138                 exit(1);
1139         }
1140
1141         /* Check certain values for sanity. */
1142         if (options.protocol & SSH_PROTO_1) {
1143                 if (options.server_key_bits < 512 ||
1144                     options.server_key_bits > 32768) {
1145                         fprintf(stderr, "Bad server key size.\n");
1146                         exit(1);
1147                 }
1148                 /*
1149                  * Check that server and host key lengths differ sufficiently. This
1150                  * is necessary to make double encryption work with rsaref. Oh, I
1151                  * hate software patents. I dont know if this can go? Niels
1152                  */
1153                 if (options.server_key_bits >
1154                     BN_num_bits(sensitive_data.ssh1_host_key->rsa->n) -
1155                     SSH_KEY_BITS_RESERVED && options.server_key_bits <
1156                     BN_num_bits(sensitive_data.ssh1_host_key->rsa->n) +
1157                     SSH_KEY_BITS_RESERVED) {
1158                         options.server_key_bits =
1159                             BN_num_bits(sensitive_data.ssh1_host_key->rsa->n) +
1160                             SSH_KEY_BITS_RESERVED;
1161                         debug("Forcing server key to %d bits to make it differ from host key.",
1162                             options.server_key_bits);
1163                 }
1164         }
1165
1166         if (use_privsep) {
1167                 struct passwd *pw;
1168                 struct stat st;
1169
1170                 if ((pw = getpwnam(SSH_PRIVSEP_USER)) == NULL)
1171                         fatal("Privilege separation user %s does not exist",
1172                             SSH_PRIVSEP_USER);
1173                 if ((stat(_PATH_PRIVSEP_CHROOT_DIR, &st) == -1) ||
1174                     (S_ISDIR(st.st_mode) == 0))
1175                         fatal("Missing privilege separation directory: %s",
1176                             _PATH_PRIVSEP_CHROOT_DIR);
1177
1178 #ifdef HAVE_CYGWIN
1179                 if (check_ntsec(_PATH_PRIVSEP_CHROOT_DIR) &&
1180                     (st.st_uid != getuid () ||
1181                     (st.st_mode & (S_IWGRP|S_IWOTH)) != 0))
1182 #else
1183                 if (st.st_uid != 0 || (st.st_mode & (S_IWGRP|S_IWOTH)) != 0)
1184 #endif
1185                         fatal("%s must be owned by root and not group or "
1186                             "world-writable.", _PATH_PRIVSEP_CHROOT_DIR);
1187         }
1188
1189         /* Configuration looks good, so exit if in test mode. */
1190         if (test_flag)
1191                 exit(0);
1192
1193         /*
1194          * Clear out any supplemental groups we may have inherited.  This
1195          * prevents inadvertent creation of files with bad modes (in the
1196          * portable version at least, it's certainly possible for PAM
1197          * to create a file, and we can't control the code in every
1198          * module which might be used).
1199          */
1200         if (setgroups(0, NULL) < 0)
1201                 debug("setgroups() failed: %.200s", strerror(errno));
1202
1203         if (rexec_flag) {
1204                 rexec_argv = xmalloc(sizeof(char *) * (rexec_argc + 2));
1205                 for (i = 0; i < rexec_argc; i++) {
1206                         debug("rexec_argv[%d]='%s'", i, saved_argv[i]);
1207                         rexec_argv[i] = saved_argv[i];
1208                 }
1209                 rexec_argv[rexec_argc] = "-R";
1210                 rexec_argv[rexec_argc + 1] = NULL;
1211         }
1212
1213         /* Initialize the log (it is reinitialized below in case we forked). */
1214         if (debug_flag && (!inetd_flag || rexeced_flag))
1215                 log_stderr = 1;
1216         log_init(__progname, options.log_level, options.log_facility, log_stderr);
1217
1218         /*
1219          * If not in debugging mode, and not started from inetd, disconnect
1220          * from the controlling terminal, and fork.  The original process
1221          * exits.
1222          */
1223         if (!(debug_flag || inetd_flag || no_daemon_flag)) {
1224 #ifdef TIOCNOTTY
1225                 int fd;
1226 #endif /* TIOCNOTTY */
1227                 if (daemon(0, 0) < 0)
1228                         fatal("daemon() failed: %.200s", strerror(errno));
1229
1230                 /* Disconnect from the controlling tty. */
1231 #ifdef TIOCNOTTY
1232                 fd = open(_PATH_TTY, O_RDWR | O_NOCTTY);
1233                 if (fd >= 0) {
1234                         (void) ioctl(fd, TIOCNOTTY, NULL);
1235                         close(fd);
1236                 }
1237 #endif /* TIOCNOTTY */
1238         }
1239         /* Reinitialize the log (because of the fork above). */
1240         log_init(__progname, options.log_level, options.log_facility, log_stderr);
1241
1242         /* Initialize the random number generator. */
1243         arc4random_stir();
1244
1245         /* Chdir to the root directory so that the current disk can be
1246            unmounted if desired. */
1247         chdir("/");
1248
1249         /* ignore SIGPIPE */
1250         signal(SIGPIPE, SIG_IGN);
1251
1252         /* Start listening for a socket, unless started from inetd. */
1253         if (inetd_flag) {
1254                 int fd;
1255
1256                 startup_pipe = -1;
1257                 if (rexeced_flag) {
1258                         close(REEXEC_CONFIG_PASS_FD);
1259                         sock_in = sock_out = dup(STDIN_FILENO);
1260                         if (!debug_flag) {
1261                                 startup_pipe = dup(REEXEC_STARTUP_PIPE_FD);
1262                                 close(REEXEC_STARTUP_PIPE_FD);
1263                         }
1264                 } else {
1265                         sock_in = dup(STDIN_FILENO);
1266                         sock_out = dup(STDOUT_FILENO);
1267                 }
1268                 /*
1269                  * We intentionally do not close the descriptors 0, 1, and 2
1270                  * as our code for setting the descriptors won't work if
1271                  * ttyfd happens to be one of those.
1272                  */
1273                 if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
1274                         dup2(fd, STDIN_FILENO);
1275                         dup2(fd, STDOUT_FILENO);
1276                         if (fd > STDOUT_FILENO)
1277                                 close(fd);
1278                 }
1279                 debug("inetd sockets after dupping: %d, %d", sock_in, sock_out);
1280                 if ((options.protocol & SSH_PROTO_1) &&
1281                     sensitive_data.server_key == NULL)
1282                         generate_ephemeral_server_key();
1283         } else {
1284                 for (ai = options.listen_addrs; ai; ai = ai->ai_next) {
1285                         if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
1286                                 continue;
1287                         if (num_listen_socks >= MAX_LISTEN_SOCKS)
1288                                 fatal("Too many listen sockets. "
1289                                     "Enlarge MAX_LISTEN_SOCKS");
1290                         if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen,
1291                             ntop, sizeof(ntop), strport, sizeof(strport),
1292                             NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
1293                                 error("getnameinfo failed: %.100s",
1294                                     (ret != EAI_SYSTEM) ? gai_strerror(ret) :
1295                                     strerror(errno));
1296                                 continue;
1297                         }
1298                         /* Create socket for listening. */
1299                         listen_sock = socket(ai->ai_family, ai->ai_socktype,
1300                             ai->ai_protocol);
1301                         if (listen_sock < 0) {
1302                                 /* kernel may not support ipv6 */
1303                                 verbose("socket: %.100s", strerror(errno));
1304                                 continue;
1305                         }
1306                         if (set_nonblock(listen_sock) == -1) {
1307                                 close(listen_sock);
1308                                 continue;
1309                         }
1310                         /*
1311                          * Set socket options.
1312                          * Allow local port reuse in TIME_WAIT.
1313                          */
1314                         if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR,
1315                             &on, sizeof(on)) == -1)
1316                                 error("setsockopt SO_REUSEADDR: %s", strerror(errno));
1317
1318                         debug("Bind to port %s on %s.", strport, ntop);
1319
1320                         /* Bind the socket to the desired port. */
1321                         if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) {
1322                                 if (!ai->ai_next)
1323                                     error("Bind to port %s on %s failed: %.200s.",
1324                                             strport, ntop, strerror(errno));
1325                                 close(listen_sock);
1326                                 continue;
1327                         }
1328                         listen_socks[num_listen_socks] = listen_sock;
1329                         num_listen_socks++;
1330
1331                         /* Start listening on the port. */
1332                         logit("Server listening on %s port %s.", ntop, strport);
1333                         if (listen(listen_sock, SSH_LISTEN_BACKLOG) < 0)
1334                                 fatal("listen: %.100s", strerror(errno));
1335
1336                 }
1337                 freeaddrinfo(options.listen_addrs);
1338
1339                 if (!num_listen_socks)
1340                         fatal("Cannot bind any address.");
1341
1342                 if (options.protocol & SSH_PROTO_1)
1343                         generate_ephemeral_server_key();
1344
1345                 /*
1346                  * Arrange to restart on SIGHUP.  The handler needs
1347                  * listen_sock.
1348                  */
1349                 signal(SIGHUP, sighup_handler);
1350
1351                 signal(SIGTERM, sigterm_handler);
1352                 signal(SIGQUIT, sigterm_handler);
1353
1354                 /* Arrange SIGCHLD to be caught. */
1355                 signal(SIGCHLD, main_sigchld_handler);
1356
1357                 /* Write out the pid file after the sigterm handler is setup */
1358                 if (!debug_flag) {
1359                         /*
1360                          * Record our pid in /var/run/sshd.pid to make it
1361                          * easier to kill the correct sshd.  We don't want to
1362                          * do this before the bind above because the bind will
1363                          * fail if there already is a daemon, and this will
1364                          * overwrite any old pid in the file.
1365                          */
1366                         f = fopen(options.pid_file, "wb");
1367                         if (f == NULL) {
1368                                 error("Couldn't create pid file \"%s\": %s",
1369                                     options.pid_file, strerror(errno));
1370                         } else {
1371                                 fprintf(f, "%ld\n", (long) getpid());
1372                                 fclose(f);
1373                         }
1374                 }
1375
1376                 /* setup fd set for listen */
1377                 fdset = NULL;
1378                 maxfd = 0;
1379                 for (i = 0; i < num_listen_socks; i++)
1380                         if (listen_socks[i] > maxfd)
1381                                 maxfd = listen_socks[i];
1382                 /* pipes connected to unauthenticated childs */
1383                 startup_pipes = xmalloc(options.max_startups * sizeof(int));
1384                 for (i = 0; i < options.max_startups; i++)
1385                         startup_pipes[i] = -1;
1386
1387                 /*
1388                  * Stay listening for connections until the system crashes or
1389                  * the daemon is killed with a signal.
1390                  */
1391                 for (;;) {
1392                         if (received_sighup)
1393                                 sighup_restart();
1394                         if (fdset != NULL)
1395                                 xfree(fdset);
1396                         fdsetsz = howmany(maxfd+1, NFDBITS) * sizeof(fd_mask);
1397                         fdset = (fd_set *)xmalloc(fdsetsz);
1398                         memset(fdset, 0, fdsetsz);
1399
1400                         for (i = 0; i < num_listen_socks; i++)
1401                                 FD_SET(listen_socks[i], fdset);
1402                         for (i = 0; i < options.max_startups; i++)
1403                                 if (startup_pipes[i] != -1)
1404                                         FD_SET(startup_pipes[i], fdset);
1405
1406                         /* Wait in select until there is a connection. */
1407                         ret = select(maxfd+1, fdset, NULL, NULL, NULL);
1408                         if (ret < 0 && errno != EINTR)
1409                                 error("select: %.100s", strerror(errno));
1410                         if (received_sigterm) {
1411                                 logit("Received signal %d; terminating.",
1412                                     (int) received_sigterm);
1413                                 close_listen_socks();
1414                                 unlink(options.pid_file);
1415                                 exit(255);
1416                         }
1417                         if (key_used && key_do_regen) {
1418                                 generate_ephemeral_server_key();
1419                                 key_used = 0;
1420                                 key_do_regen = 0;
1421                         }
1422                         if (ret < 0)
1423                                 continue;
1424
1425                         for (i = 0; i < options.max_startups; i++)
1426                                 if (startup_pipes[i] != -1 &&
1427                                     FD_ISSET(startup_pipes[i], fdset)) {
1428                                         /*
1429                                          * the read end of the pipe is ready
1430                                          * if the child has closed the pipe
1431                                          * after successful authentication
1432                                          * or if the child has died
1433                                          */
1434                                         close(startup_pipes[i]);
1435                                         startup_pipes[i] = -1;
1436                                         startups--;
1437                                 }
1438                         for (i = 0; i < num_listen_socks; i++) {
1439                                 if (!FD_ISSET(listen_socks[i], fdset))
1440                                         continue;
1441                                 fromlen = sizeof(from);
1442                                 newsock = accept(listen_socks[i], (struct sockaddr *)&from,
1443                                     &fromlen);
1444                                 if (newsock < 0) {
1445                                         if (errno != EINTR && errno != EWOULDBLOCK)
1446                                                 error("accept: %.100s", strerror(errno));
1447                                         continue;
1448                                 }
1449                                 if (unset_nonblock(newsock) == -1) {
1450                                         close(newsock);
1451                                         continue;
1452                                 }
1453                                 if (drop_connection(startups) == 1) {
1454                                         debug("drop connection #%d", startups);
1455                                         close(newsock);
1456                                         continue;
1457                                 }
1458                                 if (pipe(startup_p) == -1) {
1459                                         close(newsock);
1460                                         continue;
1461                                 }
1462
1463                                 if (rexec_flag && socketpair(AF_UNIX,
1464                                     SOCK_STREAM, 0, config_s) == -1) {
1465                                         error("reexec socketpair: %s",
1466                                             strerror(errno));
1467                                         close(newsock);
1468                                         close(startup_p[0]);
1469                                         close(startup_p[1]);
1470                                         continue;
1471                                 }
1472
1473                                 for (j = 0; j < options.max_startups; j++)
1474                                         if (startup_pipes[j] == -1) {
1475                                                 startup_pipes[j] = startup_p[0];
1476                                                 if (maxfd < startup_p[0])
1477                                                         maxfd = startup_p[0];
1478                                                 startups++;
1479                                                 break;
1480                                         }
1481
1482                                 /*
1483                                  * Got connection.  Fork a child to handle it, unless
1484                                  * we are in debugging mode.
1485                                  */
1486                                 if (debug_flag) {
1487                                         /*
1488                                          * In debugging mode.  Close the listening
1489                                          * socket, and start processing the
1490                                          * connection without forking.
1491                                          */
1492                                         debug("Server will not fork when running in debugging mode.");
1493                                         close_listen_socks();
1494                                         sock_in = newsock;
1495                                         sock_out = newsock;
1496                                         close(startup_p[0]);
1497                                         close(startup_p[1]);
1498                                         startup_pipe = -1;
1499                                         pid = getpid();
1500                                         if (rexec_flag) {
1501                                                 send_rexec_state(config_s[0],
1502                                                     &cfg);
1503                                                 close(config_s[0]);
1504                                         }
1505                                         break;
1506                                 } else {
1507                                         /*
1508                                          * Normal production daemon.  Fork, and have
1509                                          * the child process the connection. The
1510                                          * parent continues listening.
1511                                          */
1512                                         if ((pid = fork()) == 0) {
1513                                                 /*
1514                                                  * Child.  Close the listening and max_startup
1515                                                  * sockets.  Start using the accepted socket.
1516                                                  * Reinitialize logging (since our pid has
1517                                                  * changed).  We break out of the loop to handle
1518                                                  * the connection.
1519                                                  */
1520                                                 startup_pipe = startup_p[1];
1521                                                 close_startup_pipes();
1522                                                 close_listen_socks();
1523                                                 sock_in = newsock;
1524                                                 sock_out = newsock;
1525                                                 log_init(__progname, options.log_level, options.log_facility, log_stderr);
1526                                                 if (rexec_flag)
1527                                                         close(config_s[0]);
1528                                                 break;
1529                                         }
1530                                 }
1531
1532                                 /* Parent.  Stay in the loop. */
1533                                 if (pid < 0)
1534                                         error("fork: %.100s", strerror(errno));
1535                                 else
1536                                         debug("Forked child %ld.", (long)pid);
1537
1538                                 close(startup_p[1]);
1539
1540                                 if (rexec_flag) {
1541                                         send_rexec_state(config_s[0], &cfg);
1542                                         close(config_s[0]);
1543                                         close(config_s[1]);
1544                                 }
1545
1546                                 /* Mark that the key has been used (it was "given" to the child). */
1547                                 if ((options.protocol & SSH_PROTO_1) &&
1548                                     key_used == 0) {
1549                                         /* Schedule server key regeneration alarm. */
1550                                         signal(SIGALRM, key_regeneration_alarm);
1551                                         alarm(options.key_regeneration_time);
1552                                         key_used = 1;
1553                                 }
1554
1555                                 arc4random_stir();
1556
1557                                 /* Close the new socket (the child is now taking care of it). */
1558                                 close(newsock);
1559                         }
1560                         /* child process check (or debug mode) */
1561                         if (num_listen_socks < 0)
1562                                 break;
1563                 }
1564         }
1565
1566         /* This is the child processing a new connection. */
1567         setproctitle("%s", "[accepted]");
1568
1569         /*
1570          * Create a new session and process group since the 4.4BSD
1571          * setlogin() affects the entire process group.  We don't
1572          * want the child to be able to affect the parent.
1573          */
1574 #if !defined(SSHD_ACQUIRES_CTTY)
1575         /*
1576          * If setsid is called, on some platforms sshd will later acquire a
1577          * controlling terminal which will result in "could not set
1578          * controlling tty" errors.
1579          */
1580         if (!debug_flag && !inetd_flag && setsid() < 0)
1581                 error("setsid: %.100s", strerror(errno));
1582 #endif
1583
1584         if (rexec_flag) {
1585                 int fd;
1586
1587                 debug("rexec start in %d out %d newsock %d pipe %d sock %d",
1588                     sock_in, sock_out, newsock, startup_pipe, config_s[0]);
1589                 dup2(newsock, STDIN_FILENO);
1590                 dup2(STDIN_FILENO, STDOUT_FILENO);
1591                 if (startup_pipe == -1)
1592                         close(REEXEC_STARTUP_PIPE_FD);
1593                 else
1594                         dup2(startup_pipe, REEXEC_STARTUP_PIPE_FD);
1595
1596                 dup2(config_s[1], REEXEC_CONFIG_PASS_FD);
1597                 close(config_s[1]);
1598                 if (startup_pipe != -1)
1599                         close(startup_pipe);
1600
1601                 execv(rexec_argv[0], rexec_argv);
1602
1603                 /* Reexec has failed, fall back and continue */
1604                 error("rexec of %s failed: %s", rexec_argv[0], strerror(errno));
1605                 recv_rexec_state(REEXEC_CONFIG_PASS_FD, NULL);
1606                 log_init(__progname, options.log_level,
1607                     options.log_facility, log_stderr);
1608
1609                 /* Clean up fds */
1610                 startup_pipe = REEXEC_STARTUP_PIPE_FD;
1611                 close(config_s[1]);
1612                 close(REEXEC_CONFIG_PASS_FD);
1613                 newsock = sock_out = sock_in = dup(STDIN_FILENO);
1614                 if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
1615                         dup2(fd, STDIN_FILENO);
1616                         dup2(fd, STDOUT_FILENO);
1617                         if (fd > STDERR_FILENO)
1618                                 close(fd);
1619                 }
1620                 debug("rexec cleanup in %d out %d newsock %d pipe %d sock %d",
1621                     sock_in, sock_out, newsock, startup_pipe, config_s[0]);
1622         }
1623
1624         /*
1625          * Disable the key regeneration alarm.  We will not regenerate the
1626          * key since we are no longer in a position to give it to anyone. We
1627          * will not restart on SIGHUP since it no longer makes sense.
1628          */
1629         alarm(0);
1630         signal(SIGALRM, SIG_DFL);
1631         signal(SIGHUP, SIG_DFL);
1632         signal(SIGTERM, SIG_DFL);
1633         signal(SIGQUIT, SIG_DFL);
1634         signal(SIGCHLD, SIG_DFL);
1635         signal(SIGINT, SIG_DFL);
1636
1637         /*
1638          * Register our connection.  This turns encryption off because we do
1639          * not have a key.
1640          */
1641         packet_set_connection(sock_in, sock_out);
1642         packet_set_server();
1643
1644         /* Set SO_KEEPALIVE if requested. */
1645         if (options.tcp_keep_alive && packet_connection_is_on_socket() &&
1646             setsockopt(sock_in, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)) < 0)
1647                 error("setsockopt SO_KEEPALIVE: %.100s", strerror(errno));
1648
1649         if ((remote_port = get_remote_port()) < 0) {
1650                 debug("get_remote_port failed");
1651                 cleanup_exit(255);
1652         }
1653         remote_ip = get_remote_ipaddr();
1654
1655 #ifdef SSH_AUDIT_EVENTS
1656         audit_connection_from(remote_ip, remote_port);
1657 #endif
1658 #ifdef LIBWRAP
1659         /* Check whether logins are denied from this host. */
1660         if (packet_connection_is_on_socket()) {
1661                 struct request_info req;
1662
1663                 request_init(&req, RQ_DAEMON, __progname, RQ_FILE, sock_in, 0);
1664                 fromhost(&req);
1665
1666                 if (!hosts_access(&req)) {
1667                         debug("Connection refused by tcp wrapper");
1668                         refuse(&req);
1669                         /* NOTREACHED */
1670                         fatal("libwrap refuse returns");
1671                 }
1672         }
1673 #endif /* LIBWRAP */
1674
1675         /* Log the connection. */
1676         verbose("Connection from %.500s port %d", remote_ip, remote_port);
1677
1678         /*
1679          * We don\'t want to listen forever unless the other side
1680          * successfully authenticates itself.  So we set up an alarm which is
1681          * cleared after successful authentication.  A limit of zero
1682          * indicates no limit. Note that we don\'t set the alarm in debugging
1683          * mode; it is just annoying to have the server exit just when you
1684          * are about to discover the bug.
1685          */
1686         signal(SIGALRM, grace_alarm_handler);
1687         if (!debug_flag)
1688                 alarm(options.login_grace_time);
1689
1690         sshd_exchange_identification(sock_in, sock_out);
1691 #if defined(AFS_KRB5)
1692         /* If machine has AFS, set process authentication group. */
1693         if (k_hasafs()) {
1694                 k_setpag();
1695                 k_unlog();
1696         }
1697 #endif /* AFS || AFS_KRB5 */
1698
1699         packet_set_nonblocking();
1700
1701         /* allocate authentication context */
1702         authctxt = xmalloc(sizeof(*authctxt));
1703         memset(authctxt, 0, sizeof(*authctxt));
1704
1705         authctxt->loginmsg = &loginmsg;
1706
1707         /* XXX global for cleanup, access from other modules */
1708         the_authctxt = authctxt;
1709
1710         /* prepare buffer to collect messages to display to user after login */
1711         buffer_init(&loginmsg);
1712
1713         if (use_privsep)
1714                 if (privsep_preauth(authctxt) == 1)
1715                         goto authenticated;
1716
1717         /* perform the key exchange */
1718         /* authenticate user and start session */
1719         if (compat20) {
1720                 do_ssh2_kex();
1721                 do_authentication2(authctxt);
1722         } else {
1723                 do_ssh1_kex();
1724                 do_authentication(authctxt);
1725         }
1726         /*
1727          * If we use privilege separation, the unprivileged child transfers
1728          * the current keystate and exits
1729          */
1730         if (use_privsep) {
1731                 mm_send_keystate(pmonitor);
1732                 exit(0);
1733         }
1734
1735  authenticated:
1736 #ifdef SSH_AUDIT_EVENTS
1737         audit_event(SSH_AUTH_SUCCESS);
1738 #endif
1739
1740         /*
1741          * In privilege separation, we fork another child and prepare
1742          * file descriptor passing.
1743          */
1744         if (use_privsep) {
1745                 privsep_postauth(authctxt);
1746                 /* the monitor process [priv] will not return */
1747                 if (!compat20)
1748                         destroy_sensitive_data();
1749         }
1750
1751         /* Start session. */
1752         do_authenticated(authctxt);
1753
1754         /* The connection has been terminated. */
1755         verbose("Closing connection to %.100s", remote_ip);
1756
1757 #ifdef USE_PAM
1758         if (options.use_pam)
1759                 finish_pam();
1760 #endif /* USE_PAM */
1761
1762 #ifdef SSH_AUDIT_EVENTS
1763         PRIVSEP(audit_event(SSH_CONNECTION_CLOSE));
1764 #endif
1765
1766         packet_close();
1767
1768         if (use_privsep)
1769                 mm_terminate();
1770
1771         exit(0);
1772 }
1773
1774 /*
1775  * Decrypt session_key_int using our private server key and private host key
1776  * (key with larger modulus first).
1777  */
1778 int
1779 ssh1_session_key(BIGNUM *session_key_int)
1780 {
1781         int rsafail = 0;
1782
1783         if (BN_cmp(sensitive_data.server_key->rsa->n, sensitive_data.ssh1_host_key->rsa->n) > 0) {
1784                 /* Server key has bigger modulus. */
1785                 if (BN_num_bits(sensitive_data.server_key->rsa->n) <
1786                     BN_num_bits(sensitive_data.ssh1_host_key->rsa->n) + SSH_KEY_BITS_RESERVED) {
1787                         fatal("do_connection: %s: server_key %d < host_key %d + SSH_KEY_BITS_RESERVED %d",
1788                             get_remote_ipaddr(),
1789                             BN_num_bits(sensitive_data.server_key->rsa->n),
1790                             BN_num_bits(sensitive_data.ssh1_host_key->rsa->n),
1791                             SSH_KEY_BITS_RESERVED);
1792                 }
1793                 if (rsa_private_decrypt(session_key_int, session_key_int,
1794                     sensitive_data.server_key->rsa) <= 0)
1795                         rsafail++;
1796                 if (rsa_private_decrypt(session_key_int, session_key_int,
1797                     sensitive_data.ssh1_host_key->rsa) <= 0)
1798                         rsafail++;
1799         } else {
1800                 /* Host key has bigger modulus (or they are equal). */
1801                 if (BN_num_bits(sensitive_data.ssh1_host_key->rsa->n) <
1802                     BN_num_bits(sensitive_data.server_key->rsa->n) + SSH_KEY_BITS_RESERVED) {
1803                         fatal("do_connection: %s: host_key %d < server_key %d + SSH_KEY_BITS_RESERVED %d",
1804                             get_remote_ipaddr(),
1805                             BN_num_bits(sensitive_data.ssh1_host_key->rsa->n),
1806                             BN_num_bits(sensitive_data.server_key->rsa->n),
1807                             SSH_KEY_BITS_RESERVED);
1808                 }
1809                 if (rsa_private_decrypt(session_key_int, session_key_int,
1810                     sensitive_data.ssh1_host_key->rsa) < 0)
1811                         rsafail++;
1812                 if (rsa_private_decrypt(session_key_int, session_key_int,
1813                     sensitive_data.server_key->rsa) < 0)
1814                         rsafail++;
1815         }
1816         return (rsafail);
1817 }
1818 /*
1819  * SSH1 key exchange
1820  */
1821 static void
1822 do_ssh1_kex(void)
1823 {
1824         int i, len;
1825         int rsafail = 0;
1826         BIGNUM *session_key_int;
1827         u_char session_key[SSH_SESSION_KEY_LENGTH];
1828         u_char cookie[8];
1829         u_int cipher_type, auth_mask, protocol_flags;
1830         u_int32_t rnd = 0;
1831
1832         /*
1833          * Generate check bytes that the client must send back in the user
1834          * packet in order for it to be accepted; this is used to defy ip
1835          * spoofing attacks.  Note that this only works against somebody
1836          * doing IP spoofing from a remote machine; any machine on the local
1837          * network can still see outgoing packets and catch the random
1838          * cookie.  This only affects rhosts authentication, and this is one
1839          * of the reasons why it is inherently insecure.
1840          */
1841         for (i = 0; i < 8; i++) {
1842                 if (i % 4 == 0)
1843                         rnd = arc4random();
1844                 cookie[i] = rnd & 0xff;
1845                 rnd >>= 8;
1846         }
1847
1848         /*
1849          * Send our public key.  We include in the packet 64 bits of random
1850          * data that must be matched in the reply in order to prevent IP
1851          * spoofing.
1852          */
1853         packet_start(SSH_SMSG_PUBLIC_KEY);
1854         for (i = 0; i < 8; i++)
1855                 packet_put_char(cookie[i]);
1856
1857         /* Store our public server RSA key. */
1858         packet_put_int(BN_num_bits(sensitive_data.server_key->rsa->n));
1859         packet_put_bignum(sensitive_data.server_key->rsa->e);
1860         packet_put_bignum(sensitive_data.server_key->rsa->n);
1861
1862         /* Store our public host RSA key. */
1863         packet_put_int(BN_num_bits(sensitive_data.ssh1_host_key->rsa->n));
1864         packet_put_bignum(sensitive_data.ssh1_host_key->rsa->e);
1865         packet_put_bignum(sensitive_data.ssh1_host_key->rsa->n);
1866
1867         /* Put protocol flags. */
1868         packet_put_int(SSH_PROTOFLAG_HOST_IN_FWD_OPEN);
1869
1870         /* Declare which ciphers we support. */
1871         packet_put_int(cipher_mask_ssh1(0));
1872
1873         /* Declare supported authentication types. */
1874         auth_mask = 0;
1875         if (options.rhosts_rsa_authentication)
1876                 auth_mask |= 1 << SSH_AUTH_RHOSTS_RSA;
1877         if (options.rsa_authentication)
1878                 auth_mask |= 1 << SSH_AUTH_RSA;
1879         if (options.challenge_response_authentication == 1)
1880                 auth_mask |= 1 << SSH_AUTH_TIS;
1881         if (options.password_authentication)
1882                 auth_mask |= 1 << SSH_AUTH_PASSWORD;
1883         packet_put_int(auth_mask);
1884
1885         /* Send the packet and wait for it to be sent. */
1886         packet_send();
1887         packet_write_wait();
1888
1889         debug("Sent %d bit server key and %d bit host key.",
1890             BN_num_bits(sensitive_data.server_key->rsa->n),
1891             BN_num_bits(sensitive_data.ssh1_host_key->rsa->n));
1892
1893         /* Read clients reply (cipher type and session key). */
1894         packet_read_expect(SSH_CMSG_SESSION_KEY);
1895
1896         /* Get cipher type and check whether we accept this. */
1897         cipher_type = packet_get_char();
1898
1899         if (!(cipher_mask_ssh1(0) & (1 << cipher_type)))
1900                 packet_disconnect("Warning: client selects unsupported cipher.");
1901
1902         /* Get check bytes from the packet.  These must match those we
1903            sent earlier with the public key packet. */
1904         for (i = 0; i < 8; i++)
1905                 if (cookie[i] != packet_get_char())
1906                         packet_disconnect("IP Spoofing check bytes do not match.");
1907
1908         debug("Encryption type: %.200s", cipher_name(cipher_type));
1909
1910         /* Get the encrypted integer. */
1911         if ((session_key_int = BN_new()) == NULL)
1912                 fatal("do_ssh1_kex: BN_new failed");
1913         packet_get_bignum(session_key_int);
1914
1915         protocol_flags = packet_get_int();
1916         packet_set_protocol_flags(protocol_flags);
1917         packet_check_eom();
1918
1919         /* Decrypt session_key_int using host/server keys */
1920         rsafail = PRIVSEP(ssh1_session_key(session_key_int));
1921
1922         /*
1923          * Extract session key from the decrypted integer.  The key is in the
1924          * least significant 256 bits of the integer; the first byte of the
1925          * key is in the highest bits.
1926          */
1927         if (!rsafail) {
1928                 BN_mask_bits(session_key_int, sizeof(session_key) * 8);
1929                 len = BN_num_bytes(session_key_int);
1930                 if (len < 0 || (u_int)len > sizeof(session_key)) {
1931                         error("do_connection: bad session key len from %s: "
1932                             "session_key_int %d > sizeof(session_key) %lu",
1933                             get_remote_ipaddr(), len, (u_long)sizeof(session_key));
1934                         rsafail++;
1935                 } else {
1936                         memset(session_key, 0, sizeof(session_key));
1937                         BN_bn2bin(session_key_int,
1938                             session_key + sizeof(session_key) - len);
1939
1940                         derive_ssh1_session_id(
1941                             sensitive_data.ssh1_host_key->rsa->n,
1942                             sensitive_data.server_key->rsa->n,
1943                             cookie, session_id);
1944                         /*
1945                          * Xor the first 16 bytes of the session key with the
1946                          * session id.
1947                          */
1948                         for (i = 0; i < 16; i++)
1949                                 session_key[i] ^= session_id[i];
1950                 }
1951         }
1952         if (rsafail) {
1953                 int bytes = BN_num_bytes(session_key_int);
1954                 u_char *buf = xmalloc(bytes);
1955                 MD5_CTX md;
1956
1957                 logit("do_connection: generating a fake encryption key");
1958                 BN_bn2bin(session_key_int, buf);
1959                 MD5_Init(&md);
1960                 MD5_Update(&md, buf, bytes);
1961                 MD5_Update(&md, sensitive_data.ssh1_cookie, SSH_SESSION_KEY_LENGTH);
1962                 MD5_Final(session_key, &md);
1963                 MD5_Init(&md);
1964                 MD5_Update(&md, session_key, 16);
1965                 MD5_Update(&md, buf, bytes);
1966                 MD5_Update(&md, sensitive_data.ssh1_cookie, SSH_SESSION_KEY_LENGTH);
1967                 MD5_Final(session_key + 16, &md);
1968                 memset(buf, 0, bytes);
1969                 xfree(buf);
1970                 for (i = 0; i < 16; i++)
1971                         session_id[i] = session_key[i] ^ session_key[i + 16];
1972         }
1973         /* Destroy the private and public keys. No longer. */
1974         destroy_sensitive_data();
1975
1976         if (use_privsep)
1977                 mm_ssh1_session_id(session_id);
1978
1979         /* Destroy the decrypted integer.  It is no longer needed. */
1980         BN_clear_free(session_key_int);
1981
1982         /* Set the session key.  From this on all communications will be encrypted. */
1983         packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH, cipher_type);
1984
1985         /* Destroy our copy of the session key.  It is no longer needed. */
1986         memset(session_key, 0, sizeof(session_key));
1987
1988         debug("Received session key; encryption turned on.");
1989
1990         /* Send an acknowledgment packet.  Note that this packet is sent encrypted. */
1991         packet_start(SSH_SMSG_SUCCESS);
1992         packet_send();
1993         packet_write_wait();
1994 }
1995
1996 /*
1997  * SSH2 key exchange: diffie-hellman-group1-sha1
1998  */
1999 static void
2000 do_ssh2_kex(void)
2001 {
2002         Kex *kex;
2003
2004         if (options.ciphers != NULL) {
2005                 myproposal[PROPOSAL_ENC_ALGS_CTOS] =
2006                 myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers;
2007         }
2008         myproposal[PROPOSAL_ENC_ALGS_CTOS] =
2009             compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]);
2010         myproposal[PROPOSAL_ENC_ALGS_STOC] =
2011             compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_STOC]);
2012
2013         if (options.macs != NULL) {
2014                 myproposal[PROPOSAL_MAC_ALGS_CTOS] =
2015                 myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs;
2016         }
2017         if (options.compression == COMP_NONE) {
2018                 myproposal[PROPOSAL_COMP_ALGS_CTOS] =
2019                 myproposal[PROPOSAL_COMP_ALGS_STOC] = "none";
2020         } else if (options.compression == COMP_DELAYED) {
2021                 myproposal[PROPOSAL_COMP_ALGS_CTOS] =
2022                 myproposal[PROPOSAL_COMP_ALGS_STOC] = "none,zlib@openssh.com";
2023         }
2024         
2025         myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = list_hostkey_types();
2026
2027 #ifdef GSSAPI
2028         { 
2029         char *orig;
2030         char *gss = NULL;
2031         char *newstr = NULL;
2032         orig = myproposal[PROPOSAL_KEX_ALGS];
2033
2034         /* If we don't have a host key, then all of the algorithms
2035          * currently in myproposal are useless */
2036         if (strlen(myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS])==0)
2037                 orig= NULL;
2038                 
2039         if (options.gss_keyex)
2040                 gss = ssh_gssapi_server_mechanisms();
2041         else
2042                 gss = NULL;
2043         
2044         if (gss && orig) {
2045                 int len = strlen(orig) + strlen(gss) +2;
2046                 newstr=xmalloc(len);
2047                 snprintf(newstr,len,"%s,%s",gss,orig);
2048         } else if (gss) {
2049                 newstr=gss;
2050         } else if (orig) {
2051                 newstr=orig;
2052         }
2053         /* If we've got GSSAPI mechanisms, then we've also got the 'null'
2054            host key algorithm, but we're not allowed to advertise it, unless
2055            its the only host key algorithm we're supporting */
2056         if (gss && (strlen(myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS])) == 0) {
2057                 myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS]="null";
2058         }
2059         if (newstr)
2060                 myproposal[PROPOSAL_KEX_ALGS]=newstr;
2061         else
2062                 fatal("No supported key exchange algorithms");
2063         }
2064 #endif
2065
2066         /* start key exchange */
2067         kex = kex_setup(myproposal);
2068         kex->kex[KEX_DH_GRP1_SHA1] = kexdh_server;
2069         kex->kex[KEX_DH_GRP14_SHA1] = kexdh_server;
2070         kex->kex[KEX_DH_GEX_SHA1] = kexgex_server;
2071 #ifdef GSSAPI
2072         kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_server;
2073 #endif
2074         kex->server = 1;
2075         kex->client_version_string=client_version_string;
2076         kex->server_version_string=server_version_string;
2077         kex->load_host_key=&get_hostkey_by_type;
2078         kex->host_key_index=&get_hostkey_index;
2079
2080         xxx_kex = kex;
2081
2082         dispatch_run(DISPATCH_BLOCK, &kex->done, kex);
2083
2084         session_id2 = kex->session_id;
2085         session_id2_len = kex->session_id_len;
2086
2087 #ifdef DEBUG_KEXDH
2088         /* send 1st encrypted/maced/compressed message */
2089         packet_start(SSH2_MSG_IGNORE);
2090         packet_put_cstring("markus");
2091         packet_send();
2092         packet_write_wait();
2093 #endif
2094         debug("KEX done");
2095 }
2096
2097 /* server specific fatal cleanup */
2098 void
2099 cleanup_exit(int i)
2100 {
2101         if (the_authctxt)
2102                 do_cleanup(the_authctxt);
2103 #ifdef SSH_AUDIT_EVENTS
2104         /* done after do_cleanup so it can cancel the PAM auth 'thread' */
2105         if (!use_privsep || mm_is_monitor())
2106                 audit_event(SSH_CONNECTION_ABANDON);
2107 #endif
2108         _exit(i);
2109 }
This page took 0.217661 seconds and 5 git commands to generate.