Date: Sun, 3 Nov 1996 04:36:41 +1030 (CST) From: newton@communica.com.au (Mark Newton) To: Don.Lewis@tsc.tdk.com (Don Lewis) Cc: marcs@znep.com, dev@trifecta.com, freebsd-security@FreeBSD.org Subject: Re: chroot() security Message-ID: <9611021806.AA19481@communica.com.au> In-Reply-To: <199611020401.UAA07806@salsa.gv.ssi1.com> from "Don Lewis" at Nov 1, 96 08:01:03 pm
next in thread | previous in thread | raw e-mail | index | archive | help
Don Lewis wrote:
> BTW, thanks for mentioning ptrace(). I hadn't thought of that one.
There's a far more obvious one: The same data structures and library
routines which provide "ps" with its ability to find the process table in
kvm space can permit an attacker with root privileges in a chroot()'ed
environment to find the process table for the purpose of changing his
root directory right back to what it used to be by reading and writing
/dev/kmem.
Those who are using FreeBSD in a security-conscious environment can
benefit from source code by tweaking it to enforce their sites' security
policies (Werner has already expounded on one example of this). Perhaps
one obvious example of where a source code tweak would assist chroot()'ed
secure spaces is a test which could be added to the setuid() system
call and the filesystem setuid-bit semantics to make uid changes succeed
only if the following conditions are met:
* process executing setuid() is owned by root
we should allow root processes to call setuid() because a) they
can't cause any more damage, and b) "login" and "ftpd" require
setuid() calls to assume the privileges of whoever is using them;
AND
* process executing setuid() is not chroot()'ed
this can be evaluated by comparing the process' root directory against
that of a known system process, such as init (that way you get the
benefit of catching all the chroot()ed child processes as well, without
needing to maintain an "I've been chroot()ed" flag in the proc structure)
Essentially, that'd mean that chrooted processes could never gain the
privileges of another user, including the root user, regardless of
how many setuid programs have been carelessly left behind: Once chroot()
executes, setuid() and the setuid-bit on files both stop working.
Yes, this will break certain executables. No, you probably shouldn't have
those executables in your "secure" area - The whole point of a secure
space is to compartmentalize privileges, so why would you be using it to
provide services which blur privilege boundries?!
Note that I'm not suggesting this as something that should be added to
FreeBSD per se; Rather, I'm suggesting that users of FreeBSD in security-
critical environments can benefit from having kernel sources by taking
the opportunity to "harden" their kernel. Those who make the attempt
will find that once their security policy has been codified in written form,
translating that written form to source code is surprisingly easy
(interdependencies and subtle interrelationships notwithstanding - Be
careful!). The suggestion given above, for example, can be implemented
with just a few lines of C.
- mark
---
Mark Newton Email: newton@communica.com.au
Systems Engineer Phone: +61-8-8373-2523
Communica Systems WWW: http://www.communica.com.au
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9611021806.AA19481>
