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