GSOC : Draft proposal for capsicum
Joris GIOVANNANGELI
joris at giovannangeli.fr
Mon Apr 15 07:00:26 PDT 2013
(it looks like my first mail did not go to the list because i was not
subscribed.
Sorry if it was sent twice)
Hi,
I'm a 4th year CS student at Université Diderot Paris 7. I don't really
have any
public open source C code yet, but it's a good time to start ! I've
attended two
OS/System class, one on Unix kernel internal, and the other on POSIX
API. I've
been reading parts of the DragonFly kernel during the laste year, and
writting some
hammering code to get familiar with it. I've already started a capscium
port,
but it's still in an early state. I wrote those patches in december, but
most of
them are outdated since FreeBSD reworked the capsicum kernel API since that
(keeping a compatibility layer). HEre is a draft proposal. Since some code
whould be quite pervasive in the kernel, please comment !
CAPSICUM
Capsicum is a fine grained capability framework for unix systems. It can
be use
to sandbox applications by restructing their access to various global
namespaces.
While DAC and unix rights grant access at the user level, capscium is
designed
to implement security policies at the application or library level.
Unlike MAC
frameworks (SELinux, AppArmor, ...) where access profile is configured
out of the
code, capsicum sandboxing policy might directly be built in the application
itself. Capscum is currently implemented in the FreeBSD kernel, and some
work is
ongoing on the linux side.
KERNEL PART
Capsicum extends various POSIX API and add some others. The kernel part
are :
* Capability mode : a process mode, set by a system call, in which
acces to
global namespaces is restricted. For instance, system calls like
open(2),
socket(2) might not be used. The capability mode is inherited by the
child
processes. Once in capability mode, only the delegated rights may be
used.
* Capabilities : rights can be attached to file descriptors to
restrict access.
Descriptors already have access flags, but nothing prevents you tu
upgrade a
readonly file descriptor to a read-write one. Capabilities can be
granted by
a set of system calls.
* Process descriptors : on POSIX systems, you can only manage process by
accessing the PID namespace. To allow parent pids to manage childs
while
in capability mode, a new API have been created. Like file descriptors,
they are local descriptors for process and can be managed by a set of
syscalls : pdfork, pdkill, pdwait4 and pdgetpid.
* Shared memory : anonymous shared memory has been extended to allow
shared
memory segment to be referenced and accessed by descriptors.
USERSPACE PART
The userspace tools and libraries are still a moving target.
* Applications and livrariies have to be converted to capsicum. Rights
have to
be defined for various critical libraries, and some tools have to be
splitted
between a worker process in capability mode and a control process.
* libcapsicum : a library is beeing created to ease the developpement of
capsicum-enabled tools.
* casper is a prototyped daemon which offers various services to
process in
capability mode, like DNS resolution.
PROJECT GOALS
The userspace implemnetations are not yet finalized and a lot of them could
be ported from FreeBSD once they are done. This proposal is mostly about
the
kernel APIs. The goal is to have an implementation of the various syscalls
compatible with the FreeBSD kernel API.
The shared memory extension has already been implemented in dragonfly.
Hence,
only the first three parts have to be implemented, with the glue needed to
integrate them in the kernel and the build system (for instance, the
capability
mode flag has to be add to the process structure).
TIMELINE
I could start coding in June.
- 3 weeks :
Implement capabilities for filedescriptos in kern_descrip.c.
White-listed
capabilities have to be attached to each filedesc. An Ioctls
white-list is
needed, which means dynamically alloced space for each
filedescriptor with
such list. Capabilities are check each time a process gets a file
opinter
from a file descriptot.
- 3 weeks :
Capability mode. This include a set of syscall to set/get
capabilities of a
descriptor, fork/rpces integration, and maybe some ktrace
integration for
debugging purpose. In this area the code skeleton from freeBSD can
be reused,
but not "as-is", due to different locking mechanisms.
- 2 weeks :
Add capability checks ti various syscalls : *at(2), nlookup, sysctl.
This
should be fairly easy, but at this point, I should have a semi-working
capsicum implementation, and it whould be a good time to do some
testing.
- Mid-term evaluation
- 3 weeks :
proces descriptor API. Add 4 syscalls pdfiork, pdwait4, pdkill, and
pdgetpid
which use file descriptor-like API to reference processes.
- 2 weeks :
Add connectat() and bindat() syscalls for UNIX domain sockets. Their
behavior
whould be similar to the *at syscall familly.
- remaining time :
Check the syscalls list, the sysctl and the ioctls list to identify
the safe
ones, and to more testing of the whole implementation. If possible,
try to
port some FreeBSD tool which uses capsicum and make it run.
LINKS
capsicum project page : http://www.cl.cam.ac.uk/research/security/capsicum/
Thanks for reading,
Joris
GIOVANNANGELI
More information about the Kernel
mailing list