Date: Thu, 21 Sep 1995 13:29:21 -0700 (MST) From: Terry Lambert <terry@lambert.org> To: current@freebsd.org Subject: chroot wierdness in namei() Message-ID: <199509212029.NAA26779@phaeton.artisoft.com>
next in thread | raw e-mail | index | archive | help
In the lookup() function callwd by namei() in vfs_lookup.c, the following loop is present for processing "..": if (cnp->cn_flags & ISDOTDOT) { for (;;) { *** if (dp == ndp->ni_rootdir || dp == rootvnode) { ndp->ni_dvp = dp; ndp->ni_vp = dp; VREF(dp); goto nextname; } if ((dp->v_flag & VROOT) == 0 || (cnp->cn_flags & NOCROSSMOUNT)) break; tdp = dp; dp = dp->v_mount->mnt_vnodecovered; vput(tdp); VREF(dp); VOP_LOCK(dp); } } In the line marked "***", does anyone else think the "dp == rootvnode" check is bogus? In the namei() that calls it, the following code is used: /* * Get starting point for the translation. */ if ((ndp->ni_rootdir = fdp->fd_rdir) == NULL) ndp->ni_rootdir = rootvnode; dp = fdp->fd_cdir; VREF(dp); The only failure case I see is: I) A security hole is exercised: 1) open 'dir' 2) chroot to subtree not containing 'dir' 3) fchdir() to 'dir' (making the current directory outside the chrooted heirarchy). 4) use a relative path containing ".." from there causing an attempt at a ".." traversal of the real "/". II) A directory hard link transits out of the chroot'ed subgraph. It seems this would be a security hole in any case, right? I could write a program to open an fd for a dir and turn off close on exec and then run an suid program that chroot'ed me and then sneak out. Right? I mean one could use the "play" chroot() suggested in the hack sources or an SUID perl script (using "secure" perl) or any of a number of tools for doing things like administering your personal area of a public FTP server. Perhaps fd's open to VDIR vnodes should be closed on chroot(2)? It's not like chroot()'ing is a reversable process (well, unless you have an fd to a dir out of the chrooted'ed hierarchy and use it to call chroot again to chroot to "/". 8-)), so perhaps this hole should be plugged? And then the check for rootvnode removed from lookup()? Directory hard links should be an error in any case (needs fixed). Terry Lambert terry@lambert.org --- Any opinions in this posting are my own and not those of my present or previous employers.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199509212029.NAA26779>