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