1 /* $OpenBSD: session.c,v 1.330 2022/02/08 08:59:12 dtucker Exp $ */
2 /*
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 *
6 * As far as I am concerned, the code I have written for this software
7 * can be used freely for any purpose. Any derived versions of this
8 * software must be clearly marked as such, and if the derived work is
9 * incompatible with the protocol description in the RFC file, it must be
10 * called by a name other than "ssh" or "Secure Shell".
11 *
12 * SSH2 support by Markus Friedl.
13 * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 #include "includes.h"
37 __RCSID("$FreeBSD: stable/12/crypto/openssh/session.c 372602 2022-10-07 14:06:39Z git2svn $");
38
39 #include <sys/types.h>
40 #ifdef HAVE_SYS_STAT_H
41 # include <sys/stat.h>
42 #endif
43 #include <sys/socket.h>
44 #include <sys/un.h>
45 #include <sys/wait.h>
46
47 #include <arpa/inet.h>
48
49 #include <ctype.h>
50 #include <errno.h>
51 #include <fcntl.h>
52 #include <grp.h>
53 #include <netdb.h>
54 #ifdef HAVE_PATHS_H
55 #include <paths.h>
56 #endif
57 #include <pwd.h>
58 #include <signal.h>
59 #include <stdio.h>
60 #include <stdlib.h>
61 #include <string.h>
62 #include <stdarg.h>
63 #include <unistd.h>
64 #include <limits.h>
65
66 #include "openbsd-compat/sys-queue.h"
67 #include "xmalloc.h"
68 #include "ssh.h"
69 #include "ssh2.h"
70 #include "sshpty.h"
71 #include "packet.h"
72 #include "sshbuf.h"
73 #include "ssherr.h"
74 #include "match.h"
75 #include "uidswap.h"
76 #include "compat.h"
77 #include "channels.h"
78 #include "sshkey.h"
79 #include "cipher.h"
80 #ifdef GSSAPI
81 #include "ssh-gss.h"
82 #endif
83 #include "hostfile.h"
84 #include "auth.h"
85 #include "auth-options.h"
86 #include "authfd.h"
87 #include "pathnames.h"
88 #include "log.h"
89 #include "misc.h"
90 #include "servconf.h"
91 #include "sshlogin.h"
92 #include "serverloop.h"
93 #include "canohost.h"
94 #include "session.h"
95 #include "kex.h"
96 #include "monitor_wrap.h"
97 #include "sftp.h"
98 #include "atomicio.h"
99
100 #if defined(KRB5) && defined(USE_AFS)
101 #include <kafs.h>
102 #endif
103
104 #ifdef WITH_SELINUX
105 #include <selinux/selinux.h>
106 #endif
107
108 #define IS_INTERNAL_SFTP(c) \
109 (!strncmp(c, INTERNAL_SFTP_NAME, sizeof(INTERNAL_SFTP_NAME) - 1) && \
110 (c[sizeof(INTERNAL_SFTP_NAME) - 1] == '\0' || \
111 c[sizeof(INTERNAL_SFTP_NAME) - 1] == ' ' || \
112 c[sizeof(INTERNAL_SFTP_NAME) - 1] == '\t'))
113
114 /* func */
115
116 Session *session_new(void);
117 void session_set_fds(struct ssh *, Session *, int, int, int, int, int);
118 void session_pty_cleanup(Session *);
119 void session_proctitle(Session *);
120 int session_setup_x11fwd(struct ssh *, Session *);
121 int do_exec_pty(struct ssh *, Session *, const char *);
122 int do_exec_no_pty(struct ssh *, Session *, const char *);
123 int do_exec(struct ssh *, Session *, const char *);
124 void do_login(struct ssh *, Session *, const char *);
125 void do_child(struct ssh *, Session *, const char *);
126 void do_motd(void);
127 int check_quietlogin(Session *, const char *);
128
129 static void do_authenticated2(struct ssh *, Authctxt *);
130
131 static int session_pty_req(struct ssh *, Session *);
132
133 /* import */
134 extern ServerOptions options;
135 extern char *__progname;
136 extern int debug_flag;
137 extern u_int utmp_len;
138 extern int startup_pipe;
139 extern void destroy_sensitive_data(void);
140 extern struct sshbuf *loginmsg;
141 extern struct sshauthopt *auth_opts;
142 extern char *tun_fwd_ifnames; /* serverloop.c */
143
144 /* original command from peer. */
145 const char *original_command = NULL;
146
147 /* data */
148 static int sessions_first_unused = -1;
149 static int sessions_nalloc = 0;
150 static Session *sessions = NULL;
151
152 #define SUBSYSTEM_NONE 0
153 #define SUBSYSTEM_EXT 1
154 #define SUBSYSTEM_INT_SFTP 2
155 #define SUBSYSTEM_INT_SFTP_ERROR 3
156
157 #ifdef HAVE_LOGIN_CAP
158 login_cap_t *lc;
159 #endif
160
161 static int is_child = 0;
162 static int in_chroot = 0;
163
164 /* File containing userauth info, if ExposeAuthInfo set */
165 static char *auth_info_file = NULL;
166
167 /* Name and directory of socket for authentication agent forwarding. */
168 static char *auth_sock_name = NULL;
169 static char *auth_sock_dir = NULL;
170
171 /* removes the agent forwarding socket */
172
173 static void
auth_sock_cleanup_proc(struct passwd * pw)174 auth_sock_cleanup_proc(struct passwd *pw)
175 {
176 if (auth_sock_name != NULL) {
177 temporarily_use_uid(pw);
178 unlink(auth_sock_name);
179 rmdir(auth_sock_dir);
180 auth_sock_name = NULL;
181 restore_uid();
182 }
183 }
184
185 static int
auth_input_request_forwarding(struct ssh * ssh,struct passwd * pw)186 auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
187 {
188 Channel *nc;
189 int sock = -1;
190
191 if (auth_sock_name != NULL) {
192 error("authentication forwarding requested twice.");
193 return 0;
194 }
195
196 /* Temporarily drop privileged uid for mkdir/bind. */
197 temporarily_use_uid(pw);
198
199 /* Allocate a buffer for the socket name, and format the name. */
200 auth_sock_dir = xstrdup("/tmp/ssh-XXXXXXXXXX");
201
202 /* Create private directory for socket */
203 if (mkdtemp(auth_sock_dir) == NULL) {
204 ssh_packet_send_debug(ssh, "Agent forwarding disabled: "
205 "mkdtemp() failed: %.100s", strerror(errno));
206 restore_uid();
207 free(auth_sock_dir);
208 auth_sock_dir = NULL;
209 goto authsock_err;
210 }
211
212 xasprintf(&auth_sock_name, "%s/agent.%ld",
213 auth_sock_dir, (long) getpid());
214
215 /* Start a Unix listener on auth_sock_name. */
216 sock = unix_listener(auth_sock_name, SSH_LISTEN_BACKLOG, 0);
217
218 /* Restore the privileged uid. */
219 restore_uid();
220
221 /* Check for socket/bind/listen failure. */
222 if (sock < 0)
223 goto authsock_err;
224
225 /* Allocate a channel for the authentication agent socket. */
226 nc = channel_new(ssh, "auth socket",
227 SSH_CHANNEL_AUTH_SOCKET, sock, sock, -1,
228 CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
229 0, "auth socket", 1);
230 nc->path = xstrdup(auth_sock_name);
231 return 1;
232
233 authsock_err:
234 free(auth_sock_name);
235 if (auth_sock_dir != NULL) {
236 temporarily_use_uid(pw);
237 rmdir(auth_sock_dir);
238 restore_uid();
239 free(auth_sock_dir);
240 }
241 if (sock != -1)
242 close(sock);
243 auth_sock_name = NULL;
244 auth_sock_dir = NULL;
245 return 0;
246 }
247
248 static void
display_loginmsg(void)249 display_loginmsg(void)
250 {
251 int r;
252
253 if (sshbuf_len(loginmsg) == 0)
254 return;
255 if ((r = sshbuf_put_u8(loginmsg, 0)) != 0)
256 fatal_fr(r, "sshbuf_put_u8");
257 printf("%s", (char *)sshbuf_ptr(loginmsg));
258 sshbuf_reset(loginmsg);
259 }
260
261 static void
prepare_auth_info_file(struct passwd * pw,struct sshbuf * info)262 prepare_auth_info_file(struct passwd *pw, struct sshbuf *info)
263 {
264 int fd = -1, success = 0;
265
266 if (!options.expose_userauth_info || info == NULL)
267 return;
268
269 temporarily_use_uid(pw);
270 auth_info_file = xstrdup("/tmp/sshauth.XXXXXXXXXXXXXXX");
271 if ((fd = mkstemp(auth_info_file)) == -1) {
272 error_f("mkstemp: %s", strerror(errno));
273 goto out;
274 }
275 if (atomicio(vwrite, fd, sshbuf_mutable_ptr(info),
276 sshbuf_len(info)) != sshbuf_len(info)) {
277 error_f("write: %s", strerror(errno));
278 goto out;
279 }
280 if (close(fd) != 0) {
281 error_f("close: %s", strerror(errno));
282 goto out;
283 }
284 success = 1;
285 out:
286 if (!success) {
287 if (fd != -1)
288 close(fd);
289 free(auth_info_file);
290 auth_info_file = NULL;
291 }
292 restore_uid();
293 }
294
295 static void
set_fwdpermit_from_authopts(struct ssh * ssh,const struct sshauthopt * opts)296 set_fwdpermit_from_authopts(struct ssh *ssh, const struct sshauthopt *opts)
297 {
298 char *tmp, *cp, *host;
299 int port;
300 size_t i;
301
302 if ((options.allow_tcp_forwarding & FORWARD_LOCAL) != 0) {
303 channel_clear_permission(ssh, FORWARD_USER, FORWARD_LOCAL);
304 for (i = 0; i < auth_opts->npermitopen; i++) {
305 tmp = cp = xstrdup(auth_opts->permitopen[i]);
306 /* This shouldn't fail as it has already been checked */
307 if ((host = hpdelim2(&cp, NULL)) == NULL)
308 fatal_f("internal error: hpdelim");
309 host = cleanhostname(host);
310 if (cp == NULL || (port = permitopen_port(cp)) < 0)
311 fatal_f("internal error: permitopen port");
312 channel_add_permission(ssh,
313 FORWARD_USER, FORWARD_LOCAL, host, port);
314 free(tmp);
315 }
316 }
317 if ((options.allow_tcp_forwarding & FORWARD_REMOTE) != 0) {
318 channel_clear_permission(ssh, FORWARD_USER, FORWARD_REMOTE);
319 for (i = 0; i < auth_opts->npermitlisten; i++) {
320 tmp = cp = xstrdup(auth_opts->permitlisten[i]);
321 /* This shouldn't fail as it has already been checked */
322 if ((host = hpdelim(&cp)) == NULL)
323 fatal_f("internal error: hpdelim");
324 host = cleanhostname(host);
325 if (cp == NULL || (port = permitopen_port(cp)) < 0)
326 fatal_f("internal error: permitlisten port");
327 channel_add_permission(ssh,
328 FORWARD_USER, FORWARD_REMOTE, host, port);
329 free(tmp);
330 }
331 }
332 }
333
334 void
do_authenticated(struct ssh * ssh,Authctxt * authctxt)335 do_authenticated(struct ssh *ssh, Authctxt *authctxt)
336 {
337 setproctitle("%s", authctxt->pw->pw_name);
338
339 auth_log_authopts("active", auth_opts, 0);
340
341 /* setup the channel layer */
342 /* XXX - streamlocal? */
343 set_fwdpermit_from_authopts(ssh, auth_opts);
344
345 if (!auth_opts->permit_port_forwarding_flag ||
346 options.disable_forwarding) {
347 channel_disable_admin(ssh, FORWARD_LOCAL);
348 channel_disable_admin(ssh, FORWARD_REMOTE);
349 } else {
350 if ((options.allow_tcp_forwarding & FORWARD_LOCAL) == 0)
351 channel_disable_admin(ssh, FORWARD_LOCAL);
352 else
353 channel_permit_all(ssh, FORWARD_LOCAL);
354 if ((options.allow_tcp_forwarding & FORWARD_REMOTE) == 0)
355 channel_disable_admin(ssh, FORWARD_REMOTE);
356 else
357 channel_permit_all(ssh, FORWARD_REMOTE);
358 }
359 auth_debug_send(ssh);
360
361 prepare_auth_info_file(authctxt->pw, authctxt->session_info);
362
363 do_authenticated2(ssh, authctxt);
364
365 do_cleanup(ssh, authctxt);
366 }
367
368 /* Check untrusted xauth strings for metacharacters */
369 static int
xauth_valid_string(const char * s)370 xauth_valid_string(const char *s)
371 {
372 size_t i;
373
374 for (i = 0; s[i] != '\0'; i++) {
375 if (!isalnum((u_char)s[i]) &&
376 s[i] != '.' && s[i] != ':' && s[i] != '/' &&
377 s[i] != '-' && s[i] != '_')
378 return 0;
379 }
380 return 1;
381 }
382
383 #define USE_PIPES 1
384 /*
385 * This is called to fork and execute a command when we have no tty. This
386 * will call do_child from the child, and server_loop from the parent after
387 * setting up file descriptors and such.
388 */
389 int
do_exec_no_pty(struct ssh * ssh,Session * s,const char * command)390 do_exec_no_pty(struct ssh *ssh, Session *s, const char *command)
391 {
392 pid_t pid;
393 #ifdef USE_PIPES
394 int pin[2], pout[2], perr[2];
395
396 if (s == NULL)
397 fatal("do_exec_no_pty: no session");
398
399 /* Allocate pipes for communicating with the program. */
400 if (pipe(pin) == -1) {
401 error_f("pipe in: %.100s", strerror(errno));
402 return -1;
403 }
404 if (pipe(pout) == -1) {
405 error_f("pipe out: %.100s", strerror(errno));
406 close(pin[0]);
407 close(pin[1]);
408 return -1;
409 }
410 if (pipe(perr) == -1) {
411 error_f("pipe err: %.100s", strerror(errno));
412 close(pin[0]);
413 close(pin[1]);
414 close(pout[0]);
415 close(pout[1]);
416 return -1;
417 }
418 #else
419 int inout[2], err[2];
420
421 if (s == NULL)
422 fatal("do_exec_no_pty: no session");
423
424 /* Uses socket pairs to communicate with the program. */
425 if (socketpair(AF_UNIX, SOCK_STREAM, 0, inout) == -1) {
426 error_f("socketpair #1: %.100s", strerror(errno));
427 return -1;
428 }
429 if (socketpair(AF_UNIX, SOCK_STREAM, 0, err) == -1) {
430 error_f("socketpair #2: %.100s", strerror(errno));
431 close(inout[0]);
432 close(inout[1]);
433 return -1;
434 }
435 #endif
436
437 session_proctitle(s);
438
439 /* Fork the child. */
440 switch ((pid = fork())) {
441 case -1:
442 error_f("fork: %.100s", strerror(errno));
443 #ifdef USE_PIPES
444 close(pin[0]);
445 close(pin[1]);
446 close(pout[0]);
447 close(pout[1]);
448 close(perr[0]);
449 close(perr[1]);
450 #else
451 close(inout[0]);
452 close(inout[1]);
453 close(err[0]);
454 close(err[1]);
455 #endif
456 return -1;
457 case 0:
458 is_child = 1;
459
460 /*
461 * Create a new session and process group since the 4.4BSD
462 * setlogin() affects the entire process group.
463 */
464 if (setsid() == -1)
465 error("setsid failed: %.100s", strerror(errno));
466
467 #ifdef USE_PIPES
468 /*
469 * Redirect stdin. We close the parent side of the socket
470 * pair, and make the child side the standard input.
471 */
472 close(pin[1]);
473 if (dup2(pin[0], 0) == -1)
474 perror("dup2 stdin");
475 close(pin[0]);
476
477 /* Redirect stdout. */
478 close(pout[0]);
479 if (dup2(pout[1], 1) == -1)
480 perror("dup2 stdout");
481 close(pout[1]);
482
483 /* Redirect stderr. */
484 close(perr[0]);
485 if (dup2(perr[1], 2) == -1)
486 perror("dup2 stderr");
487 close(perr[1]);
488 #else
489 /*
490 * Redirect stdin, stdout, and stderr. Stdin and stdout will
491 * use the same socket, as some programs (particularly rdist)
492 * seem to depend on it.
493 */
494 close(inout[1]);
495 close(err[1]);
496 if (dup2(inout[0], 0) == -1) /* stdin */
497 perror("dup2 stdin");
498 if (dup2(inout[0], 1) == -1) /* stdout (same as stdin) */
499 perror("dup2 stdout");
500 close(inout[0]);
501 if (dup2(err[0], 2) == -1) /* stderr */
502 perror("dup2 stderr");
503 close(err[0]);
504 #endif
505
506 /* Do processing for the child (exec command etc). */
507 do_child(ssh, s, command);
508 /* NOTREACHED */
509 default:
510 break;
511 }
512
513 #ifdef HAVE_CYGWIN
514 cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
515 #endif
516
517 s->pid = pid;
518 /* Set interactive/non-interactive mode. */
519 ssh_packet_set_interactive(ssh, s->display != NULL,
520 options.ip_qos_interactive, options.ip_qos_bulk);
521
522 /*
523 * Clear loginmsg, since it's the child's responsibility to display
524 * it to the user, otherwise multiple sessions may accumulate
525 * multiple copies of the login messages.
526 */
527 sshbuf_reset(loginmsg);
528
529 #ifdef USE_PIPES
530 /* We are the parent. Close the child sides of the pipes. */
531 close(pin[0]);
532 close(pout[1]);
533 close(perr[1]);
534
535 session_set_fds(ssh, s, pin[1], pout[0], perr[0],
536 s->is_subsystem, 0);
537 #else
538 /* We are the parent. Close the child sides of the socket pairs. */
539 close(inout[0]);
540 close(err[0]);
541
542 /*
543 * Enter the interactive session. Note: server_loop must be able to
544 * handle the case that fdin and fdout are the same.
545 */
546 session_set_fds(ssh, s, inout[1], inout[1], err[1],
547 s->is_subsystem, 0);
548 #endif
549 return 0;
550 }
551
552 /*
553 * This is called to fork and execute a command when we have a tty. This
554 * will call do_child from the child, and server_loop from the parent after
555 * setting up file descriptors, controlling tty, updating wtmp, utmp,
556 * lastlog, and other such operations.
557 */
558 int
do_exec_pty(struct ssh * ssh,Session * s,const char * command)559 do_exec_pty(struct ssh *ssh, Session *s, const char *command)
560 {
561 int fdout, ptyfd, ttyfd, ptymaster;
562 pid_t pid;
563
564 if (s == NULL)
565 fatal("do_exec_pty: no session");
566 ptyfd = s->ptyfd;
567 ttyfd = s->ttyfd;
568
569 /*
570 * Create another descriptor of the pty master side for use as the
571 * standard input. We could use the original descriptor, but this
572 * simplifies code in server_loop. The descriptor is bidirectional.
573 * Do this before forking (and cleanup in the child) so as to
574 * detect and gracefully fail out-of-fd conditions.
575 */
576 if ((fdout = dup(ptyfd)) == -1) {
577 error_f("dup #1: %s", strerror(errno));
578 close(ttyfd);
579 close(ptyfd);
580 return -1;
581 }
582 /* we keep a reference to the pty master */
583 if ((ptymaster = dup(ptyfd)) == -1) {
584 error_f("dup #2: %s", strerror(errno));
585 close(ttyfd);
586 close(ptyfd);
587 close(fdout);
588 return -1;
589 }
590
591 /* Fork the child. */
592 switch ((pid = fork())) {
593 case -1:
594 error_f("fork: %.100s", strerror(errno));
595 close(fdout);
596 close(ptymaster);
597 close(ttyfd);
598 close(ptyfd);
599 return -1;
600 case 0:
601 is_child = 1;
602
603 close(fdout);
604 close(ptymaster);
605
606 /* Close the master side of the pseudo tty. */
607 close(ptyfd);
608
609 /* Make the pseudo tty our controlling tty. */
610 pty_make_controlling_tty(&ttyfd, s->tty);
611
612 /* Redirect stdin/stdout/stderr from the pseudo tty. */
613 if (dup2(ttyfd, 0) == -1)
614 error("dup2 stdin: %s", strerror(errno));
615 if (dup2(ttyfd, 1) == -1)
616 error("dup2 stdout: %s", strerror(errno));
617 if (dup2(ttyfd, 2) == -1)
618 error("dup2 stderr: %s", strerror(errno));
619
620 /* Close the extra descriptor for the pseudo tty. */
621 close(ttyfd);
622
623 /* record login, etc. similar to login(1) */
624 #ifndef HAVE_OSF_SIA
625 do_login(ssh, s, command);
626 #endif
627 /*
628 * Do common processing for the child, such as execing
629 * the command.
630 */
631 do_child(ssh, s, command);
632 /* NOTREACHED */
633 default:
634 break;
635 }
636
637 #ifdef HAVE_CYGWIN
638 cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
639 #endif
640
641 s->pid = pid;
642
643 /* Parent. Close the slave side of the pseudo tty. */
644 close(ttyfd);
645
646 /* Enter interactive session. */
647 s->ptymaster = ptymaster;
648 ssh_packet_set_interactive(ssh, 1,
649 options.ip_qos_interactive, options.ip_qos_bulk);
650 session_set_fds(ssh, s, ptyfd, fdout, -1, 1, 1);
651 return 0;
652 }
653
654 /*
655 * This is called to fork and execute a command. If another command is
656 * to be forced, execute that instead.
657 */
658 int
do_exec(struct ssh * ssh,Session * s,const char * command)659 do_exec(struct ssh *ssh, Session *s, const char *command)
660 {
661 int ret;
662 const char *forced = NULL, *tty = NULL;
663 char session_type[1024];
664
665 if (options.adm_forced_command) {
666 original_command = command;
667 command = options.adm_forced_command;
668 forced = "(config)";
669 } else if (auth_opts->force_command != NULL) {
670 original_command = command;
671 command = auth_opts->force_command;
672 forced = "(key-option)";
673 }
674 s->forced = 0;
675 if (forced != NULL) {
676 s->forced = 1;
677 if (IS_INTERNAL_SFTP(command)) {
678 s->is_subsystem = s->is_subsystem ?
679 SUBSYSTEM_INT_SFTP : SUBSYSTEM_INT_SFTP_ERROR;
680 } else if (s->is_subsystem)
681 s->is_subsystem = SUBSYSTEM_EXT;
682 snprintf(session_type, sizeof(session_type),
683 "forced-command %s '%.900s'", forced, command);
684 } else if (s->is_subsystem) {
685 snprintf(session_type, sizeof(session_type),
686 "subsystem '%.900s'", s->subsys);
687 } else if (command == NULL) {
688 snprintf(session_type, sizeof(session_type), "shell");
689 } else {
690 /* NB. we don't log unforced commands to preserve privacy */
691 snprintf(session_type, sizeof(session_type), "command");
692 }
693
694 if (s->ttyfd != -1) {
695 tty = s->tty;
696 if (strncmp(tty, "/dev/", 5) == 0)
697 tty += 5;
698 }
699
700 verbose("Starting session: %s%s%s for %s from %.200s port %d id %d",
701 session_type,
702 tty == NULL ? "" : " on ",
703 tty == NULL ? "" : tty,
704 s->pw->pw_name,
705 ssh_remote_ipaddr(ssh),
706 ssh_remote_port(ssh),
707 s->self);
708
709 #ifdef SSH_AUDIT_EVENTS
710 if (command != NULL)
711 PRIVSEP(audit_run_command(command));
712 else if (s->ttyfd == -1) {
713 char *shell = s->pw->pw_shell;
714
715 if (shell[0] == '\0') /* empty shell means /bin/sh */
716 shell =_PATH_BSHELL;
717 PRIVSEP(audit_run_command(shell));
718 }
719 #endif
720 if (s->ttyfd != -1)
721 ret = do_exec_pty(ssh, s, command);
722 else
723 ret = do_exec_no_pty(ssh, s, command);
724
725 original_command = NULL;
726
727 /*
728 * Clear loginmsg: it's the child's responsibility to display
729 * it to the user, otherwise multiple sessions may accumulate
730 * multiple copies of the login messages.
731 */
732 sshbuf_reset(loginmsg);
733
734 return ret;
735 }
736
737 /* administrative, login(1)-like work */
738 void
do_login(struct ssh * ssh,Session * s,const char * command)739 do_login(struct ssh *ssh, Session *s, const char *command)
740 {
741 socklen_t fromlen;
742 struct sockaddr_storage from;
743 struct passwd * pw = s->pw;
744 pid_t pid = getpid();
745
746 /*
747 * Get IP address of client. If the connection is not a socket, let
748 * the address be 0.0.0.0.
749 */
750 memset(&from, 0, sizeof(from));
751 fromlen = sizeof(from);
752 if (ssh_packet_connection_is_on_socket(ssh)) {
753 if (getpeername(ssh_packet_get_connection_in(ssh),
754 (struct sockaddr *)&from, &fromlen) == -1) {
755 debug("getpeername: %.100s", strerror(errno));
756 cleanup_exit(255);
757 }
758 }
759
760 /* Record that there was a login on that tty from the remote host. */
761 if (!use_privsep)
762 record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
763 session_get_remote_name_or_ip(ssh, utmp_len,
764 options.use_dns),
765 (struct sockaddr *)&from, fromlen);
766
767 #ifdef USE_PAM
768 /*
769 * If password change is needed, do it now.
770 * This needs to occur before the ~/.hushlogin check.
771 */
772 if (options.use_pam && !use_privsep && s->authctxt->force_pwchange) {
773 display_loginmsg();
774 do_pam_chauthtok();
775 s->authctxt->force_pwchange = 0;
776 /* XXX - signal [net] parent to enable forwardings */
777 }
778 #endif
779
780 if (check_quietlogin(s, command))
781 return;
782
783 display_loginmsg();
784
785 do_motd();
786 }
787
788 /*
789 * Display the message of the day.
790 */
791 void
do_motd(void)792 do_motd(void)
793 {
794 FILE *f;
795 char buf[256];
796
797 if (options.print_motd) {
798 #ifdef HAVE_LOGIN_CAP
799 f = fopen(login_getcapstr(lc, "welcome", "/etc/motd",
800 "/etc/motd"), "r");
801 #else
802 f = fopen("/etc/motd", "r");
803 #endif
804 if (f) {
805 while (fgets(buf, sizeof(buf), f))
806 fputs(buf, stdout);
807 fclose(f);
808 }
809 }
810 }
811
812
813 /*
814 * Check for quiet login, either .hushlogin or command given.
815 */
816 int
check_quietlogin(Session * s,const char * command)817 check_quietlogin(Session *s, const char *command)
818 {
819 char buf[256];
820 struct passwd *pw = s->pw;
821 struct stat st;
822
823 /* Return 1 if .hushlogin exists or a command given. */
824 if (command != NULL)
825 return 1;
826 snprintf(buf, sizeof(buf), "%.200s/.hushlogin", pw->pw_dir);
827 #ifdef HAVE_LOGIN_CAP
828 if (login_getcapbool(lc, "hushlogin", 0) || stat(buf, &st) >= 0)
829 return 1;
830 #else
831 if (stat(buf, &st) >= 0)
832 return 1;
833 #endif
834 return 0;
835 }
836
837 /*
838 * Reads environment variables from the given file and adds/overrides them
839 * into the environment. If the file does not exist, this does nothing.
840 * Otherwise, it must consist of empty lines, comments (line starts with '#')
841 * and assignments of the form name=value. No other forms are allowed.
842 * If allowlist is not NULL, then it is interpreted as a pattern list and
843 * only variable names that match it will be accepted.
844 */
845 static void
read_environment_file(char *** env,u_int * envsize,const char * filename,const char * allowlist)846 read_environment_file(char ***env, u_int *envsize,
847 const char *filename, const char *allowlist)
848 {
849 FILE *f;
850 char *line = NULL, *cp, *value;
851 size_t linesize = 0;
852 u_int lineno = 0;
853
854 f = fopen(filename, "r");
855 if (!f)
856 return;
857
858 while (getline(&line, &linesize, f) != -1) {
859 if (++lineno > 1000)
860 fatal("Too many lines in environment file %s", filename);
861 for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
862 ;
863 if (!*cp || *cp == '#' || *cp == '\n')
864 continue;
865
866 cp[strcspn(cp, "\n")] = '\0';
867
868 value = strchr(cp, '=');
869 if (value == NULL) {
870 fprintf(stderr, "Bad line %u in %.100s\n", lineno,
871 filename);
872 continue;
873 }
874 /*
875 * Replace the equals sign by nul, and advance value to
876 * the value string.
877 */
878 *value = '\0';
879 value++;
880 if (allowlist != NULL &&
881 match_pattern_list(cp, allowlist, 0) != 1)
882 continue;
883 child_set_env(env, envsize, cp, value);
884 }
885 free(line);
886 fclose(f);
887 }
888
889 #ifdef HAVE_ETC_DEFAULT_LOGIN
890 /*
891 * Return named variable from specified environment, or NULL if not present.
892 */
893 static char *
child_get_env(char ** env,const char * name)894 child_get_env(char **env, const char *name)
895 {
896 int i;
897 size_t len;
898
899 len = strlen(name);
900 for (i=0; env[i] != NULL; i++)
901 if (strncmp(name, env[i], len) == 0 && env[i][len] == '=')
902 return(env[i] + len + 1);
903 return NULL;
904 }
905
906 /*
907 * Read /etc/default/login.
908 * We pick up the PATH (or SUPATH for root) and UMASK.
909 */
910 static void
read_etc_default_login(char *** env,u_int * envsize,uid_t uid)911 read_etc_default_login(char ***env, u_int *envsize, uid_t uid)
912 {
913 char **tmpenv = NULL, *var;
914 u_int i, tmpenvsize = 0;
915 u_long mask;
916
917 /*
918 * We don't want to copy the whole file to the child's environment,
919 * so we use a temporary environment and copy the variables we're
920 * interested in.
921 */
922 read_environment_file(&tmpenv, &tmpenvsize, "/etc/default/login",
923 options.permit_user_env_allowlist);
924
925 if (tmpenv == NULL)
926 return;
927
928 if (uid == 0)
929 var = child_get_env(tmpenv, "SUPATH");
930 else
931 var = child_get_env(tmpenv, "PATH");
932 if (var != NULL)
933 child_set_env(env, envsize, "PATH", var);
934
935 if ((var = child_get_env(tmpenv, "UMASK")) != NULL)
936 if (sscanf(var, "%5lo", &mask) == 1)
937 umask((mode_t)mask);
938
939 for (i = 0; tmpenv[i] != NULL; i++)
940 free(tmpenv[i]);
941 free(tmpenv);
942 }
943 #endif /* HAVE_ETC_DEFAULT_LOGIN */
944
945 #if defined(USE_PAM) || defined(HAVE_CYGWIN)
946 static void
copy_environment_denylist(char ** source,char *** env,u_int * envsize,const char * denylist)947 copy_environment_denylist(char **source, char ***env, u_int *envsize,
948 const char *denylist)
949 {
950 char *var_name, *var_val;
951 int i;
952
953 if (source == NULL)
954 return;
955
956 for(i = 0; source[i] != NULL; i++) {
957 var_name = xstrdup(source[i]);
958 if ((var_val = strstr(var_name, "=")) == NULL) {
959 free(var_name);
960 continue;
961 }
962 *var_val++ = '\0';
963
964 if (denylist == NULL ||
965 match_pattern_list(var_name, denylist, 0) != 1) {
966 debug3("Copy environment: %s=%s", var_name, var_val);
967 child_set_env(env, envsize, var_name, var_val);
968 }
969
970 free(var_name);
971 }
972 }
973 #endif /* defined(USE_PAM) || defined(HAVE_CYGWIN) */
974
975 #ifdef HAVE_CYGWIN
976 static void
copy_environment(char ** source,char *** env,u_int * envsize)977 copy_environment(char **source, char ***env, u_int *envsize)
978 {
979 copy_environment_denylist(source, env, envsize, NULL);
980 }
981 #endif
982
983 static char **
do_setup_env(struct ssh * ssh,Session * s,const char * shell)984 do_setup_env(struct ssh *ssh, Session *s, const char *shell)
985 {
986 char buf[256];
987 size_t n;
988 u_int i, envsize;
989 char *ocp, *cp, *value, **env, *laddr;
990 struct passwd *pw = s->pw;
991 #if !defined (HAVE_LOGIN_CAP) && !defined (HAVE_CYGWIN)
992 char *path = NULL;
993 #else
994 extern char **environ;
995 char **senv, **var, *val;
996 #endif
997
998 /* Initialize the environment. */
999 envsize = 100;
1000 env = xcalloc(envsize, sizeof(char *));
1001 env[0] = NULL;
1002
1003 #ifdef HAVE_CYGWIN
1004 /*
1005 * The Windows environment contains some setting which are
1006 * important for a running system. They must not be dropped.
1007 */
1008 {
1009 char **p;
1010
1011 p = fetch_windows_environment();
1012 copy_environment(p, &env, &envsize);
1013 free_windows_environment(p);
1014 }
1015 #endif
1016
1017 if (getenv("TZ"))
1018 child_set_env(&env, &envsize, "TZ", getenv("TZ"));
1019
1020 #ifdef GSSAPI
1021 /* Allow any GSSAPI methods that we've used to alter
1022 * the child's environment as they see fit
1023 */
1024 ssh_gssapi_do_child(&env, &envsize);
1025 #endif
1026
1027 /* Set basic environment. */
1028 for (i = 0; i < s->num_env; i++)
1029 child_set_env(&env, &envsize, s->env[i].name, s->env[i].val);
1030
1031 child_set_env(&env, &envsize, "USER", pw->pw_name);
1032 child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
1033 #ifdef _AIX
1034 child_set_env(&env, &envsize, "LOGIN", pw->pw_name);
1035 #endif
1036 child_set_env(&env, &envsize, "HOME", pw->pw_dir);
1037 snprintf(buf, sizeof buf, "%.200s/%.50s", _PATH_MAILDIR, pw->pw_name);
1038 child_set_env(&env, &envsize, "MAIL", buf);
1039 #ifdef HAVE_LOGIN_CAP
1040 child_set_env(&env, &envsize, "PATH", _PATH_STDPATH);
1041 child_set_env(&env, &envsize, "TERM", "su");
1042 /*
1043 * Temporarily swap out our real environment with an empty one,
1044 * let setusercontext() apply any environment variables defined
1045 * for the user's login class, copy those variables to the child,
1046 * free the temporary environment, and restore the original.
1047 */
1048 senv = environ;
1049 environ = xmalloc(sizeof(*environ));
1050 *environ = NULL;
1051 (void)setusercontext(lc, pw, pw->pw_uid, LOGIN_SETENV|LOGIN_SETPATH);
1052 for (var = environ; *var != NULL; ++var) {
1053 if ((val = strchr(*var, '=')) != NULL) {
1054 *val++ = '\0';
1055 child_set_env(&env, &envsize, *var, val);
1056 }
1057 free(*var);
1058 }
1059 free(environ);
1060 environ = senv;
1061 #else /* HAVE_LOGIN_CAP */
1062 # ifndef HAVE_CYGWIN
1063 /*
1064 * There's no standard path on Windows. The path contains
1065 * important components pointing to the system directories,
1066 * needed for loading shared libraries. So the path better
1067 * remains intact here.
1068 */
1069 # ifdef HAVE_ETC_DEFAULT_LOGIN
1070 read_etc_default_login(&env, &envsize, pw->pw_uid);
1071 path = child_get_env(env, "PATH");
1072 # endif /* HAVE_ETC_DEFAULT_LOGIN */
1073 if (path == NULL || *path == '\0') {
1074 child_set_env(&env, &envsize, "PATH",
1075 s->pw->pw_uid == 0 ? SUPERUSER_PATH : _PATH_STDPATH);
1076 }
1077 # endif /* HAVE_CYGWIN */
1078 #endif /* HAVE_LOGIN_CAP */
1079
1080 /* Normal systems set SHELL by default. */
1081 child_set_env(&env, &envsize, "SHELL", shell);
1082
1083 if (s->term)
1084 child_set_env(&env, &envsize, "TERM", s->term);
1085 if (s->display)
1086 child_set_env(&env, &envsize, "DISPLAY", s->display);
1087
1088 /*
1089 * Since we clear KRB5CCNAME at startup, if it's set now then it
1090 * must have been set by a native authentication method (eg AIX or
1091 * SIA), so copy it to the child.
1092 */
1093 {
1094 char *cp;
1095
1096 if ((cp = getenv("KRB5CCNAME")) != NULL)
1097 child_set_env(&env, &envsize, "KRB5CCNAME", cp);
1098 }
1099
1100 #ifdef _AIX
1101 {
1102 char *cp;
1103
1104 if ((cp = getenv("AUTHSTATE")) != NULL)
1105 child_set_env(&env, &envsize, "AUTHSTATE", cp);
1106 read_environment_file(&env, &envsize, "/etc/environment",
1107 options.permit_user_env_allowlist);
1108 }
1109 #endif
1110 #ifdef KRB5
1111 if (s->authctxt->krb5_ccname)
1112 child_set_env(&env, &envsize, "KRB5CCNAME",
1113 s->authctxt->krb5_ccname);
1114 #endif
1115 if (auth_sock_name != NULL)
1116 child_set_env(&env, &envsize, SSH_AUTHSOCKET_ENV_NAME,
1117 auth_sock_name);
1118
1119
1120 /* Set custom environment options from pubkey authentication. */
1121 if (options.permit_user_env) {
1122 for (n = 0 ; n < auth_opts->nenv; n++) {
1123 ocp = xstrdup(auth_opts->env[n]);
1124 cp = strchr(ocp, '=');
1125 if (cp != NULL) {
1126 *cp = '\0';
1127 /* Apply PermitUserEnvironment allowlist */
1128 if (options.permit_user_env_allowlist == NULL ||
1129 match_pattern_list(ocp,
1130 options.permit_user_env_allowlist, 0) == 1)
1131 child_set_env(&env, &envsize,
1132 ocp, cp + 1);
1133 }
1134 free(ocp);
1135 }
1136 }
1137
1138 /* read $HOME/.ssh/environment. */
1139 if (options.permit_user_env) {
1140 snprintf(buf, sizeof buf, "%.200s/%s/environment",
1141 pw->pw_dir, _PATH_SSH_USER_DIR);
1142 read_environment_file(&env, &envsize, buf,
1143 options.permit_user_env_allowlist);
1144 }
1145
1146 #ifdef USE_PAM
1147 /*
1148 * Pull in any environment variables that may have
1149 * been set by PAM.
1150 */
1151 if (options.use_pam) {
1152 char **p;
1153
1154 /*
1155 * Don't allow PAM-internal env vars to leak
1156 * back into the session environment.
1157 */
1158 #define PAM_ENV_DENYLIST "SSH_AUTH_INFO*,SSH_CONNECTION*"
1159 p = fetch_pam_child_environment();
1160 copy_environment_denylist(p, &env, &envsize,
1161 PAM_ENV_DENYLIST);
1162 free_pam_environment(p);
1163
1164 p = fetch_pam_environment();
1165 copy_environment_denylist(p, &env, &envsize,
1166 PAM_ENV_DENYLIST);
1167 free_pam_environment(p);
1168 }
1169 #endif /* USE_PAM */
1170
1171 /* Environment specified by admin */
1172 for (i = 0; i < options.num_setenv; i++) {
1173 cp = xstrdup(options.setenv[i]);
1174 if ((value = strchr(cp, '=')) == NULL) {
1175 /* shouldn't happen; vars are checked in servconf.c */
1176 fatal("Invalid config SetEnv: %s", options.setenv[i]);
1177 }
1178 *value++ = '\0';
1179 child_set_env(&env, &envsize, cp, value);
1180 }
1181
1182 /* SSH_CLIENT deprecated */
1183 snprintf(buf, sizeof buf, "%.50s %d %d",
1184 ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
1185 ssh_local_port(ssh));
1186 child_set_env(&env, &envsize, "SSH_CLIENT", buf);
1187
1188 laddr = get_local_ipaddr(ssh_packet_get_connection_in(ssh));
1189 snprintf(buf, sizeof buf, "%.50s %d %.50s %d",
1190 ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
1191 laddr, ssh_local_port(ssh));
1192 free(laddr);
1193 child_set_env(&env, &envsize, "SSH_CONNECTION", buf);
1194
1195 if (tun_fwd_ifnames != NULL)
1196 child_set_env(&env, &envsize, "SSH_TUNNEL", tun_fwd_ifnames);
1197 if (auth_info_file != NULL)
1198 child_set_env(&env, &envsize, "SSH_USER_AUTH", auth_info_file);
1199 if (s->ttyfd != -1)
1200 child_set_env(&env, &envsize, "SSH_TTY", s->tty);
1201 if (original_command)
1202 child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
1203 original_command);
1204
1205 if (debug_flag) {
1206 /* dump the environment */
1207 fprintf(stderr, "Environment:\n");
1208 for (i = 0; env[i]; i++)
1209 fprintf(stderr, " %.200s\n", env[i]);
1210 }
1211 return env;
1212 }
1213
1214 /*
1215 * Run $HOME/.ssh/rc, /etc/ssh/sshrc, or xauth (whichever is found
1216 * first in this order).
1217 */
1218 static void
do_rc_files(struct ssh * ssh,Session * s,const char * shell)1219 do_rc_files(struct ssh *ssh, Session *s, const char *shell)
1220 {
1221 FILE *f = NULL;
1222 char *cmd = NULL, *user_rc = NULL;
1223 int do_xauth;
1224 struct stat st;
1225
1226 do_xauth =
1227 s->display != NULL && s->auth_proto != NULL && s->auth_data != NULL;
1228 xasprintf(&user_rc, "%s/%s", s->pw->pw_dir, _PATH_SSH_USER_RC);
1229
1230 /* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
1231 if (!s->is_subsystem && options.adm_forced_command == NULL &&
1232 auth_opts->permit_user_rc && options.permit_user_rc &&
1233 stat(user_rc, &st) >= 0) {
1234 if (xasprintf(&cmd, "%s -c '%s %s'", shell, _PATH_BSHELL,
1235 user_rc) == -1)
1236 fatal_f("xasprintf: %s", strerror(errno));
1237 if (debug_flag)
1238 fprintf(stderr, "Running %s\n", cmd);
1239 f = popen(cmd, "w");
1240 if (f) {
1241 if (do_xauth)
1242 fprintf(f, "%s %s\n", s->auth_proto,
1243 s->auth_data);
1244 pclose(f);
1245 } else
1246 fprintf(stderr, "Could not run %s\n",
1247 user_rc);
1248 } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
1249 if (debug_flag)
1250 fprintf(stderr, "Running %s %s\n", _PATH_BSHELL,
1251 _PATH_SSH_SYSTEM_RC);
1252 f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w");
1253 if (f) {
1254 if (do_xauth)
1255 fprintf(f, "%s %s\n", s->auth_proto,
1256 s->auth_data);
1257 pclose(f);
1258 } else
1259 fprintf(stderr, "Could not run %s\n",
1260 _PATH_SSH_SYSTEM_RC);
1261 } else if (do_xauth && options.xauth_location != NULL) {
1262 /* Add authority data to .Xauthority if appropriate. */
1263 if (debug_flag) {
1264 fprintf(stderr,
1265 "Running %.500s remove %.100s\n",
1266 options.xauth_location, s->auth_display);
1267 fprintf(stderr,
1268 "%.500s add %.100s %.100s %.100s\n",
1269 options.xauth_location, s->auth_display,
1270 s->auth_proto, s->auth_data);
1271 }
1272 if (xasprintf(&cmd, "%s -q -", options.xauth_location) == -1)
1273 fatal_f("xasprintf: %s", strerror(errno));
1274 f = popen(cmd, "w");
1275 if (f) {
1276 fprintf(f, "remove %s\n",
1277 s->auth_display);
1278 fprintf(f, "add %s %s %s\n",
1279 s->auth_display, s->auth_proto,
1280 s->auth_data);
1281 pclose(f);
1282 } else {
1283 fprintf(stderr, "Could not run %s\n",
1284 cmd);
1285 }
1286 }
1287 free(cmd);
1288 free(user_rc);
1289 }
1290
1291 static void
do_nologin(struct passwd * pw)1292 do_nologin(struct passwd *pw)
1293 {
1294 FILE *f = NULL;
1295 const char *nl;
1296 char buf[1024], *def_nl = _PATH_NOLOGIN;
1297 struct stat sb;
1298
1299 #ifdef HAVE_LOGIN_CAP
1300 if (login_getcapbool(lc, "ignorenologin", 0) || pw->pw_uid == 0)
1301 return;
1302 nl = login_getcapstr(lc, "nologin", def_nl, def_nl);
1303 #else
1304 if (pw->pw_uid == 0)
1305 return;
1306 nl = def_nl;
1307 #endif
1308 if (stat(nl, &sb) == -1)
1309 return;
1310
1311 /* /etc/nologin exists. Print its contents if we can and exit. */
1312 logit("User %.100s not allowed because %s exists", pw->pw_name, nl);
1313 if ((f = fopen(nl, "r")) != NULL) {
1314 while (fgets(buf, sizeof(buf), f))
1315 fputs(buf, stderr);
1316 fclose(f);
1317 }
1318 exit(254);
1319 }
1320
1321 /*
1322 * Chroot into a directory after checking it for safety: all path components
1323 * must be root-owned directories with strict permissions.
1324 */
1325 static void
safely_chroot(const char * path,uid_t uid)1326 safely_chroot(const char *path, uid_t uid)
1327 {
1328 const char *cp;
1329 char component[PATH_MAX];
1330 struct stat st;
1331
1332 if (!path_absolute(path))
1333 fatal("chroot path does not begin at root");
1334 if (strlen(path) >= sizeof(component))
1335 fatal("chroot path too long");
1336
1337 /*
1338 * Descend the path, checking that each component is a
1339 * root-owned directory with strict permissions.
1340 */
1341 for (cp = path; cp != NULL;) {
1342 if ((cp = strchr(cp, '/')) == NULL)
1343 strlcpy(component, path, sizeof(component));
1344 else {
1345 cp++;
1346 memcpy(component, path, cp - path);
1347 component[cp - path] = '\0';
1348 }
1349
1350 debug3_f("checking '%s'", component);
1351
1352 if (stat(component, &st) != 0)
1353 fatal_f("stat(\"%s\"): %s",
1354 component, strerror(errno));
1355 if (st.st_uid != 0 || (st.st_mode & 022) != 0)
1356 fatal("bad ownership or modes for chroot "
1357 "directory %s\"%s\"",
1358 cp == NULL ? "" : "component ", component);
1359 if (!S_ISDIR(st.st_mode))
1360 fatal("chroot path %s\"%s\" is not a directory",
1361 cp == NULL ? "" : "component ", component);
1362
1363 }
1364
1365 if (chdir(path) == -1)
1366 fatal("Unable to chdir to chroot path \"%s\": "
1367 "%s", path, strerror(errno));
1368 if (chroot(path) == -1)
1369 fatal("chroot(\"%s\"): %s", path, strerror(errno));
1370 if (chdir("/") == -1)
1371 fatal_f("chdir(/) after chroot: %s", strerror(errno));
1372 verbose("Changed root directory to \"%s\"", path);
1373 }
1374
1375 /* Set login name, uid, gid, and groups. */
1376 void
do_setusercontext(struct passwd * pw)1377 do_setusercontext(struct passwd *pw)
1378 {
1379 char uidstr[32], *chroot_path, *tmp;
1380
1381 platform_setusercontext(pw);
1382
1383 if (platform_privileged_uidswap()) {
1384 #ifdef HAVE_LOGIN_CAP
1385 if (setusercontext(lc, pw, pw->pw_uid,
1386 (LOGIN_SETALL & ~(LOGIN_SETENV|LOGIN_SETPATH|LOGIN_SETUSER))) < 0) {
1387 perror("unable to set user context");
1388 exit(1);
1389 }
1390 #else
1391 if (setlogin(pw->pw_name) < 0)
1392 error("setlogin failed: %s", strerror(errno));
1393 if (setgid(pw->pw_gid) < 0) {
1394 perror("setgid");
1395 exit(1);
1396 }
1397 /* Initialize the group list. */
1398 if (initgroups(pw->pw_name, pw->pw_gid) < 0) {
1399 perror("initgroups");
1400 exit(1);
1401 }
1402 endgrent();
1403 #endif
1404
1405 platform_setusercontext_post_groups(pw);
1406
1407 if (!in_chroot && options.chroot_directory != NULL &&
1408 strcasecmp(options.chroot_directory, "none") != 0) {
1409 tmp = tilde_expand_filename(options.chroot_directory,
1410 pw->pw_uid);
1411 snprintf(uidstr, sizeof(uidstr), "%llu",
1412 (unsigned long long)pw->pw_uid);
1413 chroot_path = percent_expand(tmp, "h", pw->pw_dir,
1414 "u", pw->pw_name, "U", uidstr, (char *)NULL);
1415 safely_chroot(chroot_path, pw->pw_uid);
1416 free(tmp);
1417 free(chroot_path);
1418 /* Make sure we don't attempt to chroot again */
1419 free(options.chroot_directory);
1420 options.chroot_directory = NULL;
1421 in_chroot = 1;
1422 }
1423
1424 #ifdef HAVE_LOGIN_CAP
1425 if (setusercontext(lc, pw, pw->pw_uid, LOGIN_SETUSER) < 0) {
1426 perror("unable to set user context (setuser)");
1427 exit(1);
1428 }
1429 /*
1430 * FreeBSD's setusercontext() will not apply the user's
1431 * own umask setting unless running with the user's UID.
1432 */
1433 (void) setusercontext(lc, pw, pw->pw_uid, LOGIN_SETUMASK);
1434 #else
1435 # ifdef USE_LIBIAF
1436 /*
1437 * In a chroot environment, the set_id() will always fail;
1438 * typically because of the lack of necessary authentication
1439 * services and runtime such as ./usr/lib/libiaf.so,
1440 * ./usr/lib/libpam.so.1, and ./etc/passwd We skip it in the
1441 * internal sftp chroot case. We'll lose auditing and ACLs but
1442 * permanently_set_uid will take care of the rest.
1443 */
1444 if (!in_chroot && set_id(pw->pw_name) != 0)
1445 fatal("set_id(%s) Failed", pw->pw_name);
1446 # endif /* USE_LIBIAF */
1447 /* Permanently switch to the desired uid. */
1448 permanently_set_uid(pw);
1449 #endif
1450 } else if (options.chroot_directory != NULL &&
1451 strcasecmp(options.chroot_directory, "none") != 0) {
1452 fatal("server lacks privileges to chroot to ChrootDirectory");
1453 }
1454
1455 if (getuid() != pw->pw_uid || geteuid() != pw->pw_uid)
1456 fatal("Failed to set uids to %u.", (u_int) pw->pw_uid);
1457 }
1458
1459 static void
do_pwchange(Session * s)1460 do_pwchange(Session *s)
1461 {
1462 fflush(NULL);
1463 fprintf(stderr, "WARNING: Your password has expired.\n");
1464 if (s->ttyfd != -1) {
1465 fprintf(stderr,
1466 "You must change your password now and login again!\n");
1467 #ifdef WITH_SELINUX
1468 setexeccon(NULL);
1469 #endif
1470 #ifdef PASSWD_NEEDS_USERNAME
1471 execl(_PATH_PASSWD_PROG, "passwd", s->pw->pw_name,
1472 (char *)NULL);
1473 #else
1474 execl(_PATH_PASSWD_PROG, "passwd", (char *)NULL);
1475 #endif
1476 perror("passwd");
1477 } else {
1478 fprintf(stderr,
1479 "Password change required but no TTY available.\n");
1480 }
1481 exit(1);
1482 }
1483
1484 static void
child_close_fds(struct ssh * ssh)1485 child_close_fds(struct ssh *ssh)
1486 {
1487 extern int auth_sock;
1488
1489 if (auth_sock != -1) {
1490 close(auth_sock);
1491 auth_sock = -1;
1492 }
1493
1494 if (ssh_packet_get_connection_in(ssh) ==
1495 ssh_packet_get_connection_out(ssh))
1496 close(ssh_packet_get_connection_in(ssh));
1497 else {
1498 close(ssh_packet_get_connection_in(ssh));
1499 close(ssh_packet_get_connection_out(ssh));
1500 }
1501 /*
1502 * Close all descriptors related to channels. They will still remain
1503 * open in the parent.
1504 */
1505 /* XXX better use close-on-exec? -markus */
1506 channel_close_all(ssh);
1507
1508 /*
1509 * Close any extra file descriptors. Note that there may still be
1510 * descriptors left by system functions. They will be closed later.
1511 */
1512 endpwent();
1513
1514 /* Stop directing logs to a high-numbered fd before we close it */
1515 log_redirect_stderr_to(NULL);
1516
1517 /*
1518 * Close any extra open file descriptors so that we don't have them
1519 * hanging around in clients. Note that we want to do this after
1520 * initgroups, because at least on Solaris 2.3 it leaves file
1521 * descriptors open.
1522 */
1523 closefrom(STDERR_FILENO + 1);
1524 }
1525
1526 /*
1527 * Performs common processing for the child, such as setting up the
1528 * environment, closing extra file descriptors, setting the user and group
1529 * ids, and executing the command or shell.
1530 */
1531 #define ARGV_MAX 10
1532 void
do_child(struct ssh * ssh,Session * s,const char * command)1533 do_child(struct ssh *ssh, Session *s, const char *command)
1534 {
1535 extern char **environ;
1536 char **env, *argv[ARGV_MAX], remote_id[512];
1537 const char *shell, *shell0;
1538 struct passwd *pw = s->pw;
1539 int r = 0;
1540
1541 sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
1542
1543 /* remove hostkey from the child's memory */
1544 destroy_sensitive_data();
1545 ssh_packet_clear_keys(ssh);
1546
1547 /* Force a password change */
1548 if (s->authctxt->force_pwchange) {
1549 do_setusercontext(pw);
1550 child_close_fds(ssh);
1551 do_pwchange(s);
1552 exit(1);
1553 }
1554
1555 /*
1556 * Login(1) does this as well, and it needs uid 0 for the "-h"
1557 * switch, so we let login(1) to this for us.
1558 */
1559 #ifdef HAVE_OSF_SIA
1560 session_setup_sia(pw, s->ttyfd == -1 ? NULL : s->tty);
1561 if (!check_quietlogin(s, command))
1562 do_motd();
1563 #else /* HAVE_OSF_SIA */
1564 /* When PAM is enabled we rely on it to do the nologin check */
1565 if (!options.use_pam)
1566 do_nologin(pw);
1567 do_setusercontext(pw);
1568 /*
1569 * PAM session modules in do_setusercontext may have
1570 * generated messages, so if this in an interactive
1571 * login then display them too.
1572 */
1573 if (!check_quietlogin(s, command))
1574 display_loginmsg();
1575 #endif /* HAVE_OSF_SIA */
1576
1577 #ifdef USE_PAM
1578 if (options.use_pam && !is_pam_session_open()) {
1579 debug3("PAM session not opened, exiting");
1580 display_loginmsg();
1581 exit(254);
1582 }
1583 #endif
1584
1585 /*
1586 * Get the shell from the password data. An empty shell field is
1587 * legal, and means /bin/sh.
1588 */
1589 shell = (pw->pw_shell[0] == '\0') ? _PATH_BSHELL : pw->pw_shell;
1590
1591 /*
1592 * Make sure $SHELL points to the shell from the password file,
1593 * even if shell is overridden from login.conf
1594 */
1595 env = do_setup_env(ssh, s, shell);
1596
1597 #ifdef HAVE_LOGIN_CAP
1598 shell = login_getcapstr(lc, "shell", (char *)shell, (char *)shell);
1599 #endif
1600
1601 /*
1602 * Close the connection descriptors; note that this is the child, and
1603 * the server will still have the socket open, and it is important
1604 * that we do not shutdown it. Note that the descriptors cannot be
1605 * closed before building the environment, as we call
1606 * ssh_remote_ipaddr there.
1607 */
1608 child_close_fds(ssh);
1609
1610 /*
1611 * Must take new environment into use so that .ssh/rc,
1612 * /etc/ssh/sshrc and xauth are run in the proper environment.
1613 */
1614 environ = env;
1615
1616 #if defined(KRB5) && defined(USE_AFS)
1617 /*
1618 * At this point, we check to see if AFS is active and if we have
1619 * a valid Kerberos 5 TGT. If so, it seems like a good idea to see
1620 * if we can (and need to) extend the ticket into an AFS token. If
1621 * we don't do this, we run into potential problems if the user's
1622 * home directory is in AFS and it's not world-readable.
1623 */
1624
1625 if (options.kerberos_get_afs_token && k_hasafs() &&
1626 (s->authctxt->krb5_ctx != NULL)) {
1627 char cell[64];
1628
1629 debug("Getting AFS token");
1630
1631 k_setpag();
1632
1633 if (k_afs_cell_of_file(pw->pw_dir, cell, sizeof(cell)) == 0)
1634 krb5_afslog(s->authctxt->krb5_ctx,
1635 s->authctxt->krb5_fwd_ccache, cell, NULL);
1636
1637 krb5_afslog_home(s->authctxt->krb5_ctx,
1638 s->authctxt->krb5_fwd_ccache, NULL, NULL, pw->pw_dir);
1639 }
1640 #endif
1641
1642 /* Change current directory to the user's home directory. */
1643 if (chdir(pw->pw_dir) == -1) {
1644 /* Suppress missing homedir warning for chroot case */
1645 #ifdef HAVE_LOGIN_CAP
1646 r = login_getcapbool(lc, "requirehome", 0);
1647 #endif
1648 if (r || !in_chroot) {
1649 fprintf(stderr, "Could not chdir to home "
1650 "directory %s: %s\n", pw->pw_dir,
1651 strerror(errno));
1652 }
1653 if (r)
1654 exit(1);
1655 }
1656
1657 closefrom(STDERR_FILENO + 1);
1658
1659 do_rc_files(ssh, s, shell);
1660
1661 /* restore SIGPIPE for child */
1662 ssh_signal(SIGPIPE, SIG_DFL);
1663
1664 if (s->is_subsystem == SUBSYSTEM_INT_SFTP_ERROR) {
1665 error("Connection from %s: refusing non-sftp session",
1666 remote_id);
1667 printf("This service allows sftp connections only.\n");
1668 fflush(NULL);
1669 exit(1);
1670 } else if (s->is_subsystem == SUBSYSTEM_INT_SFTP) {
1671 extern int optind, optreset;
1672 int i;
1673 char *p, *args;
1674
1675 setproctitle("%s@%s", s->pw->pw_name, INTERNAL_SFTP_NAME);
1676 args = xstrdup(command ? command : "sftp-server");
1677 for (i = 0, (p = strtok(args, " ")); p; (p = strtok(NULL, " ")))
1678 if (i < ARGV_MAX - 1)
1679 argv[i++] = p;
1680 argv[i] = NULL;
1681 optind = optreset = 1;
1682 __progname = argv[0];
1683 #ifdef WITH_SELINUX
1684 ssh_selinux_change_context("sftpd_t");
1685 #endif
1686 exit(sftp_server_main(i, argv, s->pw));
1687 }
1688
1689 fflush(NULL);
1690
1691 /* Get the last component of the shell name. */
1692 if ((shell0 = strrchr(shell, '/')) != NULL)
1693 shell0++;
1694 else
1695 shell0 = shell;
1696
1697 /*
1698 * If we have no command, execute the shell. In this case, the shell
1699 * name to be passed in argv[0] is preceded by '-' to indicate that
1700 * this is a login shell.
1701 */
1702 if (!command) {
1703 char argv0[256];
1704
1705 /* Start the shell. Set initial character to '-'. */
1706 argv0[0] = '-';
1707
1708 if (strlcpy(argv0 + 1, shell0, sizeof(argv0) - 1)
1709 >= sizeof(argv0) - 1) {
1710 errno = EINVAL;
1711 perror(shell);
1712 exit(1);
1713 }
1714
1715 /* Execute the shell. */
1716 argv[0] = argv0;
1717 argv[1] = NULL;
1718 execve(shell, argv, env);
1719
1720 /* Executing the shell failed. */
1721 perror(shell);
1722 exit(1);
1723 }
1724 /*
1725 * Execute the command using the user's shell. This uses the -c
1726 * option to execute the command.
1727 */
1728 argv[0] = (char *) shell0;
1729 argv[1] = "-c";
1730 argv[2] = (char *) command;
1731 argv[3] = NULL;
1732 execve(shell, argv, env);
1733 perror(shell);
1734 exit(1);
1735 }
1736
1737 void
session_unused(int id)1738 session_unused(int id)
1739 {
1740 debug3_f("session id %d unused", id);
1741 if (id >= options.max_sessions ||
1742 id >= sessions_nalloc) {
1743 fatal_f("insane session id %d (max %d nalloc %d)",
1744 id, options.max_sessions, sessions_nalloc);
1745 }
1746 memset(&sessions[id], 0, sizeof(*sessions));
1747 sessions[id].self = id;
1748 sessions[id].used = 0;
1749 sessions[id].chanid = -1;
1750 sessions[id].ptyfd = -1;
1751 sessions[id].ttyfd = -1;
1752 sessions[id].ptymaster = -1;
1753 sessions[id].x11_chanids = NULL;
1754 sessions[id].next_unused = sessions_first_unused;
1755 sessions_first_unused = id;
1756 }
1757
1758 Session *
session_new(void)1759 session_new(void)
1760 {
1761 Session *s, *tmp;
1762
1763 if (sessions_first_unused == -1) {
1764 if (sessions_nalloc >= options.max_sessions)
1765 return NULL;
1766 debug2_f("allocate (allocated %d max %d)",
1767 sessions_nalloc, options.max_sessions);
1768 tmp = xrecallocarray(sessions, sessions_nalloc,
1769 sessions_nalloc + 1, sizeof(*sessions));
1770 if (tmp == NULL) {
1771 error_f("cannot allocate %d sessions",
1772 sessions_nalloc + 1);
1773 return NULL;
1774 }
1775 sessions = tmp;
1776 session_unused(sessions_nalloc++);
1777 }
1778
1779 if (sessions_first_unused >= sessions_nalloc ||
1780 sessions_first_unused < 0) {
1781 fatal_f("insane first_unused %d max %d nalloc %d",
1782 sessions_first_unused, options.max_sessions,
1783 sessions_nalloc);
1784 }
1785
1786 s = &sessions[sessions_first_unused];
1787 if (s->used)
1788 fatal_f("session %d already used", sessions_first_unused);
1789 sessions_first_unused = s->next_unused;
1790 s->used = 1;
1791 s->next_unused = -1;
1792 debug("session_new: session %d", s->self);
1793
1794 return s;
1795 }
1796
1797 static void
session_dump(void)1798 session_dump(void)
1799 {
1800 int i;
1801 for (i = 0; i < sessions_nalloc; i++) {
1802 Session *s = &sessions[i];
1803
1804 debug("dump: used %d next_unused %d session %d "
1805 "channel %d pid %ld",
1806 s->used,
1807 s->next_unused,
1808 s->self,
1809 s->chanid,
1810 (long)s->pid);
1811 }
1812 }
1813
1814 int
session_open(Authctxt * authctxt,int chanid)1815 session_open(Authctxt *authctxt, int chanid)
1816 {
1817 Session *s = session_new();
1818 debug("session_open: channel %d", chanid);
1819 if (s == NULL) {
1820 error("no more sessions");
1821 return 0;
1822 }
1823 s->authctxt = authctxt;
1824 s->pw = authctxt->pw;
1825 if (s->pw == NULL || !authctxt->valid)
1826 fatal("no user for session %d", s->self);
1827 debug("session_open: session %d: link with channel %d", s->self, chanid);
1828 s->chanid = chanid;
1829 return 1;
1830 }
1831
1832 Session *
session_by_tty(char * tty)1833 session_by_tty(char *tty)
1834 {
1835 int i;
1836 for (i = 0; i < sessions_nalloc; i++) {
1837 Session *s = &sessions[i];
1838 if (s->used && s->ttyfd != -1 && strcmp(s->tty, tty) == 0) {
1839 debug("session_by_tty: session %d tty %s", i, tty);
1840 return s;
1841 }
1842 }
1843 debug("session_by_tty: unknown tty %.100s", tty);
1844 session_dump();
1845 return NULL;
1846 }
1847
1848 static Session *
session_by_channel(int id)1849 session_by_channel(int id)
1850 {
1851 int i;
1852 for (i = 0; i < sessions_nalloc; i++) {
1853 Session *s = &sessions[i];
1854 if (s->used && s->chanid == id) {
1855 debug("session_by_channel: session %d channel %d",
1856 i, id);
1857 return s;
1858 }
1859 }
1860 debug("session_by_channel: unknown channel %d", id);
1861 session_dump();
1862 return NULL;
1863 }
1864
1865 static Session *
session_by_x11_channel(int id)1866 session_by_x11_channel(int id)
1867 {
1868 int i, j;
1869
1870 for (i = 0; i < sessions_nalloc; i++) {
1871 Session *s = &sessions[i];
1872
1873 if (s->x11_chanids == NULL || !s->used)
1874 continue;
1875 for (j = 0; s->x11_chanids[j] != -1; j++) {
1876 if (s->x11_chanids[j] == id) {
1877 debug("session_by_x11_channel: session %d "
1878 "channel %d", s->self, id);
1879 return s;
1880 }
1881 }
1882 }
1883 debug("session_by_x11_channel: unknown channel %d", id);
1884 session_dump();
1885 return NULL;
1886 }
1887
1888 static Session *
session_by_pid(pid_t pid)1889 session_by_pid(pid_t pid)
1890 {
1891 int i;
1892 debug("session_by_pid: pid %ld", (long)pid);
1893 for (i = 0; i < sessions_nalloc; i++) {
1894 Session *s = &sessions[i];
1895 if (s->used && s->pid == pid)
1896 return s;
1897 }
1898 error("session_by_pid: unknown pid %ld", (long)pid);
1899 session_dump();
1900 return NULL;
1901 }
1902
1903 static int
session_window_change_req(struct ssh * ssh,Session * s)1904 session_window_change_req(struct ssh *ssh, Session *s)
1905 {
1906 int r;
1907
1908 if ((r = sshpkt_get_u32(ssh, &s->col)) != 0 ||
1909 (r = sshpkt_get_u32(ssh, &s->row)) != 0 ||
1910 (r = sshpkt_get_u32(ssh, &s->xpixel)) != 0 ||
1911 (r = sshpkt_get_u32(ssh, &s->ypixel)) != 0 ||
1912 (r = sshpkt_get_end(ssh)) != 0)
1913 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
1914 pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
1915 return 1;
1916 }
1917
1918 static int
session_pty_req(struct ssh * ssh,Session * s)1919 session_pty_req(struct ssh *ssh, Session *s)
1920 {
1921 int r;
1922
1923 if (!auth_opts->permit_pty_flag || !options.permit_tty) {
1924 debug("Allocating a pty not permitted for this connection.");
1925 return 0;
1926 }
1927 if (s->ttyfd != -1) {
1928 ssh_packet_disconnect(ssh, "Protocol error: you already have a pty.");
1929 return 0;
1930 }
1931
1932 if ((r = sshpkt_get_cstring(ssh, &s->term, NULL)) != 0 ||
1933 (r = sshpkt_get_u32(ssh, &s->col)) != 0 ||
1934 (r = sshpkt_get_u32(ssh, &s->row)) != 0 ||
1935 (r = sshpkt_get_u32(ssh, &s->xpixel)) != 0 ||
1936 (r = sshpkt_get_u32(ssh, &s->ypixel)) != 0)
1937 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
1938
1939 if (strcmp(s->term, "") == 0) {
1940 free(s->term);
1941 s->term = NULL;
1942 }
1943
1944 /* Allocate a pty and open it. */
1945 debug("Allocating pty.");
1946 if (!PRIVSEP(pty_allocate(&s->ptyfd, &s->ttyfd, s->tty,
1947 sizeof(s->tty)))) {
1948 free(s->term);
1949 s->term = NULL;
1950 s->ptyfd = -1;
1951 s->ttyfd = -1;
1952 error("session_pty_req: session %d alloc failed", s->self);
1953 return 0;
1954 }
1955 debug("session_pty_req: session %d alloc %s", s->self, s->tty);
1956
1957 ssh_tty_parse_modes(ssh, s->ttyfd);
1958
1959 if ((r = sshpkt_get_end(ssh)) != 0)
1960 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
1961
1962 if (!use_privsep)
1963 pty_setowner(s->pw, s->tty);
1964
1965 /* Set window size from the packet. */
1966 pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
1967
1968 session_proctitle(s);
1969 return 1;
1970 }
1971
1972 static int
session_subsystem_req(struct ssh * ssh,Session * s)1973 session_subsystem_req(struct ssh *ssh, Session *s)
1974 {
1975 struct stat st;
1976 int r, success = 0;
1977 char *prog, *cmd;
1978 u_int i;
1979
1980 if ((r = sshpkt_get_cstring(ssh, &s->subsys, NULL)) != 0 ||
1981 (r = sshpkt_get_end(ssh)) != 0)
1982 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
1983 debug2("subsystem request for %.100s by user %s", s->subsys,
1984 s->pw->pw_name);
1985
1986 for (i = 0; i < options.num_subsystems; i++) {
1987 if (strcmp(s->subsys, options.subsystem_name[i]) == 0) {
1988 prog = options.subsystem_command[i];
1989 cmd = options.subsystem_args[i];
1990 if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) {
1991 s->is_subsystem = SUBSYSTEM_INT_SFTP;
1992 debug("subsystem: %s", prog);
1993 } else {
1994 if (stat(prog, &st) == -1)
1995 debug("subsystem: cannot stat %s: %s",
1996 prog, strerror(errno));
1997 s->is_subsystem = SUBSYSTEM_EXT;
1998 debug("subsystem: exec() %s", cmd);
1999 }
2000 success = do_exec(ssh, s, cmd) == 0;
2001 break;
2002 }
2003 }
2004
2005 if (!success)
2006 logit("subsystem request for %.100s by user %s failed, "
2007 "subsystem not found", s->subsys, s->pw->pw_name);
2008
2009 return success;
2010 }
2011
2012 static int
session_x11_req(struct ssh * ssh,Session * s)2013 session_x11_req(struct ssh *ssh, Session *s)
2014 {
2015 int r, success;
2016 u_char single_connection = 0;
2017
2018 if (s->auth_proto != NULL || s->auth_data != NULL) {
2019 error("session_x11_req: session %d: "
2020 "x11 forwarding already active", s->self);
2021 return 0;
2022 }
2023 if ((r = sshpkt_get_u8(ssh, &single_connection)) != 0 ||
2024 (r = sshpkt_get_cstring(ssh, &s->auth_proto, NULL)) != 0 ||
2025 (r = sshpkt_get_cstring(ssh, &s->auth_data, NULL)) != 0 ||
2026 (r = sshpkt_get_u32(ssh, &s->screen)) != 0 ||
2027 (r = sshpkt_get_end(ssh)) != 0)
2028 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2029
2030 s->single_connection = single_connection;
2031
2032 if (xauth_valid_string(s->auth_proto) &&
2033 xauth_valid_string(s->auth_data))
2034 success = session_setup_x11fwd(ssh, s);
2035 else {
2036 success = 0;
2037 error("Invalid X11 forwarding data");
2038 }
2039 if (!success) {
2040 free(s->auth_proto);
2041 free(s->auth_data);
2042 s->auth_proto = NULL;
2043 s->auth_data = NULL;
2044 }
2045 return success;
2046 }
2047
2048 static int
session_shell_req(struct ssh * ssh,Session * s)2049 session_shell_req(struct ssh *ssh, Session *s)
2050 {
2051 int r;
2052
2053 if ((r = sshpkt_get_end(ssh)) != 0)
2054 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2055 return do_exec(ssh, s, NULL) == 0;
2056 }
2057
2058 static int
session_exec_req(struct ssh * ssh,Session * s)2059 session_exec_req(struct ssh *ssh, Session *s)
2060 {
2061 u_int success;
2062 int r;
2063 char *command = NULL;
2064
2065 if ((r = sshpkt_get_cstring(ssh, &command, NULL)) != 0 ||
2066 (r = sshpkt_get_end(ssh)) != 0)
2067 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2068
2069 success = do_exec(ssh, s, command) == 0;
2070 free(command);
2071 return success;
2072 }
2073
2074 static int
session_break_req(struct ssh * ssh,Session * s)2075 session_break_req(struct ssh *ssh, Session *s)
2076 {
2077 int r;
2078
2079 if ((r = sshpkt_get_u32(ssh, NULL)) != 0 || /* ignore */
2080 (r = sshpkt_get_end(ssh)) != 0)
2081 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2082
2083 if (s->ptymaster == -1 || tcsendbreak(s->ptymaster, 0) == -1)
2084 return 0;
2085 return 1;
2086 }
2087
2088 static int
session_env_req(struct ssh * ssh,Session * s)2089 session_env_req(struct ssh *ssh, Session *s)
2090 {
2091 char *name, *val;
2092 u_int i;
2093 int r;
2094
2095 if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0 ||
2096 (r = sshpkt_get_cstring(ssh, &val, NULL)) != 0 ||
2097 (r = sshpkt_get_end(ssh)) != 0)
2098 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2099
2100 /* Don't set too many environment variables */
2101 if (s->num_env > 128) {
2102 debug2("Ignoring env request %s: too many env vars", name);
2103 goto fail;
2104 }
2105
2106 for (i = 0; i < options.num_accept_env; i++) {
2107 if (match_pattern(name, options.accept_env[i])) {
2108 debug2("Setting env %d: %s=%s", s->num_env, name, val);
2109 s->env = xrecallocarray(s->env, s->num_env,
2110 s->num_env + 1, sizeof(*s->env));
2111 s->env[s->num_env].name = name;
2112 s->env[s->num_env].val = val;
2113 s->num_env++;
2114 return (1);
2115 }
2116 }
2117 debug2("Ignoring env request %s: disallowed name", name);
2118
2119 fail:
2120 free(name);
2121 free(val);
2122 return (0);
2123 }
2124
2125 /*
2126 * Conversion of signals from ssh channel request names.
2127 * Subset of signals from RFC 4254 section 6.10C, with SIGINFO as
2128 * local extension.
2129 */
2130 static int
name2sig(char * name)2131 name2sig(char *name)
2132 {
2133 #define SSH_SIG(x) if (strcmp(name, #x) == 0) return SIG ## x
2134 SSH_SIG(HUP);
2135 SSH_SIG(INT);
2136 SSH_SIG(KILL);
2137 SSH_SIG(QUIT);
2138 SSH_SIG(TERM);
2139 SSH_SIG(USR1);
2140 SSH_SIG(USR2);
2141 #undef SSH_SIG
2142 #ifdef SIGINFO
2143 if (strcmp(name, "INFO@openssh.com") == 0)
2144 return SIGINFO;
2145 #endif
2146 return -1;
2147 }
2148
2149 static int
session_signal_req(struct ssh * ssh,Session * s)2150 session_signal_req(struct ssh *ssh, Session *s)
2151 {
2152 char *signame = NULL;
2153 int r, sig, success = 0;
2154
2155 if ((r = sshpkt_get_cstring(ssh, &signame, NULL)) != 0 ||
2156 (r = sshpkt_get_end(ssh)) != 0) {
2157 error_fr(r, "parse");
2158 goto out;
2159 }
2160 if ((sig = name2sig(signame)) == -1) {
2161 error_f("unsupported signal \"%s\"", signame);
2162 goto out;
2163 }
2164 if (s->pid <= 0) {
2165 error_f("no pid for session %d", s->self);
2166 goto out;
2167 }
2168 if (s->forced || s->is_subsystem) {
2169 error_f("refusing to send signal %s to %s session",
2170 signame, s->forced ? "forced-command" : "subsystem");
2171 goto out;
2172 }
2173 if (!use_privsep || mm_is_monitor()) {
2174 error_f("session signalling requires privilege separation");
2175 goto out;
2176 }
2177
2178 debug_f("signal %s, killpg(%ld, %d)", signame, (long)s->pid, sig);
2179 temporarily_use_uid(s->pw);
2180 r = killpg(s->pid, sig);
2181 restore_uid();
2182 if (r != 0) {
2183 error_f("killpg(%ld, %d): %s", (long)s->pid,
2184 sig, strerror(errno));
2185 goto out;
2186 }
2187
2188 /* success */
2189 success = 1;
2190 out:
2191 free(signame);
2192 return success;
2193 }
2194
2195 static int
session_auth_agent_req(struct ssh * ssh,Session * s)2196 session_auth_agent_req(struct ssh *ssh, Session *s)
2197 {
2198 static int called = 0;
2199 int r;
2200
2201 if ((r = sshpkt_get_end(ssh)) != 0)
2202 sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
2203 if (!auth_opts->permit_agent_forwarding_flag ||
2204 !options.allow_agent_forwarding) {
2205 debug_f("agent forwarding disabled");
2206 return 0;
2207 }
2208 if (called) {
2209 return 0;
2210 } else {
2211 called = 1;
2212 return auth_input_request_forwarding(ssh, s->pw);
2213 }
2214 }
2215
2216 int
session_input_channel_req(struct ssh * ssh,Channel * c,const char * rtype)2217 session_input_channel_req(struct ssh *ssh, Channel *c, const char *rtype)
2218 {
2219 int success = 0;
2220 Session *s;
2221
2222 if ((s = session_by_channel(c->self)) == NULL) {
2223 logit_f("no session %d req %.100s", c->self, rtype);
2224 return 0;
2225 }
2226 debug_f("session %d req %s", s->self, rtype);
2227
2228 /*
2229 * a session is in LARVAL state until a shell, a command
2230 * or a subsystem is executed
2231 */
2232 if (c->type == SSH_CHANNEL_LARVAL) {
2233 if (strcmp(rtype, "shell") == 0) {
2234 success = session_shell_req(ssh, s);
2235 } else if (strcmp(rtype, "exec") == 0) {
2236 success = session_exec_req(ssh, s);
2237 } else if (strcmp(rtype, "pty-req") == 0) {
2238 success = session_pty_req(ssh, s);
2239 } else if (strcmp(rtype, "x11-req") == 0) {
2240 success = session_x11_req(ssh, s);
2241 } else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
2242 success = session_auth_agent_req(ssh, s);
2243 } else if (strcmp(rtype, "subsystem") == 0) {
2244 success = session_subsystem_req(ssh, s);
2245 } else if (strcmp(rtype, "env") == 0) {
2246 success = session_env_req(ssh, s);
2247 }
2248 }
2249 if (strcmp(rtype, "window-change") == 0) {
2250 success = session_window_change_req(ssh, s);
2251 } else if (strcmp(rtype, "break") == 0) {
2252 success = session_break_req(ssh, s);
2253 } else if (strcmp(rtype, "signal") == 0) {
2254 success = session_signal_req(ssh, s);
2255 }
2256
2257 return success;
2258 }
2259
2260 void
session_set_fds(struct ssh * ssh,Session * s,int fdin,int fdout,int fderr,int ignore_fderr,int is_tty)2261 session_set_fds(struct ssh *ssh, Session *s,
2262 int fdin, int fdout, int fderr, int ignore_fderr, int is_tty)
2263 {
2264 /*
2265 * now that have a child and a pipe to the child,
2266 * we can activate our channel and register the fd's
2267 */
2268 if (s->chanid == -1)
2269 fatal("no channel for session %d", s->self);
2270 channel_set_fds(ssh, s->chanid,
2271 fdout, fdin, fderr,
2272 ignore_fderr ? CHAN_EXTENDED_IGNORE : CHAN_EXTENDED_READ,
2273 1, is_tty, CHAN_SES_WINDOW_DEFAULT);
2274 }
2275
2276 /*
2277 * Function to perform pty cleanup. Also called if we get aborted abnormally
2278 * (e.g., due to a dropped connection).
2279 */
2280 void
session_pty_cleanup2(Session * s)2281 session_pty_cleanup2(Session *s)
2282 {
2283 if (s == NULL) {
2284 error_f("no session");
2285 return;
2286 }
2287 if (s->ttyfd == -1)
2288 return;
2289
2290 debug_f("session %d release %s", s->self, s->tty);
2291
2292 /* Record that the user has logged out. */
2293 if (s->pid != 0)
2294 record_logout(s->pid, s->tty, s->pw->pw_name);
2295
2296 /* Release the pseudo-tty. */
2297 if (getuid() == 0)
2298 pty_release(s->tty);
2299
2300 /*
2301 * Close the server side of the socket pairs. We must do this after
2302 * the pty cleanup, so that another process doesn't get this pty
2303 * while we're still cleaning up.
2304 */
2305 if (s->ptymaster != -1 && close(s->ptymaster) == -1)
2306 error("close(s->ptymaster/%d): %s",
2307 s->ptymaster, strerror(errno));
2308
2309 /* unlink pty from session */
2310 s->ttyfd = -1;
2311 }
2312
2313 void
session_pty_cleanup(Session * s)2314 session_pty_cleanup(Session *s)
2315 {
2316 PRIVSEP(session_pty_cleanup2(s));
2317 }
2318
2319 static char *
sig2name(int sig)2320 sig2name(int sig)
2321 {
2322 #define SSH_SIG(x) if (sig == SIG ## x) return #x
2323 SSH_SIG(ABRT);
2324 SSH_SIG(ALRM);
2325 SSH_SIG(FPE);
2326 SSH_SIG(HUP);
2327 SSH_SIG(ILL);
2328 SSH_SIG(INT);
2329 SSH_SIG(KILL);
2330 SSH_SIG(PIPE);
2331 SSH_SIG(QUIT);
2332 SSH_SIG(SEGV);
2333 SSH_SIG(TERM);
2334 SSH_SIG(USR1);
2335 SSH_SIG(USR2);
2336 #undef SSH_SIG
2337 return "SIG@openssh.com";
2338 }
2339
2340 static void
session_close_x11(struct ssh * ssh,int id)2341 session_close_x11(struct ssh *ssh, int id)
2342 {
2343 Channel *c;
2344
2345 if ((c = channel_by_id(ssh, id)) == NULL) {
2346 debug_f("x11 channel %d missing", id);
2347 } else {
2348 /* Detach X11 listener */
2349 debug_f("detach x11 channel %d", id);
2350 channel_cancel_cleanup(ssh, id);
2351 if (c->ostate != CHAN_OUTPUT_CLOSED)
2352 chan_mark_dead(ssh, c);
2353 }
2354 }
2355
2356 static void
session_close_single_x11(struct ssh * ssh,int id,void * arg)2357 session_close_single_x11(struct ssh *ssh, int id, void *arg)
2358 {
2359 Session *s;
2360 u_int i;
2361
2362 debug3_f("channel %d", id);
2363 channel_cancel_cleanup(ssh, id);
2364 if ((s = session_by_x11_channel(id)) == NULL)
2365 fatal_f("no x11 channel %d", id);
2366 for (i = 0; s->x11_chanids[i] != -1; i++) {
2367 debug_f("session %d: closing channel %d",
2368 s->self, s->x11_chanids[i]);
2369 /*
2370 * The channel "id" is already closing, but make sure we
2371 * close all of its siblings.
2372 */
2373 if (s->x11_chanids[i] != id)
2374 session_close_x11(ssh, s->x11_chanids[i]);
2375 }
2376 free(s->x11_chanids);
2377 s->x11_chanids = NULL;
2378 free(s->display);
2379 s->display = NULL;
2380 free(s->auth_proto);
2381 s->auth_proto = NULL;
2382 free(s->auth_data);
2383 s->auth_data = NULL;
2384 free(s->auth_display);
2385 s->auth_display = NULL;
2386 }
2387
2388 static void
session_exit_message(struct ssh * ssh,Session * s,int status)2389 session_exit_message(struct ssh *ssh, Session *s, int status)
2390 {
2391 Channel *c;
2392 int r;
2393
2394 if ((c = channel_lookup(ssh, s->chanid)) == NULL)
2395 fatal_f("session %d: no channel %d", s->self, s->chanid);
2396 debug_f("session %d channel %d pid %ld",
2397 s->self, s->chanid, (long)s->pid);
2398
2399 if (WIFEXITED(status)) {
2400 channel_request_start(ssh, s->chanid, "exit-status", 0);
2401 if ((r = sshpkt_put_u32(ssh, WEXITSTATUS(status))) != 0 ||
2402 (r = sshpkt_send(ssh)) != 0)
2403 sshpkt_fatal(ssh, r, "%s: exit reply", __func__);
2404 } else if (WIFSIGNALED(status)) {
2405 channel_request_start(ssh, s->chanid, "exit-signal", 0);
2406 #ifndef WCOREDUMP
2407 # define WCOREDUMP(x) (0)
2408 #endif
2409 if ((r = sshpkt_put_cstring(ssh, sig2name(WTERMSIG(status)))) != 0 ||
2410 (r = sshpkt_put_u8(ssh, WCOREDUMP(status)? 1 : 0)) != 0 ||
2411 (r = sshpkt_put_cstring(ssh, "")) != 0 ||
2412 (r = sshpkt_put_cstring(ssh, "")) != 0 ||
2413 (r = sshpkt_send(ssh)) != 0)
2414 sshpkt_fatal(ssh, r, "%s: exit reply", __func__);
2415 } else {
2416 /* Some weird exit cause. Just exit. */
2417 ssh_packet_disconnect(ssh, "wait returned status %04x.", status);
2418 }
2419
2420 /* disconnect channel */
2421 debug_f("release channel %d", s->chanid);
2422
2423 /*
2424 * Adjust cleanup callback attachment to send close messages when
2425 * the channel gets EOF. The session will be then be closed
2426 * by session_close_by_channel when the child sessions close their fds.
2427 */
2428 channel_register_cleanup(ssh, c->self, session_close_by_channel, 1);
2429
2430 /*
2431 * emulate a write failure with 'chan_write_failed', nobody will be
2432 * interested in data we write.
2433 * Note that we must not call 'chan_read_failed', since there could
2434 * be some more data waiting in the pipe.
2435 */
2436 if (c->ostate != CHAN_OUTPUT_CLOSED)
2437 chan_write_failed(ssh, c);
2438 }
2439
2440 void
session_close(struct ssh * ssh,Session * s)2441 session_close(struct ssh *ssh, Session *s)
2442 {
2443 u_int i;
2444
2445 verbose("Close session: user %s from %.200s port %d id %d",
2446 s->pw->pw_name,
2447 ssh_remote_ipaddr(ssh),
2448 ssh_remote_port(ssh),
2449 s->self);
2450
2451 if (s->ttyfd != -1)
2452 session_pty_cleanup(s);
2453 free(s->term);
2454 free(s->display);
2455 free(s->x11_chanids);
2456 free(s->auth_display);
2457 free(s->auth_data);
2458 free(s->auth_proto);
2459 free(s->subsys);
2460 if (s->env != NULL) {
2461 for (i = 0; i < s->num_env; i++) {
2462 free(s->env[i].name);
2463 free(s->env[i].val);
2464 }
2465 free(s->env);
2466 }
2467 session_proctitle(s);
2468 session_unused(s->self);
2469 }
2470
2471 void
session_close_by_pid(struct ssh * ssh,pid_t pid,int status)2472 session_close_by_pid(struct ssh *ssh, pid_t pid, int status)
2473 {
2474 Session *s = session_by_pid(pid);
2475 if (s == NULL) {
2476 debug_f("no session for pid %ld", (long)pid);
2477 return;
2478 }
2479 if (s->chanid != -1)
2480 session_exit_message(ssh, s, status);
2481 if (s->ttyfd != -1)
2482 session_pty_cleanup(s);
2483 s->pid = 0;
2484 }
2485
2486 /*
2487 * this is called when a channel dies before
2488 * the session 'child' itself dies
2489 */
2490 void
session_close_by_channel(struct ssh * ssh,int id,void * arg)2491 session_close_by_channel(struct ssh *ssh, int id, void *arg)
2492 {
2493 Session *s = session_by_channel(id);
2494 u_int i;
2495
2496 if (s == NULL) {
2497 debug_f("no session for id %d", id);
2498 return;
2499 }
2500 debug_f("channel %d child %ld", id, (long)s->pid);
2501 if (s->pid != 0) {
2502 debug_f("channel %d: has child, ttyfd %d", id, s->ttyfd);
2503 /*
2504 * delay detach of session, but release pty, since
2505 * the fd's to the child are already closed
2506 */
2507 if (s->ttyfd != -1)
2508 session_pty_cleanup(s);
2509 return;
2510 }
2511 /* detach by removing callback */
2512 channel_cancel_cleanup(ssh, s->chanid);
2513
2514 /* Close any X11 listeners associated with this session */
2515 if (s->x11_chanids != NULL) {
2516 for (i = 0; s->x11_chanids[i] != -1; i++) {
2517 session_close_x11(ssh, s->x11_chanids[i]);
2518 s->x11_chanids[i] = -1;
2519 }
2520 }
2521
2522 s->chanid = -1;
2523 session_close(ssh, s);
2524 }
2525
2526 void
session_destroy_all(struct ssh * ssh,void (* closefunc)(Session *))2527 session_destroy_all(struct ssh *ssh, void (*closefunc)(Session *))
2528 {
2529 int i;
2530 for (i = 0; i < sessions_nalloc; i++) {
2531 Session *s = &sessions[i];
2532 if (s->used) {
2533 if (closefunc != NULL)
2534 closefunc(s);
2535 else
2536 session_close(ssh, s);
2537 }
2538 }
2539 }
2540
2541 static char *
session_tty_list(void)2542 session_tty_list(void)
2543 {
2544 static char buf[1024];
2545 int i;
2546 char *cp;
2547
2548 buf[0] = '\0';
2549 for (i = 0; i < sessions_nalloc; i++) {
2550 Session *s = &sessions[i];
2551 if (s->used && s->ttyfd != -1) {
2552
2553 if (strncmp(s->tty, "/dev/", 5) != 0) {
2554 cp = strrchr(s->tty, '/');
2555 cp = (cp == NULL) ? s->tty : cp + 1;
2556 } else
2557 cp = s->tty + 5;
2558
2559 if (buf[0] != '\0')
2560 strlcat(buf, ",", sizeof buf);
2561 strlcat(buf, cp, sizeof buf);
2562 }
2563 }
2564 if (buf[0] == '\0')
2565 strlcpy(buf, "notty", sizeof buf);
2566 return buf;
2567 }
2568
2569 void
session_proctitle(Session * s)2570 session_proctitle(Session *s)
2571 {
2572 if (s->pw == NULL)
2573 error("no user for session %d", s->self);
2574 else
2575 setproctitle("%s@%s", s->pw->pw_name, session_tty_list());
2576 }
2577
2578 int
session_setup_x11fwd(struct ssh * ssh,Session * s)2579 session_setup_x11fwd(struct ssh *ssh, Session *s)
2580 {
2581 struct stat st;
2582 char display[512], auth_display[512];
2583 char hostname[NI_MAXHOST];
2584 u_int i;
2585
2586 if (!auth_opts->permit_x11_forwarding_flag) {
2587 ssh_packet_send_debug(ssh, "X11 forwarding disabled by key options.");
2588 return 0;
2589 }
2590 if (!options.x11_forwarding) {
2591 debug("X11 forwarding disabled in server configuration file.");
2592 return 0;
2593 }
2594 if (options.xauth_location == NULL ||
2595 (stat(options.xauth_location, &st) == -1)) {
2596 ssh_packet_send_debug(ssh, "No xauth program; cannot forward X11.");
2597 return 0;
2598 }
2599 if (s->display != NULL) {
2600 debug("X11 display already set.");
2601 return 0;
2602 }
2603 if (x11_create_display_inet(ssh, options.x11_display_offset,
2604 options.x11_use_localhost, s->single_connection,
2605 &s->display_number, &s->x11_chanids) == -1) {
2606 debug("x11_create_display_inet failed.");
2607 return 0;
2608 }
2609 for (i = 0; s->x11_chanids[i] != -1; i++) {
2610 channel_register_cleanup(ssh, s->x11_chanids[i],
2611 session_close_single_x11, 0);
2612 }
2613
2614 /* Set up a suitable value for the DISPLAY variable. */
2615 if (gethostname(hostname, sizeof(hostname)) == -1)
2616 fatal("gethostname: %.100s", strerror(errno));
2617 /*
2618 * auth_display must be used as the displayname when the
2619 * authorization entry is added with xauth(1). This will be
2620 * different than the DISPLAY string for localhost displays.
2621 */
2622 if (options.x11_use_localhost) {
2623 snprintf(display, sizeof display, "localhost:%u.%u",
2624 s->display_number, s->screen);
2625 snprintf(auth_display, sizeof auth_display, "unix:%u.%u",
2626 s->display_number, s->screen);
2627 s->display = xstrdup(display);
2628 s->auth_display = xstrdup(auth_display);
2629 } else {
2630 #ifdef IPADDR_IN_DISPLAY
2631 struct hostent *he;
2632 struct in_addr my_addr;
2633
2634 he = gethostbyname(hostname);
2635 if (he == NULL) {
2636 error("Can't get IP address for X11 DISPLAY.");
2637 ssh_packet_send_debug(ssh, "Can't get IP address for X11 DISPLAY.");
2638 return 0;
2639 }
2640 memcpy(&my_addr, he->h_addr_list[0], sizeof(struct in_addr));
2641 snprintf(display, sizeof display, "%.50s:%u.%u", inet_ntoa(my_addr),
2642 s->display_number, s->screen);
2643 #else
2644 snprintf(display, sizeof display, "%.400s:%u.%u", hostname,
2645 s->display_number, s->screen);
2646 #endif
2647 s->display = xstrdup(display);
2648 s->auth_display = xstrdup(display);
2649 }
2650
2651 return 1;
2652 }
2653
2654 static void
do_authenticated2(struct ssh * ssh,Authctxt * authctxt)2655 do_authenticated2(struct ssh *ssh, Authctxt *authctxt)
2656 {
2657 server_loop2(ssh, authctxt);
2658 }
2659
2660 void
do_cleanup(struct ssh * ssh,Authctxt * authctxt)2661 do_cleanup(struct ssh *ssh, Authctxt *authctxt)
2662 {
2663 static int called = 0;
2664
2665 debug("do_cleanup");
2666
2667 /* no cleanup if we're in the child for login shell */
2668 if (is_child)
2669 return;
2670
2671 /* avoid double cleanup */
2672 if (called)
2673 return;
2674 called = 1;
2675
2676 if (authctxt == NULL)
2677 return;
2678
2679 #ifdef USE_PAM
2680 if (options.use_pam) {
2681 sshpam_cleanup();
2682 sshpam_thread_cleanup();
2683 }
2684 #endif
2685
2686 if (!authctxt->authenticated)
2687 return;
2688
2689 #ifdef KRB5
2690 if (options.kerberos_ticket_cleanup &&
2691 authctxt->krb5_ctx)
2692 krb5_cleanup_proc(authctxt);
2693 #endif
2694
2695 #ifdef GSSAPI
2696 if (options.gss_cleanup_creds)
2697 ssh_gssapi_cleanup_creds();
2698 #endif
2699
2700 /* remove agent socket */
2701 auth_sock_cleanup_proc(authctxt->pw);
2702
2703 /* remove userauth info */
2704 if (auth_info_file != NULL) {
2705 temporarily_use_uid(authctxt->pw);
2706 unlink(auth_info_file);
2707 restore_uid();
2708 free(auth_info_file);
2709 auth_info_file = NULL;
2710 }
2711
2712 /*
2713 * Cleanup ptys/utmp only if privsep is disabled,
2714 * or if running in monitor.
2715 */
2716 if (!use_privsep || mm_is_monitor())
2717 session_destroy_all(ssh, session_pty_cleanup2);
2718 }
2719
2720 /* Return a name for the remote host that fits inside utmp_size */
2721
2722 const char *
session_get_remote_name_or_ip(struct ssh * ssh,u_int utmp_size,int use_dns)2723 session_get_remote_name_or_ip(struct ssh *ssh, u_int utmp_size, int use_dns)
2724 {
2725 const char *remote = "";
2726
2727 if (utmp_size > 0)
2728 remote = auth_get_canonical_hostname(ssh, use_dns);
2729 if (utmp_size == 0 || strlen(remote) > utmp_size)
2730 remote = ssh_remote_ipaddr(ssh);
2731 return remote;
2732 }
2733
2734