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