Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Oct 2010 21:25:57 -0700
From:      Julian Elischer <julian@freebsd.org>
To:        Devin Teske <dteske@vicor.com>
Cc:        freebsd-rc@freebsd.org, Pawel Jakub Dawidek <pjd@freebsd.org>
Subject:   Re: sysrc(8) -- a sysctl(8)-like utility for managing rc.conf(5)
Message-ID:  <4CBE6F55.5040609@freebsd.org>
In-Reply-To: <1287540769.25599.73.camel@localhost.localdomain>
References:  <1286925182.32724.18.camel@localhost.localdomain>	 <1286996709.32724.60.camel@localhost.localdomain>	 <1287448781.5713.3.camel@localhost.localdomain>	 <1287510629.25599.2.camel@localhost.localdomain>	 <20101019195225.GB2127@garage.freebsd.pl> <1287540769.25599.73.camel@localhost.localdomain>

next in thread | previous in thread | raw e-mail | index | archive | help
  On 10/19/10 7:12 PM, Devin Teske wrote:
> On Tue, 2010-10-19 at 21:52 +0200, Pawel Jakub Dawidek wrote:
>> On Tue, Oct 19, 2010 at 10:50:29AM -0700, Devin Teske wrote:
>>> I added `-j jail' for specifying a jail id or name to operate within
>>> (requires jls(8); overrides `-R dir').
>> [...]
>>
>> Note that operating on jail files from outside a jail is serious
>> security problem. The files from within the jail can be symbolic links
>> that point to files from outside a jail from your perspective.  Even
>> chroot(2) to jail's root is neither safe (running applications that can
>> be modified by jail's root is obvious security hole) nor reliable (jail
>> might not have all the commands). The only safe way is to jexec(8) into
>> a jail, but it of course has the same relialability issue as chroot(8).
>>
> I see the concern, and you're absolutely right.
>
> I did see the need to use either chroot(8) or jexec(8), but for exactly
> the same reasons you mention (handing execution off-to something that
> could have been modified by the jail's root-user), I ended up writing
> routines that just edited the files outside the jail.
>
> It appears that (due to the other aforementioned security problem,
> involving hand-crafted symbolic links with malicious-intent), the only
> proper solution would be:
>
> a. Copy ourselves into some temporary location within the jail
> b. Hand execution off to ourself using either jexec(8) or chroot(8)
>
can you fire off a shell in the jail and somehow shove yourself down 
it's throat?
I vaguely remember that one  could feed a shell script into the shell 
somehow..
but I forget the details.

> And in doing that, we'll be properly jailed so that no matter the attack
> vector, we'll be covered via the kernel's built-in protection.
>
> How does that sound?
>
> For example (note: die() is a custom shell function and it does what
> you'd expect it to):
>
> progname="${0##*/}"
> tmp="$ROOTDIR/tmp/$progname"
> case "$0" in
> */*) cp "$0" "$tmp" || die \
>       	"%s: Unable to copy self to \`%s'" \
>       	"$progname" "$tmp"
>       ;;
> *) for dir in $PATH; do
>     	[ -f "$dir/$progname" -a -x "$dir/$progname" ] || continue
>     	cp "$dir/$progname" "$tmp" || die \
>     		"%s: Unable to copy self to \`%s'" \
>     		"$progname" "$tmp"
>     	break
>     done
>     [ -f "$tmp" -a -x "$tmp" ] || die \
>     	"%s: Unable to copy self to \`%s'" \
>     	"$progname" "$tmp"
> esac
> jexec $JAIL $tmp \
> 	${SYSRC_VERBOSE:+-v} \
> 	${RC_CONFS:+-f"$RC_CONFS"} \
> 	$( [ "$SHOW_ALL" = "1" ]&&  echo -a ) \
> 	$( [ "$SHOW_ALL" = "2" ]&&  echo -A ) \
> 	${DESCRIBE:+-d} \
> 	${SHOW_EQUALS:+-e} \
> 	${IGNORE_UNKNOWNS:+-i} \
> 	${SHOW_NAME:--n} \
> 	${SHOW_VALUE:--N} \
> 	${ROOTDIR:+-R"$ROOTDIR"}
>
> Or something like that.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4CBE6F55.5040609>