]> andersk Git - openssh.git/blame - sshd.c
- Merged changes from OpenBSD CVS
[openssh.git] / sshd.c
CommitLineData
8efc0c15 1/*
2
3sshd.c
4
5Author: Tatu Ylonen <ylo@cs.hut.fi>
6
7Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
8 All rights reserved
9
10Created: Fri Mar 17 17:09:28 1995 ylo
11
12This program is the ssh daemon. It listens for connections from clients, and
13performs authentication, executes use commands or shell, and forwards
14information to/from the application to the user client over an encrypted
15connection. This can also handle forwarding of X11, TCP/IP, and authentication
16agent connections.
17
18*/
19
20#include "includes.h"
21RCSID("$Id$");
22
23#include "xmalloc.h"
24#include "rsa.h"
25#include "ssh.h"
26#include "pty.h"
27#include "packet.h"
28#include "buffer.h"
29#include "cipher.h"
30#include "mpaux.h"
31#include "servconf.h"
32#include "uidswap.h"
33#include "compat.h"
34
35#ifdef LIBWRAP
36#include <tcpd.h>
37#include <syslog.h>
38int allow_severity = LOG_INFO;
39int deny_severity = LOG_WARNING;
40#endif /* LIBWRAP */
41
42#ifndef O_NOCTTY
43#define O_NOCTTY 0
44#endif
45
8efc0c15 46/* Local Xauthority file. */
6a17f9c2 47static char *xauthfile = NULL;
8efc0c15 48
49/* Server configuration options. */
50ServerOptions options;
51
52/* Name of the server configuration file. */
53char *config_file_name = SERVER_CONFIG_FILE;
54
55/* Debug mode flag. This can be set on the command line. If debug
56 mode is enabled, extra debugging output will be sent to the system
57 log, the daemon will not go to background, and will exit after processing
58 the first connection. */
59int debug_flag = 0;
60
61/* Flag indicating that the daemon is being started from inetd. */
62int inetd_flag = 0;
63
6a17f9c2 64/* debug goes to stderr unless inetd_flag is set */
65int log_stderr = 0;
66
8efc0c15 67/* argv[0] without path. */
68char *av0;
69
70/* Saved arguments to main(). */
71char **saved_argv;
72
73/* This is set to the socket that the server is listening; this is used in
74 the SIGHUP signal handler. */
75int listen_sock;
76
77/* Flags set in auth-rsa from authorized_keys flags. These are set in
78 auth-rsa.c. */
79int no_port_forwarding_flag = 0;
80int no_agent_forwarding_flag = 0;
81int no_x11_forwarding_flag = 0;
82int no_pty_flag = 0;
83char *forced_command = NULL; /* RSA authentication "command=" option. */
84struct envstring *custom_environment = NULL;
85 /* RSA authentication "environment=" options. */
86
87/* Session id for the current session. */
88unsigned char session_id[16];
89
90/* Any really sensitive data in the application is contained in this structure.
91 The idea is that this structure could be locked into memory so that the
92 pages do not get written into swap. However, there are some problems.
93 The private key contains BIGNUMs, and we do not (in principle) have
94 access to the internals of them, and locking just the structure is not
95 very useful. Currently, memory locking is not implemented. */
96struct
97{
98 /* Private part of server key. */
99 RSA *private_key;
100
101 /* Private part of host key. */
102 RSA *host_key;
103} sensitive_data;
104
105/* Flag indicating whether the current session key has been used. This flag
106 is set whenever the key is used, and cleared when the key is regenerated. */
107int key_used = 0;
108
109/* This is set to true when SIGHUP is received. */
110int received_sighup = 0;
111
112/* Public side of the server key. This value is regenerated regularly with
113 the private key. */
114RSA *public_key;
115
116/* Prototypes for various functions defined later in this file. */
117void do_connection(int privileged_port);
118void do_authentication(char *user, int privileged_port);
0183ea1c 119void eat_packets_and_disconnect(const char *user);
8efc0c15 120void do_authenticated(struct passwd *pw);
121void do_exec_pty(const char *command, int ptyfd, int ttyfd,
122 const char *ttyname, struct passwd *pw, const char *term,
123 const char *display, const char *auth_proto,
124 const char *auth_data);
125void do_exec_no_pty(const char *command, struct passwd *pw,
126 const char *display, const char *auth_proto,
127 const char *auth_data);
128void do_child(const char *command, struct passwd *pw, const char *term,
129 const char *display, const char *auth_proto,
130 const char *auth_data, const char *ttyname);
5aecb327 131#ifdef HAVE_LIBPAM
8efc0c15 132static int pamconv(int num_msg, const struct pam_message **msg,
133 struct pam_response **resp, void *appdata_ptr);
0183ea1c 134void do_pam_account_and_session(const char *username, const char *password,
d813bc69 135 const char *remote_user, const char *remote_host);
136void pam_cleanup_proc(void *context);
8efc0c15 137
138static struct pam_conv conv = {
139 pamconv,
140 NULL
141};
d813bc69 142struct pam_handle_t *pamh = NULL;
143const char *pampasswd = NULL;
e1a9c08d 144char *pamconv_msg = NULL;
8efc0c15 145
146static int pamconv(int num_msg, const struct pam_message **msg,
147 struct pam_response **resp, void *appdata_ptr)
148{
149 int count = 0;
8efc0c15 150 struct pam_response *reply = NULL;
8efc0c15 151
d813bc69 152 /* PAM will free this later */
153 reply = malloc(num_msg * sizeof(*reply));
154 if (reply == NULL)
155 return PAM_CONV_ERR;
156
8efc0c15 157 for(count = 0; count < num_msg; count++)
158 {
159 switch (msg[count]->msg_style)
160 {
8efc0c15 161 case PAM_PROMPT_ECHO_OFF:
0183ea1c 162 if (pampasswd == NULL)
d813bc69 163 {
8efc0c15 164 free(reply);
d813bc69 165 return PAM_CONV_ERR;
166 }
167 reply[count].resp_retcode = PAM_SUCCESS;
168 reply[count].resp = xstrdup(pampasswd);
169 break;
170
171 case PAM_TEXT_INFO:
172 reply[count].resp_retcode = PAM_SUCCESS;
173 reply[count].resp = xstrdup("");
e1a9c08d 174
175 if (msg[count]->msg == NULL) break;
176 debug("Adding PAM message: %s", msg[count]->msg);
177 if (pamconv_msg == NULL)
178 {
179 pamconv_msg = malloc(strlen(msg[count]->msg) + 2);
180
181 if (pamconv_msg == NULL)
182 return PAM_CONV_ERR;
183
184 strncpy(pamconv_msg, msg[count]->msg, strlen(msg[count]->msg));
185 pamconv_msg[strlen(msg[count]->msg)] = '\n';
186 pamconv_msg[strlen(msg[count]->msg) + 1] = '\0';
187 } else
188 {
189 pamconv_msg = realloc(pamconv_msg, strlen(pamconv_msg) + strlen(msg[count]->msg) + 2);
190 strncat(pamconv_msg, msg[count]->msg, strlen(msg[count]->msg));
191 pamconv_msg[strlen(pamconv_msg)] = '\n';
192 pamconv_msg[strlen(pamconv_msg) + 1] = '\0';
193 }
d813bc69 194 break;
8efc0c15 195
d813bc69 196 case PAM_PROMPT_ECHO_ON:
197 case PAM_ERROR_MSG:
198 default:
199 free(reply);
200 return PAM_CONV_ERR;
201 }
8efc0c15 202 }
203
d813bc69 204 *resp = reply;
8efc0c15 205
206 return PAM_SUCCESS;
207}
208
209void pam_cleanup_proc(void *context)
210{
549b3eed 211 int pam_retval;
d813bc69 212
213 if (pamh != NULL)
214 {
549b3eed 215 pam_retval = pam_close_session((pam_handle_t *)pamh, 0);
216 if (pam_retval != PAM_SUCCESS)
217 {
218 log("Cannot close PAM session: %.200s",
219 pam_strerror((pam_handle_t *)pamh, pam_retval));
220 }
221
222 pam_retval = pam_end((pam_handle_t *)pamh, pam_retval);
223 if (pam_retval != PAM_SUCCESS)
224 {
225 log("Cannot release PAM authentication: %.200s",
226 pam_strerror((pam_handle_t *)pamh, pam_retval));
227 }
d813bc69 228 }
229}
230
0183ea1c 231void do_pam_account_and_session(const char *username, const char *password, const char *remote_user, const char *remote_host)
d813bc69 232{
549b3eed 233 int pam_retval;
234
235 if (remote_host != NULL)
d813bc69 236 {
549b3eed 237 debug("PAM setting rhost to \"%.200s\"", remote_host);
238 pam_retval = pam_set_item((pam_handle_t *)pamh, PAM_RHOST, remote_host);
239 if (pam_retval != PAM_SUCCESS)
240 {
241 log("PAM set rhost failed: %.200s", pam_strerror((pam_handle_t *)pamh, pam_retval));
242 eat_packets_and_disconnect(username);
243 }
0183ea1c 244 }
549b3eed 245
246 if (remote_user != NULL)
0183ea1c 247 {
549b3eed 248 debug("PAM setting ruser to \"%.200s\"", remote_user);
249 pam_retval = pam_set_item((pam_handle_t *)pamh, PAM_RUSER, remote_user);
250 if (pam_retval != PAM_SUCCESS)
251 {
252 log("PAM set ruser failed: %.200s", pam_strerror((pam_handle_t *)pamh, pam_retval));
253 eat_packets_and_disconnect(username);
254 }
0183ea1c 255 }
549b3eed 256
257 pam_retval = pam_acct_mgmt((pam_handle_t *)pamh, 0);
258 if (pam_retval != PAM_SUCCESS)
0183ea1c 259 {
549b3eed 260 log("PAM rejected by account configuration: %.200s", pam_strerror((pam_handle_t *)pamh, pam_retval));
0183ea1c 261 eat_packets_and_disconnect(username);
262 }
d813bc69 263
549b3eed 264 pam_retval = pam_open_session((pam_handle_t *)pamh, 0);
265 if (pam_retval != PAM_SUCCESS)
d813bc69 266 {
549b3eed 267 log("PAM session setup failed: %.200s", pam_strerror((pam_handle_t *)pamh, pam_retval));
0183ea1c 268 eat_packets_and_disconnect(username);
d813bc69 269 }
8efc0c15 270}
5aecb327 271#endif /* HAVE_LIBPAM */
8efc0c15 272
273/* Signal handler for SIGHUP. Sshd execs itself when it receives SIGHUP;
274 the effect is to reread the configuration file (and to regenerate
275 the server key). */
276
277void sighup_handler(int sig)
278{
279 received_sighup = 1;
280 signal(SIGHUP, sighup_handler);
281}
282
283/* Called from the main program after receiving SIGHUP. Restarts the
284 server. */
285
286void sighup_restart()
287{
288 log("Received SIGHUP; restarting.");
289 close(listen_sock);
290 execv(saved_argv[0], saved_argv);
291 log("RESTART FAILED: av0='%s', error: %s.", av0, strerror(errno));
292 exit(1);
293}
294
295/* Generic signal handler for terminating signals in the master daemon.
296 These close the listen socket; not closing it seems to cause "Address
297 already in use" problems on some machines, which is inconvenient. */
298
299void sigterm_handler(int sig)
300{
301 log("Received signal %d; terminating.", sig);
302 close(listen_sock);
303 exit(255);
304}
305
306/* SIGCHLD handler. This is called whenever a child dies. This will then
307 reap any zombies left by exited c. */
308
309void main_sigchld_handler(int sig)
310{
311 int save_errno = errno;
312 int status;
313 wait(&status);
314 signal(SIGCHLD, main_sigchld_handler);
315 errno = save_errno;
316}
317
318/* Signal handler for the alarm after the login grace period has expired. */
319
320void grace_alarm_handler(int sig)
321{
322 /* Close the connection. */
323 packet_close();
324
325 /* Log error and exit. */
326 fatal("Timeout before authentication.");
327}
328
329/* Signal handler for the key regeneration alarm. Note that this
330 alarm only occurs in the daemon waiting for connections, and it does not
331 do anything with the private key or random state before forking. Thus there
332 should be no concurrency control/asynchronous execution problems. */
333
334void key_regeneration_alarm(int sig)
335{
336 int save_errno = errno;
337
338 /* Check if we should generate a new key. */
339 if (key_used)
340 {
341 /* This should really be done in the background. */
342 log("Generating new %d bit RSA key.", options.server_key_bits);
343
344 if (sensitive_data.private_key != NULL)
345 RSA_free(sensitive_data.private_key);
346 sensitive_data.private_key = RSA_new();
347
348 if (public_key != NULL)
349 RSA_free(public_key);
350 public_key = RSA_new();
351
352 rsa_generate_key(sensitive_data.private_key, public_key,
353 options.server_key_bits);
354 arc4random_stir();
355 key_used = 0;
356 log("RSA key generation complete.");
357 }
358
359 /* Reschedule the alarm. */
360 signal(SIGALRM, key_regeneration_alarm);
361 alarm(options.key_regeneration_time);
362 errno = save_errno;
363}
364
365/* Main program for the daemon. */
366
367int
368main(int ac, char **av)
369{
370 extern char *optarg;
371 extern int optind;
372 int opt, aux, sock_in, sock_out, newsock, i, pid, on = 1;
373 int remote_major, remote_minor;
374 int silentrsa = 0;
375 struct sockaddr_in sin;
376 char buf[100]; /* Must not be larger than remote_version. */
377 char remote_version[100]; /* Must be at least as big as buf. */
378 char *comment;
379 FILE *f;
380 struct linger linger;
381
382 /* Save argv[0]. */
383 saved_argv = av;
384 if (strchr(av[0], '/'))
385 av0 = strrchr(av[0], '/') + 1;
386 else
387 av0 = av[0];
388
389 /* Initialize configuration options to their default values. */
390 initialize_server_options(&options);
391
392 /* Parse command-line arguments. */
393 while ((opt = getopt(ac, av, "f:p:b:k:h:g:diqQ")) != EOF)
394 {
395 switch (opt)
396 {
397 case 'f':
398 config_file_name = optarg;
399 break;
400 case 'd':
401 debug_flag = 1;
6a17f9c2 402 options.log_level = SYSLOG_LEVEL_DEBUG;
8efc0c15 403 break;
404 case 'i':
405 inetd_flag = 1;
406 break;
407 case 'Q':
408 silentrsa = 1;
409 break;
410 case 'q':
6a17f9c2 411 options.log_level = SYSLOG_LEVEL_QUIET;
8efc0c15 412 break;
413 case 'b':
414 options.server_key_bits = atoi(optarg);
415 break;
416 case 'p':
417 options.port = atoi(optarg);
418 break;
419 case 'g':
420 options.login_grace_time = atoi(optarg);
421 break;
422 case 'k':
423 options.key_regeneration_time = atoi(optarg);
424 break;
425 case 'h':
426 options.host_key_file = optarg;
427 break;
428 case '?':
429 default:
430 fprintf(stderr, "sshd version %s\n", SSH_VERSION);
431 fprintf(stderr, "Usage: %s [options]\n", av0);
432 fprintf(stderr, "Options:\n");
433 fprintf(stderr, " -f file Configuration file (default %s/sshd_config)\n", ETCDIR);
434 fprintf(stderr, " -d Debugging mode\n");
435 fprintf(stderr, " -i Started from inetd\n");
436 fprintf(stderr, " -q Quiet (no logging)\n");
437 fprintf(stderr, " -p port Listen on the specified port (default: 22)\n");
438 fprintf(stderr, " -k seconds Regenerate server key every this many seconds (default: 3600)\n");
439 fprintf(stderr, " -g seconds Grace period for authentication (default: 300)\n");
440 fprintf(stderr, " -b bits Size of server RSA key (default: 768 bits)\n");
441 fprintf(stderr, " -h file File from which to read host key (default: %s)\n",
442 HOST_KEY_FILE);
443 exit(1);
444 }
445 }
446
447 /* check if RSA support exists */
448 if (rsa_alive() == 0) {
449 if (silentrsa == 0)
450 printf("sshd: no RSA support in libssl and libcrypto -- exiting. See ssl(8)\n");
451 log("no RSA support in libssl and libcrypto -- exiting. See ssl(8)");
452 exit(1);
453 }
454
455 /* Read server configuration options from the configuration file. */
456 read_server_config(&options, config_file_name);
457
458 /* Fill in default values for those options not explicitly set. */
459 fill_default_server_options(&options);
460
461 /* Check certain values for sanity. */
462 if (options.server_key_bits < 512 ||
463 options.server_key_bits > 32768)
464 {
465 fprintf(stderr, "Bad server key size.\n");
466 exit(1);
467 }
468 if (options.port < 1 || options.port > 65535)
469 {
470 fprintf(stderr, "Bad port number.\n");
471 exit(1);
472 }
473
474 /* Check that there are no remaining arguments. */
475 if (optind < ac)
476 {
477 fprintf(stderr, "Extra argument %s.\n", av[optind]);
478 exit(1);
479 }
480
481 /* Initialize the log (it is reinitialized below in case we forked). */
6a17f9c2 482
483 if (debug_flag && !inetd_flag)
484 log_stderr = 1;
485
486 log_init(av0, options.log_level, options.log_facility, log_stderr);
8efc0c15 487
488 debug("sshd version %.100s", SSH_VERSION);
489
490 sensitive_data.host_key = RSA_new();
491 /* Load the host key. It must have empty passphrase. */
492 if (!load_private_key(options.host_key_file, "",
493 sensitive_data.host_key, &comment))
494 {
495 if (debug_flag)
496 fprintf(stderr, "Could not load host key: %s: %s\n",
497 options.host_key_file, strerror(errno));
498 else
499 {
500 int err = errno;
6a17f9c2 501 /* force logging */
502 log_init(av0, SYSLOG_LEVEL_DEBUG, options.log_facility, log_stderr);
8efc0c15 503 error("Could not load host key: %.200s: %.100s",
504 options.host_key_file, strerror(err));
505 }
506 exit(1);
507 }
508 xfree(comment);
509
510 /* If not in debugging mode, and not started from inetd, disconnect from
511 the controlling terminal, and fork. The original process exits. */
512 if (!debug_flag && !inetd_flag)
513 {
514#ifdef TIOCNOTTY
515 int fd;
516#endif /* TIOCNOTTY */
517 if (daemon(0, 0) < 0)
518 fatal("daemon() failed: %.200s", strerror(errno));
519
520 /* Disconnect from the controlling tty. */
521#ifdef TIOCNOTTY
522 fd = open("/dev/tty", O_RDWR|O_NOCTTY);
523 if (fd >= 0)
524 {
525 (void)ioctl(fd, TIOCNOTTY, NULL);
526 close(fd);
527 }
528#endif /* TIOCNOTTY */
529 }
530
531 /* Reinitialize the log (because of the fork above). */
6a17f9c2 532 log_init(av0, options.log_level, options.log_facility, log_stderr);
8efc0c15 533
534 /* Check that server and host key lengths differ sufficiently. This is
535 necessary to make double encryption work with rsaref. Oh, I hate
536 software patents. I dont know if this can go? Niels */
537 if (options.server_key_bits >
538 BN_num_bits(sensitive_data.host_key->n) - SSH_KEY_BITS_RESERVED &&
539 options.server_key_bits <
540 BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED)
541 {
542 options.server_key_bits =
543 BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED;
544 debug("Forcing server key to %d bits to make it differ from host key.",
545 options.server_key_bits);
546 }
547
548 /* Do not display messages to stdout in RSA code. */
549 rsa_set_verbose(0);
550
551 /* Initialize the random number generator. */
552 arc4random_stir();
553
554 /* Chdir to the root directory so that the current disk can be unmounted
555 if desired. */
556 chdir("/");
557
558 /* Close connection cleanly after attack. */
559 cipher_attack_detected = packet_disconnect;
560
561 /* Start listening for a socket, unless started from inetd. */
562 if (inetd_flag)
563 {
564 int s1, s2;
565 s1 = dup(0); /* Make sure descriptors 0, 1, and 2 are in use. */
566 s2 = dup(s1);
567 sock_in = dup(0);
568 sock_out = dup(1);
569 /* We intentionally do not close the descriptors 0, 1, and 2 as our
570 code for setting the descriptors won\'t work if ttyfd happens to
571 be one of those. */
572 debug("inetd sockets after dupping: %d, %d", sock_in, sock_out);
573
574 public_key = RSA_new();
575 sensitive_data.private_key = RSA_new();
576 /* Generate an rsa key. */
577 log("Generating %d bit RSA key.", options.server_key_bits);
578 rsa_generate_key(sensitive_data.private_key, public_key,
579 options.server_key_bits);
580 arc4random_stir();
581 log("RSA key generation complete.");
582 }
583 else
584 {
585 /* Create socket for listening. */
586 listen_sock = socket(AF_INET, SOCK_STREAM, 0);
587 if (listen_sock < 0)
588 fatal("socket: %.100s", strerror(errno));
589
590 /* Set socket options. We try to make the port reusable and have it
591 close as fast as possible without waiting in unnecessary wait states
592 on close. */
593 setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
594 sizeof(on));
595 linger.l_onoff = 1;
596 linger.l_linger = 5;
597 setsockopt(listen_sock, SOL_SOCKET, SO_LINGER, (void *)&linger,
598 sizeof(linger));
599
600 /* Initialize the socket address. */
601 memset(&sin, 0, sizeof(sin));
602 sin.sin_family = AF_INET;
603 sin.sin_addr = options.listen_addr;
604 sin.sin_port = htons(options.port);
605
606 /* Bind the socket to the desired port. */
607 if (bind(listen_sock, (struct sockaddr *)&sin, sizeof(sin)) < 0)
608 {
609 error("bind: %.100s", strerror(errno));
610 shutdown(listen_sock, SHUT_RDWR);
611 close(listen_sock);
612 fatal("Bind to port %d failed.", options.port);
613 }
614
615 if (!debug_flag)
616 {
617 /* Record our pid in /etc/sshd_pid to make it easier to kill the
618 correct sshd. We don\'t want to do this before the bind above
619 because the bind will fail if there already is a daemon, and this
620 will overwrite any old pid in the file. */
621 f = fopen(SSH_DAEMON_PID_FILE, "w");
622 if (f)
623 {
624 fprintf(f, "%u\n", (unsigned int)getpid());
625 fclose(f);
626 }
627 }
628
629 /* Start listening on the port. */
630 log("Server listening on port %d.", options.port);
631 if (listen(listen_sock, 5) < 0)
632 fatal("listen: %.100s", strerror(errno));
633
634 public_key = RSA_new();
635 sensitive_data.private_key = RSA_new();
636 /* Generate an rsa key. */
637 log("Generating %d bit RSA key.", options.server_key_bits);
638 rsa_generate_key(sensitive_data.private_key, public_key,
639 options.server_key_bits);
640 arc4random_stir();
641 log("RSA key generation complete.");
642
643 /* Schedule server key regeneration alarm. */
644 signal(SIGALRM, key_regeneration_alarm);
645 alarm(options.key_regeneration_time);
646
647 /* Arrange to restart on SIGHUP. The handler needs listen_sock. */
648 signal(SIGHUP, sighup_handler);
649 signal(SIGTERM, sigterm_handler);
650 signal(SIGQUIT, sigterm_handler);
651
652 /* Arrange SIGCHLD to be caught. */
653 signal(SIGCHLD, main_sigchld_handler);
654
655 /* Stay listening for connections until the system crashes or the
656 daemon is killed with a signal. */
657 for (;;)
658 {
659 if (received_sighup)
660 sighup_restart();
661 /* Wait in accept until there is a connection. */
662 aux = sizeof(sin);
663 newsock = accept(listen_sock, (struct sockaddr *)&sin, &aux);
664 if (received_sighup)
665 sighup_restart();
666 if (newsock < 0)
667 {
668 if (errno == EINTR)
669 continue;
670 error("accept: %.100s", strerror(errno));
671 continue;
672 }
673
674 /* Got connection. Fork a child to handle it, unless we are in
675 debugging mode. */
676 if (debug_flag)
677 {
678 /* In debugging mode. Close the listening socket, and start
679 processing the connection without forking. */
680 debug("Server will not fork when running in debugging mode.");
681 close(listen_sock);
682 sock_in = newsock;
683 sock_out = newsock;
684 pid = getpid();
685 break;
686 }
687 else
688 {
689 /* Normal production daemon. Fork, and have the child process
690 the connection. The parent continues listening. */
691 if ((pid = fork()) == 0)
692 {
693 /* Child. Close the listening socket, and start using
694 the accepted socket. Reinitialize logging (since our
695 pid has changed). We break out of the loop to handle
696 the connection. */
697 close(listen_sock);
698 sock_in = newsock;
699 sock_out = newsock;
6a17f9c2 700 log_init(av0, options.log_level, options.log_facility, log_stderr);
8efc0c15 701 break;
702 }
703 }
704
705 /* Parent. Stay in the loop. */
706 if (pid < 0)
707 error("fork: %.100s", strerror(errno));
708 else
709 debug("Forked child %d.", pid);
710
711 /* Mark that the key has been used (it was "given" to the child). */
712 key_used = 1;
713
714 arc4random_stir();
715
716 /* Close the new socket (the child is now taking care of it). */
717 close(newsock);
718 }
719 }
720
721 /* This is the child processing a new connection. */
722
723 /* Disable the key regeneration alarm. We will not regenerate the key
724 since we are no longer in a position to give it to anyone. We will
725 not restart on SIGHUP since it no longer makes sense. */
726 alarm(0);
727 signal(SIGALRM, SIG_DFL);
728 signal(SIGHUP, SIG_DFL);
729 signal(SIGTERM, SIG_DFL);
730 signal(SIGQUIT, SIG_DFL);
731 signal(SIGCHLD, SIG_DFL);
732
733 /* Set socket options for the connection. We want the socket to close
734 as fast as possible without waiting for anything. If the connection
735 is not a socket, these will do nothing. */
736 /* setsockopt(sock_in, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)); */
737 linger.l_onoff = 1;
738 linger.l_linger = 5;
739 setsockopt(sock_in, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger));
740
741 /* Register our connection. This turns encryption off because we do not
742 have a key. */
743 packet_set_connection(sock_in, sock_out);
744
745 /* Check whether logins are denied from this host. */
746#ifdef LIBWRAP
747 {
748 struct request_info req;
749
750 request_init(&req, RQ_DAEMON, av0, RQ_FILE, sock_in, NULL);
751 fromhost(&req);
752
753 if (!hosts_access(&req)) {
754 close(sock_in);
755 close(sock_out);
756 refuse(&req);
757 }
758 log("Connection from %.500s port %d",
759 eval_client(&req), get_remote_port());
760 }
761#else
762 /* Log the connection. */
763 log("Connection from %.100s port %d",
764 get_remote_ipaddr(), get_remote_port());
765#endif /* LIBWRAP */
766
767 /* We don\'t want to listen forever unless the other side successfully
768 authenticates itself. So we set up an alarm which is cleared after
769 successful authentication. A limit of zero indicates no limit.
770 Note that we don\'t set the alarm in debugging mode; it is just annoying
771 to have the server exit just when you are about to discover the bug. */
772 signal(SIGALRM, grace_alarm_handler);
773 if (!debug_flag)
774 alarm(options.login_grace_time);
775
776 /* Send our protocol version identification. */
777 snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n",
778 PROTOCOL_MAJOR, PROTOCOL_MINOR, SSH_VERSION);
779 if (write(sock_out, buf, strlen(buf)) != strlen(buf))
780 fatal("Could not write ident string.");
781
782 /* Read other side\'s version identification. */
783 for (i = 0; i < sizeof(buf) - 1; i++)
784 {
785 if (read(sock_in, &buf[i], 1) != 1)
786 fatal("Did not receive ident string.");
787 if (buf[i] == '\r')
788 {
789 buf[i] = '\n';
790 buf[i + 1] = 0;
791 break;
792 }
793 if (buf[i] == '\n')
794 {
795 /* buf[i] == '\n' */
796 buf[i + 1] = 0;
797 break;
798 }
799 }
800 buf[sizeof(buf) - 1] = 0;
801
802 /* Check that the versions match. In future this might accept several
803 versions and set appropriate flags to handle them. */
804 if (sscanf(buf, "SSH-%d.%d-%[^\n]\n", &remote_major, &remote_minor,
805 remote_version) != 3)
806 {
807 const char *s = "Protocol mismatch.\n";
808 (void) write(sock_out, s, strlen(s));
809 close(sock_in);
810 close(sock_out);
811 fatal("Bad protocol version identification: %.100s", buf);
812 }
813 debug("Client protocol version %d.%d; client software version %.100s",
814 remote_major, remote_minor, remote_version);
815 if (remote_major != PROTOCOL_MAJOR)
816 {
817 const char *s = "Protocol major versions differ.\n";
818 (void) write(sock_out, s, strlen(s));
819 close(sock_in);
820 close(sock_out);
821 fatal("Protocol major versions differ: %d vs. %d",
822 PROTOCOL_MAJOR, remote_major);
823 }
824
825 /* Check that the client has sufficiently high software version. */
826 if (remote_major == 1 && remote_minor < 3)
827 packet_disconnect("Your ssh version is too old and is no longer supported. Please install a newer version.");
828
829 if (remote_major == 1 && remote_minor == 3) {
830 enable_compat13();
831 if (strcmp(remote_version, "OpenSSH-1.1") != 0) {
832 debug("Agent forwarding disabled, remote version is not compatible.");
833 no_agent_forwarding_flag = 1;
834 }
835 }
836
837 packet_set_nonblocking();
838
839 /* Handle the connection. We pass as argument whether the connection
840 came from a privileged port. */
841 do_connection(get_remote_port() < IPPORT_RESERVED);
842
843#ifdef KRB4
844 /* Cleanup user's ticket cache file. */
845 if (options.kerberos_ticket_cleanup)
846 (void) dest_tkt();
847#endif /* KRB4 */
848
849 /* Cleanup user's local Xauthority file. */
850 if (xauthfile) unlink(xauthfile);
851
852 /* The connection has been terminated. */
853 log("Closing connection to %.100s", inet_ntoa(sin.sin_addr));
854
5aecb327 855#ifdef HAVE_LIBPAM
d813bc69 856 {
857 int retval;
858
859 if (pamh != NULL)
860 {
549b3eed 861 debug("Closing PAM session.");
d813bc69 862 retval = pam_close_session((pam_handle_t *)pamh, 0);
8efc0c15 863
549b3eed 864 debug("Terminating PAM library.");
d813bc69 865 if (pam_end((pam_handle_t *)pamh, retval) != PAM_SUCCESS)
866 log("Cannot release PAM authentication.");
8efc0c15 867
d813bc69 868 fatal_remove_cleanup(&pam_cleanup_proc, NULL);
869 }
870 }
5aecb327 871#endif /* HAVE_LIBPAM */
8efc0c15 872
873 packet_close();
874
875 exit(0);
876}
877
878/* Process an incoming connection. Protocol version identifiers have already
879 been exchanged. This sends server key and performs the key exchange.
880 Server and host keys will no longer be needed after this functions. */
881
882void do_connection(int privileged_port)
883{
a61d322f 884 int i, len;
8efc0c15 885 BIGNUM *session_key_int;
886 unsigned char session_key[SSH_SESSION_KEY_LENGTH];
887 unsigned char check_bytes[8];
888 char *user;
889 unsigned int cipher_type, auth_mask, protocol_flags;
890 int plen, slen;
891 u_int32_t rand = 0;
892
893 /* Generate check bytes that the client must send back in the user packet
894 in order for it to be accepted; this is used to defy ip spoofing
895 attacks. Note that this only works against somebody doing IP spoofing
896 from a remote machine; any machine on the local network can still see
897 outgoing packets and catch the random cookie. This only affects
898 rhosts authentication, and this is one of the reasons why it is
899 inherently insecure. */
900 for (i = 0; i < 8; i++) {
901 if (i % 4 == 0)
902 rand = arc4random();
903 check_bytes[i] = rand & 0xff;
904 rand >>= 8;
905 }
906
907 /* Send our public key. We include in the packet 64 bits of random
908 data that must be matched in the reply in order to prevent IP spoofing. */
909 packet_start(SSH_SMSG_PUBLIC_KEY);
910 for (i = 0; i < 8; i++)
911 packet_put_char(check_bytes[i]);
912
913 /* Store our public server RSA key. */
914 packet_put_int(BN_num_bits(public_key->n));
915 packet_put_bignum(public_key->e);
916 packet_put_bignum(public_key->n);
917
918 /* Store our public host RSA key. */
919 packet_put_int(BN_num_bits(sensitive_data.host_key->n));
920 packet_put_bignum(sensitive_data.host_key->e);
921 packet_put_bignum(sensitive_data.host_key->n);
922
923 /* Put protocol flags. */
924 packet_put_int(SSH_PROTOFLAG_HOST_IN_FWD_OPEN);
925
926 /* Declare which ciphers we support. */
927 packet_put_int(cipher_mask());
928
929 /* Declare supported authentication types. */
930 auth_mask = 0;
931 if (options.rhosts_authentication)
932 auth_mask |= 1 << SSH_AUTH_RHOSTS;
933 if (options.rhosts_rsa_authentication)
934 auth_mask |= 1 << SSH_AUTH_RHOSTS_RSA;
935 if (options.rsa_authentication)
936 auth_mask |= 1 << SSH_AUTH_RSA;
937#ifdef KRB4
938 if (options.kerberos_authentication)
939 auth_mask |= 1 << SSH_AUTH_KERBEROS;
940#endif
941#ifdef AFS
942 if (options.kerberos_tgt_passing)
943 auth_mask |= 1 << SSH_PASS_KERBEROS_TGT;
944 if (options.afs_token_passing)
945 auth_mask |= 1 << SSH_PASS_AFS_TOKEN;
946#endif
947 if (options.password_authentication)
948 auth_mask |= 1 << SSH_AUTH_PASSWORD;
949 packet_put_int(auth_mask);
950
951 /* Send the packet and wait for it to be sent. */
952 packet_send();
953 packet_write_wait();
954
955 debug("Sent %d bit public key and %d bit host key.",
956 BN_num_bits(public_key->n), BN_num_bits(sensitive_data.host_key->n));
957
958 /* Read clients reply (cipher type and session key). */
959 packet_read_expect(&plen, SSH_CMSG_SESSION_KEY);
960
961 /* Get cipher type. */
962 cipher_type = packet_get_char();
963
964 /* Get check bytes from the packet. These must match those we sent earlier
965 with the public key packet. */
966 for (i = 0; i < 8; i++)
967 if (check_bytes[i] != packet_get_char())
968 packet_disconnect("IP Spoofing check bytes do not match.");
969
970 debug("Encryption type: %.200s", cipher_name(cipher_type));
971
972 /* Get the encrypted integer. */
973 session_key_int = BN_new();
974 packet_get_bignum(session_key_int, &slen);
975
976 /* Get protocol flags. */
977 protocol_flags = packet_get_int();
978 packet_set_protocol_flags(protocol_flags);
979
980 packet_integrity_check(plen, 1 + 8 + slen + 4, SSH_CMSG_SESSION_KEY);
981
982 /* Decrypt it using our private server key and private host key (key with
983 larger modulus first). */
984 if (BN_cmp(sensitive_data.private_key->n, sensitive_data.host_key->n) > 0)
985 {
986 /* Private key has bigger modulus. */
e1a9c08d 987 if (BN_num_bits(sensitive_data.private_key->n) <
988 BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED) {
989 fatal("do_connection: private_key %d < host_key %d + SSH_KEY_BITS_RESERVED %d",
990 BN_num_bits(sensitive_data.private_key->n),
991 BN_num_bits(sensitive_data.host_key->n),
992 SSH_KEY_BITS_RESERVED);
993 }
994
8efc0c15 995 rsa_private_decrypt(session_key_int, session_key_int,
996 sensitive_data.private_key);
997 rsa_private_decrypt(session_key_int, session_key_int,
998 sensitive_data.host_key);
999 }
1000 else
1001 {
1002 /* Host key has bigger modulus (or they are equal). */
e1a9c08d 1003 if (BN_num_bits(sensitive_data.host_key->n) <
1004 BN_num_bits(sensitive_data.private_key->n) + SSH_KEY_BITS_RESERVED) {
1005 fatal("do_connection: host_key %d < private_key %d + SSH_KEY_BITS_RESERVED %d",
1006 BN_num_bits(sensitive_data.host_key->n),
1007 BN_num_bits(sensitive_data.private_key->n),
1008 SSH_KEY_BITS_RESERVED);
1009 }
8efc0c15 1010 rsa_private_decrypt(session_key_int, session_key_int,
1011 sensitive_data.host_key);
1012 rsa_private_decrypt(session_key_int, session_key_int,
1013 sensitive_data.private_key);
1014 }
1015
1016 /* Compute session id for this session. */
1017 compute_session_id(session_id, check_bytes,
1018 BN_num_bits(sensitive_data.host_key->n),
1019 sensitive_data.host_key->n,
1020 BN_num_bits(sensitive_data.private_key->n),
1021 sensitive_data.private_key->n);
1022
1023 /* Extract session key from the decrypted integer. The key is in the
1024 least significant 256 bits of the integer; the first byte of the
1025 key is in the highest bits. */
1026 BN_mask_bits(session_key_int, sizeof(session_key) * 8);
a61d322f 1027 len = BN_num_bytes(session_key_int);
e35c1dc2 1028 if (len < 0 || len > sizeof(session_key))
a61d322f 1029 fatal("do_connection: bad len: session_key_int %d > sizeof(session_key) %d",
1030 len, sizeof(session_key));
1031 memset(session_key, 0, sizeof(session_key));
1032 BN_bn2bin(session_key_int, session_key + sizeof(session_key) - len);
8efc0c15 1033
1034 /* Xor the first 16 bytes of the session key with the session id. */
1035 for (i = 0; i < 16; i++)
1036 session_key[i] ^= session_id[i];
1037
1038 /* Destroy the decrypted integer. It is no longer needed. */
1039 BN_clear_free(session_key_int);
1040
1041 /* Set the session key. From this on all communications will be
1042 encrypted. */
1043 packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH,
1044 cipher_type, 0);
1045
1046 /* Destroy our copy of the session key. It is no longer needed. */
1047 memset(session_key, 0, sizeof(session_key));
1048
1049 debug("Received session key; encryption turned on.");
1050
1051 /* Send an acknowledgement packet. Note that this packet is sent
1052 encrypted. */
1053 packet_start(SSH_SMSG_SUCCESS);
1054 packet_send();
1055 packet_write_wait();
1056
1057 /* Get the name of the user that we wish to log in as. */
1058 packet_read_expect(&plen, SSH_CMSG_USER);
1059
1060 /* Get the user name. */
1061 {
1062 int ulen;
1063 user = packet_get_string(&ulen);
1064 packet_integrity_check(plen, (4 + ulen), SSH_CMSG_USER);
1065 }
1066
1067 /* Destroy the private and public keys. They will no longer be needed. */
1068 RSA_free(public_key);
1069 RSA_free(sensitive_data.private_key);
1070 RSA_free(sensitive_data.host_key);
1071
1072 setproctitle("%s", user);
1073 /* Do the authentication. */
1074 do_authentication(user, privileged_port);
1075}
1076
1077/* Check if the user is allowed to log in via ssh. If user is listed in
1078 DenyUsers or user's primary group is listed in DenyGroups, false will
1079 be returned. If AllowUsers isn't empty and user isn't listed there, or
1080 if AllowGroups isn't empty and user isn't listed there, false will be
1081 returned. Otherwise true is returned.
1082 XXX This function should also check if user has a valid shell */
1083
1084static int
1085allowed_user(struct passwd *pw)
1086{
1087 struct group *grp;
1088 int i;
1089
1090 /* Shouldn't be called if pw is NULL, but better safe than sorry... */
1091 if (!pw)
1092 return 0;
1093
1094 /* XXX Should check for valid login shell */
1095
1096 /* Return false if user is listed in DenyUsers */
1097 if (options.num_deny_users > 0)
1098 {
1099 if (!pw->pw_name)
1100 return 0;
1101 for (i = 0; i < options.num_deny_users; i++)
1102 if (match_pattern(pw->pw_name, options.deny_users[i]))
1103 return 0;
1104 }
1105
1106 /* Return false if AllowUsers isn't empty and user isn't listed there */
1107 if (options.num_allow_users > 0)
1108 {
1109 if (!pw->pw_name)
1110 return 0;
1111 for (i = 0; i < options.num_allow_users; i++)
1112 if (match_pattern(pw->pw_name, options.allow_users[i]))
1113 break;
1114 /* i < options.num_allow_users iff we break for loop */
1115 if (i >= options.num_allow_users)
1116 return 0;
1117 }
1118
1119 /* Get the primary group name if we need it. Return false if it fails */
1120 if (options.num_deny_groups > 0 || options.num_allow_groups > 0 )
1121 {
1122 grp = getgrgid(pw->pw_gid);
1123 if (!grp)
1124 return 0;
1125
1126 /* Return false if user's group is listed in DenyGroups */
1127 if (options.num_deny_groups > 0)
1128 {
1129 if (!grp->gr_name)
1130 return 0;
1131 for (i = 0; i < options.num_deny_groups; i++)
1132 if (match_pattern(grp->gr_name, options.deny_groups[i]))
1133 return 0;
1134 }
1135
1136 /* Return false if AllowGroups isn't empty and user's group isn't
1137 listed there */
1138 if (options.num_allow_groups > 0)
1139 {
1140 if (!grp->gr_name)
1141 return 0;
1142 for (i = 0; i < options.num_allow_groups; i++)
1143 if (match_pattern(grp->gr_name, options.allow_groups[i]))
1144 break;
1145 /* i < options.num_allow_groups iff we break for loop */
1146 if (i >= options.num_allow_groups)
1147 return 0;
1148 }
1149 }
1150
1151 /* We found no reason not to let this user try to log on... */
1152 return 1;
1153}
1154
1155/* Performs authentication of an incoming connection. Session key has already
1156 been exchanged and encryption is enabled. User is the user name to log
1157 in as (received from the clinet). Privileged_port is true if the
1158 connection comes from a privileged port (used for .rhosts authentication).*/
1159
1160#define MAX_AUTH_FAILURES 5
1161
1162void
1163do_authentication(char *user, int privileged_port)
1164{
1165 int type;
1166 int authenticated = 0;
1167 int authentication_failures = 0;
d813bc69 1168 char *password = NULL;
8efc0c15 1169 struct passwd *pw, pwcopy;
d813bc69 1170 char *client_user = NULL;
8efc0c15 1171 unsigned int client_host_key_bits;
1172 BIGNUM *client_host_key_e, *client_host_key_n;
549b3eed 1173#ifdef HAVE_LIBPAM
1174 int pam_retval;
1175#endif /* HAVE_LIBPAM */
1176
8efc0c15 1177#ifdef AFS
1178 /* If machine has AFS, set process authentication group. */
1179 if (k_hasafs()) {
1180 k_setpag();
1181 k_unlog();
1182 }
1183#endif /* AFS */
1184
1185 /* Verify that the user is a valid user. */
1186 pw = getpwnam(user);
8efc0c15 1187 if (!pw || !allowed_user(pw))
0183ea1c 1188 eat_packets_and_disconnect(user);
1189
8efc0c15 1190 /* Take a copy of the returned structure. */
1191 memset(&pwcopy, 0, sizeof(pwcopy));
1192 pwcopy.pw_name = xstrdup(pw->pw_name);
1193 pwcopy.pw_passwd = xstrdup(pw->pw_passwd);
1194 pwcopy.pw_uid = pw->pw_uid;
1195 pwcopy.pw_gid = pw->pw_gid;
1196 pwcopy.pw_dir = xstrdup(pw->pw_dir);
1197 pwcopy.pw_shell = xstrdup(pw->pw_shell);
1198 pw = &pwcopy;
1199
5aecb327 1200#ifdef HAVE_LIBPAM
549b3eed 1201 debug("Starting up PAM with username \"%.200s\"", pw->pw_name);
1202 pam_retval = pam_start("sshd", pw->pw_name, &conv, (pam_handle_t**)&pamh);
1203 if (pam_retval != PAM_SUCCESS)
0183ea1c 1204 {
549b3eed 1205 log("PAM initialisation failed: %.200s", pam_strerror((pam_handle_t *)pamh, pam_retval));
1206 eat_packets_and_disconnect(user);
0183ea1c 1207 }
549b3eed 1208 fatal_add_cleanup(&pam_cleanup_proc, NULL);
5aecb327 1209#endif
0183ea1c 1210
8efc0c15 1211 /* If we are not running as root, the user must have the same uid as the
1212 server. */
1213 if (getuid() != 0 && pw->pw_uid != getuid())
1214 packet_disconnect("Cannot change user when server not running as root.");
1215
1216 debug("Attempting authentication for %.100s.", user);
1217
1218 /* If the user has no password, accept authentication immediately. */
1219 if (options.password_authentication &&
1220#ifdef KRB4
1221 (!options.kerberos_authentication || options.kerberos_or_local_passwd) &&
1222#endif /* KRB4 */
1223 auth_password(pw, ""))
1224 {
1225 /* Authentication with empty password succeeded. */
1226 debug("Login for user %.100s accepted without authentication.", user);
1227 /* authentication_type = SSH_AUTH_PASSWORD; */
1228 authenticated = 1;
1229 /* Success packet will be sent after loop below. */
1230 }
1231 else
1232 {
1233 /* Indicate that authentication is needed. */
1234 packet_start(SSH_SMSG_FAILURE);
1235 packet_send();
1236 packet_write_wait();
1237 }
1238
1239 /* Loop until the user has been authenticated or the connection is closed. */
1240 while (!authenticated)
1241 {
1242 int plen;
1243 /* Get a packet from the client. */
1244 type = packet_read(&plen);
1245
1246 /* Process the packet. */
1247 switch (type)
1248 {
1249
1250#ifdef AFS
1251 case SSH_CMSG_HAVE_KERBEROS_TGT:
1252 if (!options.kerberos_tgt_passing)
1253 {
1254 /* packet_get_all(); */
1255 log("Kerberos tgt passing disabled.");
1256 break;
1257 }
1258 else {
1259 /* Accept Kerberos tgt. */
1260 int dlen;
1261 char *tgt = packet_get_string(&dlen);
1262 packet_integrity_check(plen, 4 + dlen, type);
1263 if (!auth_kerberos_tgt(pw, tgt))
1264 debug("Kerberos tgt REFUSED for %s", user);
1265 xfree(tgt);
1266 }
1267 continue;
1268
1269 case SSH_CMSG_HAVE_AFS_TOKEN:
1270 if (!options.afs_token_passing || !k_hasafs()) {
1271 /* packet_get_all(); */
1272 log("AFS token passing disabled.");
1273 break;
1274 }
1275 else {
1276 /* Accept AFS token. */
1277 int dlen;
1278 char *token_string = packet_get_string(&dlen);
1279 packet_integrity_check(plen, 4 + dlen, type);
e1a9c08d 1280 if (!auth_afs_token(pw, token_string))
8efc0c15 1281 debug("AFS token REFUSED for %s", user);
1282 xfree(token_string);
1283 continue;
1284 }
1285#endif /* AFS */
1286
1287#ifdef KRB4
1288 case SSH_CMSG_AUTH_KERBEROS:
1289 if (!options.kerberos_authentication)
1290 {
1291 /* packet_get_all(); */
1292 log("Kerberos authentication disabled.");
1293 break;
1294 }
1295 else {
1296 /* Try Kerberos v4 authentication. */
1297 KTEXT_ST auth;
1298 char *tkt_user = NULL;
1299 char *kdata = packet_get_string((unsigned int *)&auth.length);
1300 packet_integrity_check(plen, 4 + auth.length, type);
1301
1302 if (auth.length < MAX_KTXT_LEN)
1303 memcpy(auth.dat, kdata, auth.length);
1304 xfree(kdata);
1305
1306 if (auth_krb4(user, &auth, &tkt_user)) {
1307 /* Client has successfully authenticated to us. */
1308 log("Kerberos authentication accepted %s for account "
1309 "%s from %s", tkt_user, user, get_canonical_hostname());
1310 /* authentication_type = SSH_AUTH_KERBEROS; */
1311 authenticated = 1;
1312 xfree(tkt_user);
1313 }
1314 else {
1315 log("Kerberos authentication failed for account "
1316 "%s from %s", user, get_canonical_hostname());
1317 }
1318 }
1319 break;
1320#endif /* KRB4 */
1321
1322 case SSH_CMSG_AUTH_RHOSTS:
1323 if (!options.rhosts_authentication)
1324 {
1325 log("Rhosts authentication disabled.");
1326 break;
1327 }
1328
1329 /* Rhosts authentication (also uses /etc/hosts.equiv). */
1330 if (!privileged_port)
1331 {
1332 log("Rhosts authentication not available for connections from unprivileged port.");
1333 break;
1334 }
1335
1336 /* Get client user name. Note that we just have to trust the client;
1337 this is one reason why rhosts authentication is insecure.
1338 (Another is IP-spoofing on a local network.) */
1339 {
1340 int dlen;
1341 client_user = packet_get_string(&dlen);
1342 packet_integrity_check(plen, 4 + dlen, type);
1343 }
1344
1345 /* Try to authenticate using /etc/hosts.equiv and .rhosts. */
1346 if (auth_rhosts(pw, client_user, options.ignore_rhosts,
1347 options.strict_modes))
1348 {
1349 /* Authentication accepted. */
1350 log("Rhosts authentication accepted for %.100s, remote %.100s on %.700s.",
1351 user, client_user, get_canonical_hostname());
1352 authenticated = 1;
5aecb327 1353#ifndef HAVE_LIBPAM
8efc0c15 1354 xfree(client_user);
5aecb327 1355#endif /* HAVE_LIBPAM */
8efc0c15 1356 break;
1357 }
1358 log("Rhosts authentication failed for %.100s, remote %.100s.",
1359 user, client_user);
5aecb327 1360#ifndef HAVE_LIBPAM
8efc0c15 1361 xfree(client_user);
5aecb327 1362#endif /* HAVE_LIBPAM */
8efc0c15 1363 break;
1364
1365 case SSH_CMSG_AUTH_RHOSTS_RSA:
1366 if (!options.rhosts_rsa_authentication)
1367 {
1368 log("Rhosts with RSA authentication disabled.");
1369 break;
1370 }
1371
1372 /* Rhosts authentication (also uses /etc/hosts.equiv) with RSA
1373 host authentication. */
1374 if (!privileged_port)
1375 {
1376 log("Rhosts authentication not available for connections from unprivileged port.");
1377 break;
1378 }
1379
1380 {
1381 int ulen, elen, nlen;
1382 /* Get client user name. Note that we just have to trust
1383 the client; root on the client machine can claim to be
1384 any user. */
1385 client_user = packet_get_string(&ulen);
1386
1387 /* Get the client host key. */
1388 client_host_key_e = BN_new();
1389 client_host_key_n = BN_new();
1390 client_host_key_bits = packet_get_int();
1391 packet_get_bignum(client_host_key_e, &elen);
1392 packet_get_bignum(client_host_key_n, &nlen);
1393
1394 packet_integrity_check(plen, (4 + ulen) + 4 + elen + nlen, type);
1395 }
1396
8efc0c15 1397 if (auth_rhosts_rsa(pw, client_user,
b4748e2f 1398 client_host_key_bits, client_host_key_e, client_host_key_n))
8efc0c15 1399 {
1400 /* Authentication accepted. */
1401 authenticated = 1;
5aecb327 1402#ifndef HAVE_LIBPAM
8efc0c15 1403 xfree(client_user);
5aecb327 1404#endif /* HAVE_LIBPAM */
8efc0c15 1405 BN_clear_free(client_host_key_e);
1406 BN_clear_free(client_host_key_n);
1407 break;
1408 }
1409 log("Rhosts authentication failed for %.100s, remote %.100s.",
1410 user, client_user);
5aecb327 1411#ifndef HAVE_LIBPAM
d813bc69 1412 xfree(client_user);
5aecb327 1413#endif /* HAVE_LIBPAM */
8efc0c15 1414 BN_clear_free(client_host_key_e);
1415 BN_clear_free(client_host_key_n);
1416 break;
1417
1418 case SSH_CMSG_AUTH_RSA:
1419 if (!options.rsa_authentication)
1420 {
1421 log("RSA authentication disabled.");
1422 break;
1423 }
1424
1425 /* RSA authentication requested. */
1426 {
1427 int nlen;
1428 BIGNUM *n;
1429 n = BN_new();
1430 packet_get_bignum(n, &nlen);
1431
1432 packet_integrity_check(plen, nlen, type);
1433
1434 if (auth_rsa(pw, n, options.strict_modes))
1435 {
1436 /* Successful authentication. */
1437 BN_clear_free(n);
1438 log("RSA authentication for %.100s accepted.", user);
1439 authenticated = 1;
1440 break;
1441 }
1442 BN_clear_free(n);
1443 log("RSA authentication for %.100s failed.", user);
1444 }
1445 break;
1446
1447 case SSH_CMSG_AUTH_PASSWORD:
1448 if (!options.password_authentication)
1449 {
1450 log("Password authentication disabled.");
1451 break;
1452 }
1453
1454 /* Password authentication requested. */
1455 /* Read user password. It is in plain text, but was transmitted
1456 over the encrypted channel so it is not visible to an outside
1457 observer. */
1458 {
1459 int passw_len;
1460 password = packet_get_string(&passw_len);
1461 packet_integrity_check(plen, 4 + passw_len, type);
1462 }
1463
5aecb327 1464#ifdef HAVE_LIBPAM
0183ea1c 1465 pampasswd = password;
549b3eed 1466
1467 pam_retval = pam_authenticate((pam_handle_t *)pamh, 0);
1468 if (pam_retval == PAM_SUCCESS)
0183ea1c 1469 {
549b3eed 1470 log("PAM Password authentication accepted for \"%.100s\"", user);
0183ea1c 1471 authenticated = 1;
1472 break;
1473 } else
1474 {
549b3eed 1475 log("PAM Password authentication for \"%.100s\" failed: %s",
1476 user, pam_strerror((pam_handle_t *)pamh, pam_retval));
0183ea1c 1477 break;
1478 }
5aecb327 1479#else /* HAVE_LIBPAM */
8efc0c15 1480 /* Try authentication with the password. */
1481 if (auth_password(pw, password))
1482 {
1483 /* Successful authentication. */
1484 /* Clear the password from memory. */
1485 memset(password, 0, strlen(password));
1486 xfree(password);
1487 log("Password authentication for %.100s accepted.", user);
1488 authenticated = 1;
1489 break;
1490 }
1491 log("Password authentication for %.100s failed.", user);
1492 memset(password, 0, strlen(password));
1493 xfree(password);
1494 break;
5aecb327 1495#endif /* HAVE_LIBPAM */
8efc0c15 1496
1497 case SSH_CMSG_AUTH_TIS:
1498 /* TIS Authentication is unsupported */
1499 log("TIS authentication disabled.");
1500 break;
1501
1502 default:
1503 /* Any unknown messages will be ignored (and failure returned)
1504 during authentication. */
1505 log("Unknown message during authentication: type %d", type);
1506 break; /* Respond with a failure message. */
1507 }
1508 /* If successfully authenticated, break out of loop. */
1509 if (authenticated)
1510 break;
1511
8efc0c15 1512 if (++authentication_failures >= MAX_AUTH_FAILURES) {
1513 packet_disconnect("Too many authentication failures for %.100s from %.200s",
1514 pw->pw_name, get_canonical_hostname());
1515 }
e1a9c08d 1516 /* Send a message indicating that the authentication attempt failed. */
1517 packet_start(SSH_SMSG_FAILURE);
1518 packet_send();
1519 packet_write_wait();
e35c1dc2 1520
8efc0c15 1521 }
1522
1523 /* Check if the user is logging in as root and root logins are disallowed. */
1524 if (pw->pw_uid == 0 && !options.permit_root_login)
1525 {
1526 if (forced_command)
3028328e 1527 log("Root login accepted for forced command.");
8efc0c15 1528 else
1529 packet_disconnect("ROOT LOGIN REFUSED FROM %.200s",
1530 get_canonical_hostname());
1531 }
1532
5aecb327 1533#ifdef HAVE_LIBPAM
0183ea1c 1534 do_pam_account_and_session(pw->pw_name, password, client_user, get_canonical_hostname());
d813bc69 1535
1536 /* Clean up */
1537 if (client_user != NULL)
1538 xfree(client_user);
1539
1540 if (password != NULL)
1541 {
1542 memset(password, 0, strlen(password));
1543 xfree(password);
1544 }
5aecb327 1545#endif /* HAVE_LIBPAM */
d813bc69 1546
8efc0c15 1547 /* The user has been authenticated and accepted. */
1548 packet_start(SSH_SMSG_SUCCESS);
1549 packet_send();
1550 packet_write_wait();
1551
1552 /* Perform session preparation. */
1553 do_authenticated(pw);
1554}
1555
0183ea1c 1556/* Read authentication messages, but return only failures until */
1557/* max auth attempts exceeded, then disconnect */
1558void eat_packets_and_disconnect(const char *user)
1559{
1560 int authentication_failures = 0;
1561
1562 packet_start(SSH_SMSG_FAILURE);
1563 packet_send();
1564 packet_write_wait();
1565
1566 /* Keep reading packets, and always respond with a failure. This is to
1567 avoid disclosing whether such a user really exists. */
1568 while(1)
1569 {
1570 /* Read a packet. This will not return if the client disconnects. */
1571 int plen;
1572#ifndef SKEY
1573 (void) packet_read(&plen);
1574#else /* SKEY */
1575 int type = packet_read(&plen);
1576 int passw_len;
1577 char *password, *skeyinfo;
1578 if (options.password_authentication &&
1579 options.skey_authentication == 1 &&
1580 type == SSH_CMSG_AUTH_PASSWORD &&
1581 (password = packet_get_string(&passw_len)) != NULL &&
1582 passw_len == 5 &&
1583 strncasecmp(password, "s/key", 5) == 0 &&
1584 (skeyinfo = skey_fake_keyinfo(user)) != NULL )
1585 {
1586 /* Send a fake s/key challenge. */
1587 packet_send_debug(skeyinfo);
1588 }
1589#endif /* SKEY */
0183ea1c 1590 if (++authentication_failures >= MAX_AUTH_FAILURES)
1591 {
1592 packet_disconnect("Too many authentication failures for %.100s from %.200s",
1593 user, get_canonical_hostname());
1594 }
e1a9c08d 1595 /* Send failure. This should be indistinguishable from a failed
1596 authentication. */
1597 packet_start(SSH_SMSG_FAILURE);
1598 packet_send();
1599 packet_write_wait();
0183ea1c 1600 }
1601 /*NOTREACHED*/
1602 abort();
1603}
1604
6a17f9c2 1605/* Remove local Xauthority file. */
1606static void
1607xauthfile_cleanup_proc(void *ignore)
1608{
1609 debug("xauthfile_cleanup_proc called");
1610
1611 if (xauthfile != NULL) {
1612 unlink(xauthfile);
1613 xfree(xauthfile);
1614 xauthfile = NULL;
1615 }
1616}
1617
8efc0c15 1618/* Prepares for an interactive session. This is called after the user has
1619 been successfully authenticated. During this message exchange, pseudo
1620 terminals are allocated, X11, TCP/IP, and authentication agent forwardings
1621 are requested, etc. */
1622
1623void do_authenticated(struct passwd *pw)
1624{
1625 int type;
1626 int compression_level = 0, enable_compression_after_reply = 0;
1627 int have_pty = 0, ptyfd = -1, ttyfd = -1, xauthfd = -1;
1628 int row, col, xpixel, ypixel, screen;
1629 char ttyname[64];
1630 char *command, *term = NULL, *display = NULL, *proto = NULL, *data = NULL;
1631 struct group *grp;
1632 gid_t tty_gid;
1633 mode_t tty_mode;
1634 int n_bytes;
1635
1636 /* Cancel the alarm we set to limit the time taken for authentication. */
1637 alarm(0);
1638
1639 /* Inform the channel mechanism that we are the server side and that
1640 the client may request to connect to any port at all. (The user could
1641 do it anyway, and we wouldn\'t know what is permitted except by the
1642 client telling us, so we can equally well trust the client not to request
1643 anything bogus.) */
1644 channel_permit_all_opens();
1645
1646 /* We stay in this loop until the client requests to execute a shell or a
1647 command. */
1648 while (1)
1649 {
1650 int plen, dlen;
1651
1652 /* Get a packet from the client. */
1653 type = packet_read(&plen);
1654
1655 /* Process the packet. */
1656 switch (type)
1657 {
1658 case SSH_CMSG_REQUEST_COMPRESSION:
1659 packet_integrity_check(plen, 4, type);
1660 compression_level = packet_get_int();
1661 if (compression_level < 1 || compression_level > 9)
1662 {
1663 packet_send_debug("Received illegal compression level %d.",
1664 compression_level);
1665 goto fail;
1666 }
1667 /* Enable compression after we have responded with SUCCESS. */
1668 enable_compression_after_reply = 1;
1669 break;
1670
1671 case SSH_CMSG_REQUEST_PTY:
1672 if (no_pty_flag)
1673 {
1674 debug("Allocating a pty not permitted for this authentication.");
1675 goto fail;
1676 }
1677 if (have_pty)
1678 packet_disconnect("Protocol error: you already have a pty.");
1679
1680 debug("Allocating pty.");
1681
1682 /* Allocate a pty and open it. */
1683 if (!pty_allocate(&ptyfd, &ttyfd, ttyname))
1684 {
1685 error("Failed to allocate pty.");
1686 goto fail;
1687 }
1688
1689 /* Determine the group to make the owner of the tty. */
1690 grp = getgrnam("tty");
1691 if (grp)
1692 {
1693 tty_gid = grp->gr_gid;
1694 tty_mode = S_IRUSR|S_IWUSR|S_IWGRP;
1695 }
1696 else
1697 {
1698 tty_gid = pw->pw_gid;
1699 tty_mode = S_IRUSR|S_IWUSR|S_IWGRP|S_IWOTH;
1700 }
1701
1702 /* Change ownership of the tty. */
1703 if (chown(ttyname, pw->pw_uid, tty_gid) < 0)
1704 fatal("chown(%.100s, %d, %d) failed: %.100s",
1705 ttyname, pw->pw_uid, tty_gid, strerror(errno));
1706 if (chmod(ttyname, tty_mode) < 0)
1707 fatal("chmod(%.100s, 0%o) failed: %.100s",
1708 ttyname, tty_mode, strerror(errno));
1709
1710 /* Get TERM from the packet. Note that the value may be of arbitrary
1711 length. */
1712
1713 term = packet_get_string(&dlen);
1714 packet_integrity_check(dlen, strlen(term), type);
1715 /* packet_integrity_check(plen, 4 + dlen + 4*4 + n_bytes, type); */
1716 /* Remaining bytes */
1717 n_bytes = plen - (4 + dlen + 4*4);
1718
1719 if (strcmp(term, "") == 0)
1720 term = NULL;
1721
1722 /* Get window size from the packet. */
1723 row = packet_get_int();
1724 col = packet_get_int();
1725 xpixel = packet_get_int();
1726 ypixel = packet_get_int();
1727 pty_change_window_size(ptyfd, row, col, xpixel, ypixel);
1728
1729 /* Get tty modes from the packet. */
1730 tty_parse_modes(ttyfd, &n_bytes);
1731 packet_integrity_check(plen, 4 + dlen + 4*4 + n_bytes, type);
1732
1733 /* Indicate that we now have a pty. */
1734 have_pty = 1;
1735 break;
1736
1737 case SSH_CMSG_X11_REQUEST_FORWARDING:
1738 if (!options.x11_forwarding)
1739 {
1740 packet_send_debug("X11 forwarding disabled in server configuration file.");
1741 goto fail;
1742 }
1743#ifdef XAUTH_PATH
1744 if (no_x11_forwarding_flag)
1745 {
1746 packet_send_debug("X11 forwarding not permitted for this authentication.");
1747 goto fail;
1748 }
1749 debug("Received request for X11 forwarding with auth spoofing.");
1750 if (display)
1751 packet_disconnect("Protocol error: X11 display already set.");
1752 {
1753 int proto_len, data_len;
1754 proto = packet_get_string(&proto_len);
1755 data = packet_get_string(&data_len);
1756 packet_integrity_check(plen, 4+proto_len + 4+data_len + 4, type);
1757 }
1758 if (packet_get_protocol_flags() & SSH_PROTOFLAG_SCREEN_NUMBER)
1759 screen = packet_get_int();
1760 else
1761 screen = 0;
1762 display = x11_create_display_inet(screen);
1763 if (!display)
1764 goto fail;
1765
1766 /* Setup to always have a local .Xauthority. */
1767 xauthfile = xmalloc(MAXPATHLEN);
1768 snprintf(xauthfile, MAXPATHLEN, "/tmp/XauthXXXXXX");
1769
1770 if ((xauthfd = mkstemp(xauthfile)) != -1) {
1771 fchown(xauthfd, pw->pw_uid, pw->pw_gid);
1772 close(xauthfd);
6a17f9c2 1773 fatal_add_cleanup(xauthfile_cleanup_proc, NULL);
8efc0c15 1774 }
1775 else {
1776 xfree(xauthfile);
1777 xauthfile = NULL;
1778 }
1779 break;
1780#else /* XAUTH_PATH */
1781 /* No xauth program; we won't accept forwarding with spoofing. */
1782 packet_send_debug("No xauth program; cannot forward with spoofing.");
1783 goto fail;
1784#endif /* XAUTH_PATH */
1785
1786 case SSH_CMSG_AGENT_REQUEST_FORWARDING:
1787 if (no_agent_forwarding_flag)
1788 {
1789 debug("Authentication agent forwarding not permitted for this authentication.");
1790 goto fail;
1791 }
1792 debug("Received authentication agent forwarding request.");
1793 auth_input_request_forwarding(pw);
1794 break;
1795
1796 case SSH_CMSG_PORT_FORWARD_REQUEST:
1797 if (no_port_forwarding_flag)
1798 {
1799 debug("Port forwarding not permitted for this authentication.");
1800 goto fail;
1801 }
1802 debug("Received TCP/IP port forwarding request.");
1803 channel_input_port_forward_request(pw->pw_uid == 0);
1804 break;
1805
1806 case SSH_CMSG_EXEC_SHELL:
1807 /* Set interactive/non-interactive mode. */
1808 packet_set_interactive(have_pty || display != NULL,
1809 options.keepalives);
1810
1811 if (forced_command != NULL)
1812 goto do_forced_command;
1813 debug("Forking shell.");
1814 packet_integrity_check(plen, 0, type);
1815 if (have_pty)
1816 do_exec_pty(NULL, ptyfd, ttyfd, ttyname, pw, term, display, proto,
1817 data);
1818 else
1819 do_exec_no_pty(NULL, pw, display, proto, data);
1820 return;
1821
1822 case SSH_CMSG_EXEC_CMD:
1823 /* Set interactive/non-interactive mode. */
1824 packet_set_interactive(have_pty || display != NULL,
1825 options.keepalives);
1826
1827 if (forced_command != NULL)
1828 goto do_forced_command;
1829 /* Get command from the packet. */
1830 {
1831 int dlen;
1832 command = packet_get_string(&dlen);
1833 debug("Executing command '%.500s'", command);
1834 packet_integrity_check(plen, 4 + dlen, type);
1835 }
1836 if (have_pty)
1837 do_exec_pty(command, ptyfd, ttyfd, ttyname, pw, term, display,
1838 proto, data);
1839 else
1840 do_exec_no_pty(command, pw, display, proto, data);
1841 xfree(command);
1842 return;
1843
1844 case SSH_CMSG_MAX_PACKET_SIZE:
1845 debug("The server does not support limiting packet size.");
1846 goto fail;
1847
1848 default:
1849 /* Any unknown messages in this phase are ignored, and a failure
1850 message is returned. */
1851 log("Unknown packet type received after authentication: %d", type);
1852 goto fail;
1853 }
1854
1855 /* The request was successfully processed. */
1856 packet_start(SSH_SMSG_SUCCESS);
1857 packet_send();
1858 packet_write_wait();
1859
1860 /* Enable compression now that we have replied if appropriate. */
1861 if (enable_compression_after_reply)
1862 {
1863 enable_compression_after_reply = 0;
1864 packet_start_compression(compression_level);
1865 }
1866
1867 continue;
1868
1869 fail:
1870 /* The request failed. */
1871 packet_start(SSH_SMSG_FAILURE);
1872 packet_send();
1873 packet_write_wait();
1874 continue;
1875
1876 do_forced_command:
1877 /* There is a forced command specified for this login. Execute it. */
1878 debug("Executing forced command: %.900s", forced_command);
1879 if (have_pty)
1880 do_exec_pty(forced_command, ptyfd, ttyfd, ttyname, pw, term, display,
1881 proto, data);
1882 else
1883 do_exec_no_pty(forced_command, pw, display, proto, data);
1884 return;
1885 }
1886}
1887
1888/* This is called to fork and execute a command when we have no tty. This
1889 will call do_child from the child, and server_loop from the parent after
1890 setting up file descriptors and such. */
1891
1892void do_exec_no_pty(const char *command, struct passwd *pw,
1893 const char *display, const char *auth_proto,
1894 const char *auth_data)
1895{
1896 int pid;
1897
1898#ifdef USE_PIPES
1899 int pin[2], pout[2], perr[2];
1900 /* Allocate pipes for communicating with the program. */
1901 if (pipe(pin) < 0 || pipe(pout) < 0 || pipe(perr) < 0)
1902 packet_disconnect("Could not create pipes: %.100s",
1903 strerror(errno));
1904#else /* USE_PIPES */
1905 int inout[2], err[2];
1906 /* Uses socket pairs to communicate with the program. */
1907 if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) < 0 ||
1908 socketpair(AF_UNIX, SOCK_STREAM, 0, err) < 0)
1909 packet_disconnect("Could not create socket pairs: %.100s",
1910 strerror(errno));
1911#endif /* USE_PIPES */
1912
1913 setproctitle("%s@notty", pw->pw_name);
1914
1915 /* Fork the child. */
1916 if ((pid = fork()) == 0)
1917 {
1918 /* Child. Reinitialize the log since the pid has changed. */
6a17f9c2 1919 log_init(av0, options.log_level, options.log_facility, log_stderr);
8efc0c15 1920
1921 /* Create a new session and process group since the 4.4BSD setlogin()
1922 affects the entire process group. */
1923 if (setsid() < 0)
1924 error("setsid failed: %.100s", strerror(errno));
1925
1926#ifdef USE_PIPES
1927 /* Redirect stdin. We close the parent side of the socket pair,
1928 and make the child side the standard input. */
1929 close(pin[1]);
1930 if (dup2(pin[0], 0) < 0)
1931 perror("dup2 stdin");
1932 close(pin[0]);
1933
1934 /* Redirect stdout. */
1935 close(pout[0]);
1936 if (dup2(pout[1], 1) < 0)
1937 perror("dup2 stdout");
1938 close(pout[1]);
1939
1940 /* Redirect stderr. */
1941 close(perr[0]);
1942 if (dup2(perr[1], 2) < 0)
1943 perror("dup2 stderr");
1944 close(perr[1]);
1945#else /* USE_PIPES */
1946 /* Redirect stdin, stdout, and stderr. Stdin and stdout will use the
1947 same socket, as some programs (particularly rdist) seem to depend
1948 on it. */
1949 close(inout[1]);
1950 close(err[1]);
1951 if (dup2(inout[0], 0) < 0) /* stdin */
1952 perror("dup2 stdin");
1953 if (dup2(inout[0], 1) < 0) /* stdout. Note: same socket as stdin. */
1954 perror("dup2 stdout");
1955 if (dup2(err[0], 2) < 0) /* stderr */
1956 perror("dup2 stderr");
1957#endif /* USE_PIPES */
1958
1959 /* Do processing for the child (exec command etc). */
1960 do_child(command, pw, NULL, display, auth_proto, auth_data, NULL);
1961 /*NOTREACHED*/
1962 }
1963 if (pid < 0)
1964 packet_disconnect("fork failed: %.100s", strerror(errno));
1965#ifdef USE_PIPES
1966 /* We are the parent. Close the child sides of the pipes. */
1967 close(pin[0]);
1968 close(pout[1]);
1969 close(perr[1]);
1970
1971 /* Enter the interactive session. */
1972 server_loop(pid, pin[1], pout[0], perr[0]);
1973 /* server_loop has closed pin[1], pout[1], and perr[1]. */
1974#else /* USE_PIPES */
1975 /* We are the parent. Close the child sides of the socket pairs. */
1976 close(inout[0]);
1977 close(err[0]);
1978
1979 /* Enter the interactive session. Note: server_loop must be able to handle
1980 the case that fdin and fdout are the same. */
1981 server_loop(pid, inout[1], inout[1], err[1]);
1982 /* server_loop has closed inout[1] and err[1]. */
1983#endif /* USE_PIPES */
1984}
1985
1986struct pty_cleanup_context
1987{
1988 const char *ttyname;
1989 int pid;
1990};
1991
1992/* Function to perform cleanup if we get aborted abnormally (e.g., due to a
1993 dropped connection). */
1994
1995void pty_cleanup_proc(void *context)
1996{
1997 struct pty_cleanup_context *cu = context;
1998
1999 debug("pty_cleanup_proc called");
2000
8efc0c15 2001 /* Record that the user has logged out. */
2002 record_logout(cu->pid, cu->ttyname);
2003
2004 /* Release the pseudo-tty. */
2005 pty_release(cu->ttyname);
2006}
2007
2008/* This is called to fork and execute a command when we have a tty. This
2009 will call do_child from the child, and server_loop from the parent after
2010 setting up file descriptors, controlling tty, updating wtmp, utmp,
2011 lastlog, and other such operations. */
2012
2013void do_exec_pty(const char *command, int ptyfd, int ttyfd,
2014 const char *ttyname, struct passwd *pw, const char *term,
2015 const char *display, const char *auth_proto,
2016 const char *auth_data)
2017{
2018 int pid, fdout;
2019 const char *hostname;
2020 time_t last_login_time;
2021 char buf[100], *time_string;
2022 FILE *f;
2023 char line[256];
2024 struct stat st;
2025 int quiet_login;
2026 struct sockaddr_in from;
2027 int fromlen;
2028 struct pty_cleanup_context cleanup_context;
2029
2030 /* Get remote host name. */
2031 hostname = get_canonical_hostname();
2032
2033 /* Get the time when the user last logged in. Buf will be set to contain
2034 the hostname the last login was from. */
2035 if(!options.use_login) {
2036 last_login_time = get_last_login_time(pw->pw_uid, pw->pw_name,
2037 buf, sizeof(buf));
2038 }
2039
2040 setproctitle("%s@%s", pw->pw_name, strrchr(ttyname, '/') + 1);
2041
2042 /* Fork the child. */
2043 if ((pid = fork()) == 0)
2044 {
2045 pid = getpid();
2046
2047 /* Child. Reinitialize the log because the pid has changed. */
6a17f9c2 2048 log_init(av0, options.log_level, options.log_facility, log_stderr);
8efc0c15 2049
2050 /* Close the master side of the pseudo tty. */
2051 close(ptyfd);
2052
2053 /* Make the pseudo tty our controlling tty. */
2054 pty_make_controlling_tty(&ttyfd, ttyname);
2055
2056 /* Redirect stdin from the pseudo tty. */
2057 if (dup2(ttyfd, fileno(stdin)) < 0)
2058 error("dup2 stdin failed: %.100s", strerror(errno));
2059
2060 /* Redirect stdout to the pseudo tty. */
2061 if (dup2(ttyfd, fileno(stdout)) < 0)
2062 error("dup2 stdin failed: %.100s", strerror(errno));
2063
2064 /* Redirect stderr to the pseudo tty. */
2065 if (dup2(ttyfd, fileno(stderr)) < 0)
2066 error("dup2 stdin failed: %.100s", strerror(errno));
2067
2068 /* Close the extra descriptor for the pseudo tty. */
2069 close(ttyfd);
2070
2071 /* Get IP address of client. This is needed because we want to record
2072 where the user logged in from. If the connection is not a socket,
2073 let the ip address be 0.0.0.0. */
2074 memset(&from, 0, sizeof(from));
2075 if (packet_get_connection_in() == packet_get_connection_out())
2076 {
2077 fromlen = sizeof(from);
2078 if (getpeername(packet_get_connection_in(),
2079 (struct sockaddr *)&from, &fromlen) < 0)
2080 fatal("getpeername: %.100s", strerror(errno));
2081 }
2082
2083 /* Record that there was a login on that terminal. */
2084 record_login(pid, ttyname, pw->pw_name, pw->pw_uid, hostname,
2085 &from);
2086
2087 /* Check if .hushlogin exists. */
2088 snprintf(line, sizeof line, "%.200s/.hushlogin", pw->pw_dir);
2089 quiet_login = stat(line, &st) >= 0;
e1a9c08d 2090
2091#ifdef HAVE_LIBPAM
2092 /* output the results of the pamconv() */
2093 if (!quiet_login && pamconv_msg != NULL)
2094 fprintf(stderr, pamconv_msg);
2095#endif
2096
8efc0c15 2097 /* If the user has logged in before, display the time of last login.
2098 However, don't display anything extra if a command has been
2099 specified (so that ssh can be used to execute commands on a remote
2100 machine without users knowing they are going to another machine).
2101 Login(1) will do this for us as well, so check if login(1) is used */
2102 if (command == NULL && last_login_time != 0 && !quiet_login &&
2103 !options.use_login)
2104 {
2105 /* Convert the date to a string. */
2106 time_string = ctime(&last_login_time);
2107 /* Remove the trailing newline. */
2108 if (strchr(time_string, '\n'))
2109 *strchr(time_string, '\n') = 0;
2110 /* Display the last login time. Host if displayed if known. */
2111 if (strcmp(buf, "") == 0)
2112 printf("Last login: %s\r\n", time_string);
2113 else
2114 printf("Last login: %s from %s\r\n", time_string, buf);
2115 }
2116
2117 /* Print /etc/motd unless a command was specified or printing it was
2118 disabled in server options or login(1) will be used. Note that
2119 some machines appear to print it in /etc/profile or similar. */
2120 if (command == NULL && options.print_motd && !quiet_login &&
2121 !options.use_login)
2122 {
2123 /* Print /etc/motd if it exists. */
2124 f = fopen("/etc/motd", "r");
2125 if (f)
2126 {
2127 while (fgets(line, sizeof(line), f))
2128 fputs(line, stdout);
2129 fclose(f);
2130 }
2131 }
2132
2133 /* Do common processing for the child, such as execing the command. */
2134 do_child(command, pw, term, display, auth_proto, auth_data, ttyname);
2135 /*NOTREACHED*/
2136 }
2137 if (pid < 0)
2138 packet_disconnect("fork failed: %.100s", strerror(errno));
2139 /* Parent. Close the slave side of the pseudo tty. */
2140 close(ttyfd);
2141
2142 /* Create another descriptor of the pty master side for use as the standard
2143 input. We could use the original descriptor, but this simplifies code
2144 in server_loop. The descriptor is bidirectional. */
2145 fdout = dup(ptyfd);
2146 if (fdout < 0)
2147 packet_disconnect("dup failed: %.100s", strerror(errno));
2148
2149 /* Add a cleanup function to clear the utmp entry and record logout time
2150 in case we call fatal() (e.g., the connection gets closed). */
2151 cleanup_context.pid = pid;
2152 cleanup_context.ttyname = ttyname;
2153 fatal_add_cleanup(pty_cleanup_proc, (void *)&cleanup_context);
2154
2155 /* Enter interactive session. */
2156 server_loop(pid, ptyfd, fdout, -1);
2157 /* server_loop has not closed ptyfd and fdout. */
2158
2159 /* Cancel the cleanup function. */
2160 fatal_remove_cleanup(pty_cleanup_proc, (void *)&cleanup_context);
2161
2162 /* Record that the user has logged out. */
2163 record_logout(pid, ttyname);
2164
2165 /* Release the pseudo-tty. */
2166 pty_release(ttyname);
2167
2168 /* Close the server side of the socket pairs. We must do this after the
2169 pty cleanup, so that another process doesn't get this pty while we're
2170 still cleaning up. */
2171 close(ptyfd);
2172 close(fdout);
2173}
2174
2175/* Sets the value of the given variable in the environment. If the variable
2176 already exists, its value is overriden. */
2177
2178void child_set_env(char ***envp, unsigned int *envsizep, const char *name,
2179 const char *value)
2180{
2181 unsigned int i, namelen;
2182 char **env;
2183
2184 /* Find the slot where the value should be stored. If the variable already
2185 exists, we reuse the slot; otherwise we append a new slot at the end
2186 of the array, expanding if necessary. */
2187 env = *envp;
2188 namelen = strlen(name);
2189 for (i = 0; env[i]; i++)
2190 if (strncmp(env[i], name, namelen) == 0 && env[i][namelen] == '=')
2191 break;
2192 if (env[i])
2193 {
2194 /* Name already exists. Reuse the slot. */
2195 xfree(env[i]);
2196 }
2197 else
2198 {
2199 /* New variable. Expand the array if necessary. */
2200 if (i >= (*envsizep) - 1)
2201 {
2202 (*envsizep) += 50;
2203 env = (*envp) = xrealloc(env, (*envsizep) * sizeof(char *));
2204 }
2205
2206 /* Need to set the NULL pointer at end of array beyond the new
2207 slot. */
2208 env[i + 1] = NULL;
2209 }
2210
2211 /* Allocate space and format the variable in the appropriate slot. */
2212 env[i] = xmalloc(strlen(name) + 1 + strlen(value) + 1);
2213 snprintf(env[i], strlen(name) + 1 + strlen(value) + 1, "%s=%s", name, value);
2214}
2215
2216/* Reads environment variables from the given file and adds/overrides them
2217 into the environment. If the file does not exist, this does nothing.
2218 Otherwise, it must consist of empty lines, comments (line starts with '#')
2219 and assignments of the form name=value. No other forms are allowed. */
2220
2221void read_environment_file(char ***env, unsigned int *envsize,
2222 const char *filename)
2223{
2224 FILE *f;
2225 char buf[4096];
2226 char *cp, *value;
2227
2228 /* Open the environment file. */
2229 f = fopen(filename, "r");
2230 if (!f)
2231 return; /* Not found. */
2232
2233 /* Process each line. */
2234 while (fgets(buf, sizeof(buf), f))
2235 {
2236 /* Skip leading whitespace. */
2237 for (cp = buf; *cp == ' ' || *cp == '\t'; cp++)
2238 ;
2239
2240 /* Ignore empty and comment lines. */
2241 if (!*cp || *cp == '#' || *cp == '\n')
2242 continue;
2243
2244 /* Remove newline. */
2245 if (strchr(cp, '\n'))
2246 *strchr(cp, '\n') = '\0';
2247
2248 /* Find the equals sign. Its lack indicates badly formatted line. */
2249 value = strchr(cp, '=');
2250 if (value == NULL)
2251 {
2252 fprintf(stderr, "Bad line in %.100s: %.200s\n", filename, buf);
2253 continue;
2254 }
2255
2256 /* Replace the equals sign by nul, and advance value to the value
2257 string. */
2258 *value = '\0';
2259 value++;
2260
2261 /* Set the value in environment. */
2262 child_set_env(env, envsize, cp, value);
2263 }
2264
2265 fclose(f);
2266}
2267
2268/* Performs common processing for the child, such as setting up the
2269 environment, closing extra file descriptors, setting the user and group
2270 ids, and executing the command or shell. */
2271
2272void do_child(const char *command, struct passwd *pw, const char *term,
2273 const char *display, const char *auth_proto,
2274 const char *auth_data, const char *ttyname)
2275{
2276 const char *shell, *cp = NULL;
2277 char buf[256];
2278 FILE *f;
2279 unsigned int envsize, i;
2280 char **env;
2281 extern char **environ;
2282 struct stat st;
2283 char *argv[10];
2284
e1a9c08d 2285#ifndef HAVE_LIBPAM /* pam_nologin handles this */
8efc0c15 2286 /* Check /etc/nologin. */
2287 f = fopen("/etc/nologin", "r");
2288 if (f)
2289 { /* /etc/nologin exists. Print its contents and exit. */
2290 while (fgets(buf, sizeof(buf), f))
2291 fputs(buf, stderr);
2292 fclose(f);
2293 if (pw->pw_uid != 0)
2294 exit(254);
2295 }
e35c1dc2 2296#endif /* HAVE_LIBPAM */
2297
2298#ifdef HAVE_SETLOGIN
2299 /* Set login name in the kernel. */
2300 if (setlogin(pw->pw_name) < 0)
2301 error("setlogin failed: %s", strerror(errno));
2302#endif /* HAVE_SETLOGIN */
8efc0c15 2303
8efc0c15 2304 /* Set uid, gid, and groups. */
2305 /* Login(1) does this as well, and it needs uid 0 for the "-h" switch,
2306 so we let login(1) to this for us. */
2307 if(!options.use_login) {
2308 if (getuid() == 0 || geteuid() == 0)
2309 {
2310 if (setgid(pw->pw_gid) < 0)
2311 {
2312 perror("setgid");
2313 exit(1);
2314 }
2315 /* Initialize the group list. */
2316 if (initgroups(pw->pw_name, pw->pw_gid) < 0)
2317 {
2318 perror("initgroups");
2319 exit(1);
2320 }
2321 endgrent();
2322
2323 /* Permanently switch to the desired uid. */
2324 permanently_set_uid(pw->pw_uid);
2325 }
2326
2327 if (getuid() != pw->pw_uid || geteuid() != pw->pw_uid)
2328 fatal("Failed to set uids to %d.", (int)pw->pw_uid);
2329 }
2330
2331 /* Get the shell from the password data. An empty shell field is legal,
2332 and means /bin/sh. */
2333 shell = (pw->pw_shell[0] == '\0') ? _PATH_BSHELL : pw->pw_shell;
2334
2335#ifdef AFS
2336 /* Try to get AFS tokens for the local cell. */
2337 if (k_hasafs()) {
2338 char cell[64];
2339
2340 if (k_afs_cell_of_file(pw->pw_dir, cell, sizeof(cell)) == 0)
2341 krb_afslog(cell, 0);
2342
2343 krb_afslog(0, 0);
2344 }
2345#endif /* AFS */
2346
2347 /* Initialize the environment. In the first part we allocate space for
2348 all environment variables. */
2349 envsize = 100;
2350 env = xmalloc(envsize * sizeof(char *));
2351 env[0] = NULL;
2352
2353 if(!options.use_login) {
2354 /* Set basic environment. */
2355 child_set_env(&env, &envsize, "USER", pw->pw_name);
2356 child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
2357 child_set_env(&env, &envsize, "HOME", pw->pw_dir);
2358 child_set_env(&env, &envsize, "PATH", _PATH_STDPATH);
2359
2360 snprintf(buf, sizeof buf, "%.200s/%.50s",
2361 _PATH_MAILDIR, pw->pw_name);
2362 child_set_env(&env, &envsize, "MAIL", buf);
2363
2364 /* Normal systems set SHELL by default. */
2365 child_set_env(&env, &envsize, "SHELL", shell);
2366 }
2367
2368 /* Let it inherit timezone if we have one. */
2369 if (getenv("TZ"))
2370 child_set_env(&env, &envsize, "TZ", getenv("TZ"));
2371
2372 /* Set custom environment options from RSA authentication. */
2373 while (custom_environment)
2374 {
2375 struct envstring *ce = custom_environment;
2376 char *s = ce->s;
2377 int i;
2378 for (i = 0; s[i] != '=' && s[i]; i++)
2379 ;
2380 if (s[i] == '=')
2381 {
2382 s[i] = 0;
2383 child_set_env(&env, &envsize, s, s + i + 1);
2384 }
2385 custom_environment = ce->next;
2386 xfree(ce->s);
2387 xfree(ce);
2388 }
2389
2390 /* Set SSH_CLIENT. */
2391 snprintf(buf, sizeof buf, "%.50s %d %d",
2392 get_remote_ipaddr(), get_remote_port(), options.port);
2393 child_set_env(&env, &envsize, "SSH_CLIENT", buf);
2394
2395 /* Set SSH_TTY if we have a pty. */
2396 if (ttyname)
2397 child_set_env(&env, &envsize, "SSH_TTY", ttyname);
2398
2399 /* Set TERM if we have a pty. */
2400 if (term)
2401 child_set_env(&env, &envsize, "TERM", term);
2402
2403 /* Set DISPLAY if we have one. */
2404 if (display)
2405 child_set_env(&env, &envsize, "DISPLAY", display);
2406
2407#ifdef KRB4
6a17f9c2 2408 {
e35c1dc2 2409 extern char *ticket;
2410
2411 if (ticket)
2412 child_set_env(&env, &envsize, "KRBTKFILE", ticket);
6a17f9c2 2413 }
8efc0c15 2414#endif /* KRB4 */
2415
bb0dd7f6 2416#ifdef HAVE_LIBPAM
2417 /* Pull in any environment variables that may have been set by PAM. */
2418 {
2419 char *equal_sign, var_name[256], var_val[256];
2420 long this_var;
50da1126 2421 char **pam_env = pam_getenvlist((pam_handle_t *)pamh);
bb0dd7f6 2422 for(this_var = 0; pam_env && pam_env[this_var]; this_var++)
2423 {
242588e6 2424 if(strlen(pam_env[this_var]) < (sizeof(var_name) - 1))
bb0dd7f6 2425 if((equal_sign = strstr(pam_env[this_var], "=")) != NULL)
2426 {
2427 memset(var_name, 0, sizeof(var_name));
2428 memset(var_val, 0, sizeof(var_val));
2429 strncpy(var_name, pam_env[this_var],
2430 equal_sign - pam_env[this_var]);
2431 strcpy(var_val, equal_sign + 1);
2432 child_set_env(&env, &envsize, var_name, var_val);
2433 }
2434 }
2435 }
2436#endif /* HAVE_LIBPAM */
2437
8efc0c15 2438 /* Set XAUTHORITY to always be a local file. */
2439 if (xauthfile)
2440 child_set_env(&env, &envsize, "XAUTHORITY", xauthfile);
2441
2442 /* Set variable for forwarded authentication connection, if we have one. */
2443 if (auth_get_socket_name() != NULL)
2444 child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
2445 auth_get_socket_name());
e35c1dc2 2446
8efc0c15 2447 /* Read $HOME/.ssh/environment. */
2448 if(!options.use_login) {
2449 snprintf(buf, sizeof buf, "%.200s/.ssh/environment", pw->pw_dir);
2450 read_environment_file(&env, &envsize, buf);
2451 }
2452
2453 /* If debugging, dump the environment to stderr. */
2454 if (debug_flag)
2455 {
2456 fprintf(stderr, "Environment:\n");
2457 for (i = 0; env[i]; i++)
2458 fprintf(stderr, " %.200s\n", env[i]);
2459 }
2460
2461 /* Close the connection descriptors; note that this is the child, and the
2462 server will still have the socket open, and it is important that we
2463 do not shutdown it. Note that the descriptors cannot be closed before
2464 building the environment, as we call get_remote_ipaddr there. */
2465 if (packet_get_connection_in() == packet_get_connection_out())
2466 close(packet_get_connection_in());
2467 else
2468 {
2469 close(packet_get_connection_in());
2470 close(packet_get_connection_out());
2471 }
2472 /* Close all descriptors related to channels. They will still remain
2473 open in the parent. */
2474 channel_close_all();
2475
2476 /* Close any extra file descriptors. Note that there may still be
2477 descriptors left by system functions. They will be closed later. */
2478 endpwent();
2479 endhostent();
2480
2481 /* Close any extra open file descriptors so that we don\'t have them
2482 hanging around in clients. Note that we want to do this after
2483 initgroups, because at least on Solaris 2.3 it leaves file descriptors
2484 open. */
2485 for (i = 3; i < 64; i++)
2486 close(i);
2487
2488 /* Change current directory to the user\'s home directory. */
2489 if (chdir(pw->pw_dir) < 0)
2490 fprintf(stderr, "Could not chdir to home directory %s: %s\n",
2491 pw->pw_dir, strerror(errno));
2492
2493 /* Must take new environment into use so that .ssh/rc, /etc/sshrc and
2494 xauth are run in the proper environment. */
2495 environ = env;
2496
2497 /* Run $HOME/.ssh/rc, /etc/sshrc, or xauth (whichever is found first
2498 in this order). */
2499 if(!options.use_login) {
2500 if (stat(SSH_USER_RC, &st) >= 0)
2501 {
2502 if (debug_flag)
2503 fprintf(stderr, "Running /bin/sh %s\n", SSH_USER_RC);
2504
2505 f = popen("/bin/sh " SSH_USER_RC, "w");
2506 if (f)
2507 {
2508 if (auth_proto != NULL && auth_data != NULL)
2509 fprintf(f, "%s %s\n", auth_proto, auth_data);
2510 pclose(f);
2511 }
2512 else
2513 fprintf(stderr, "Could not run %s\n", SSH_USER_RC);
2514 }
2515 else
2516 if (stat(SSH_SYSTEM_RC, &st) >= 0)
2517 {
2518 if (debug_flag)
2519 fprintf(stderr, "Running /bin/sh %s\n", SSH_SYSTEM_RC);
2520
2521 f = popen("/bin/sh " SSH_SYSTEM_RC, "w");
2522 if (f)
2523 {
2524 if (auth_proto != NULL && auth_data != NULL)
2525 fprintf(f, "%s %s\n", auth_proto, auth_data);
2526 pclose(f);
2527 }
2528 else
2529 fprintf(stderr, "Could not run %s\n", SSH_SYSTEM_RC);
2530 }
2531#ifdef XAUTH_PATH
2532 else
2533 {
2534 /* Add authority data to .Xauthority if appropriate. */
2535 if (auth_proto != NULL && auth_data != NULL)
2536 {
2537 if (debug_flag)
2538 fprintf(stderr, "Running %.100s add %.100s %.100s %.100s\n",
2539 XAUTH_PATH, display, auth_proto, auth_data);
2540
2541 f = popen(XAUTH_PATH " -q -", "w");
2542 if (f)
2543 {
2544 fprintf(f, "add %s %s %s\n", display, auth_proto, auth_data);
2545 fclose(f);
2546 }
2547 else
2548 fprintf(stderr, "Could not run %s -q -\n", XAUTH_PATH);
2549 }
2550 }
2551#endif /* XAUTH_PATH */
2552
2553 /* Get the last component of the shell name. */
2554 cp = strrchr(shell, '/');
2555 if (cp)
2556 cp++;
2557 else
2558 cp = shell;
2559 }
2560
2561 /* If we have no command, execute the shell. In this case, the shell name
2562 to be passed in argv[0] is preceded by '-' to indicate that this is
2563 a login shell. */
2564 if (!command)
2565 {
2566 if(!options.use_login) {
2567 char buf[256];
2568
2569 /* Check for mail if we have a tty and it was enabled in server options. */
2570 if (ttyname && options.check_mail) {
2571 char *mailbox;
2572 struct stat mailstat;
2573 mailbox = getenv("MAIL");
2574 if(mailbox != NULL) {
2575 if(stat(mailbox, &mailstat) != 0 || mailstat.st_size == 0) {
2576 printf("No mail.\n");
2577 } else if(mailstat.st_mtime < mailstat.st_atime) {
2578 printf("You have mail.\n");
2579 } else {
2580 printf("You have new mail.\n");
2581 }
2582 }
2583 }
2584 /* Start the shell. Set initial character to '-'. */
2585 buf[0] = '-';
2586 strncpy(buf + 1, cp, sizeof(buf) - 1);
2587 buf[sizeof(buf) - 1] = 0;
2588 /* Execute the shell. */
2589 argv[0] = buf;
2590 argv[1] = NULL;
2591 execve(shell, argv, env);
2592 /* Executing the shell failed. */
2593 perror(shell);
2594 exit(1);
2595
2596 } else {
2597 /* Launch login(1). */
2598
e1a9c08d 2599 execl(LOGIN_PROGRAM, "login", "-h", get_remote_ipaddr(), "-p", "-f", "--", pw->pw_name, NULL);
8efc0c15 2600
2601 /* Login couldn't be executed, die. */
2602
2603 perror("login");
2604 exit(1);
2605 }
2606 }
2607
2608 /* Execute the command using the user's shell. This uses the -c option
2609 to execute the command. */
2610 argv[0] = (char *)cp;
2611 argv[1] = "-c";
2612 argv[2] = (char *)command;
2613 argv[3] = NULL;
2614 execve(shell, argv, env);
2615 perror(shell);
2616 exit(1);
2617}
This page took 0.393062 seconds and 5 git commands to generate.