FreeBSD src
Go to file
Ed Schouten 457f7e23b1 Implement CloudABI's exec() call.
Summary:
In a runtime that is purely based on capability-based security, there is
a strong emphasis on how programs start their execution. We need to make
sure that we execute an new program with an exact set of file
descriptors, ensuring that credentials are not leaked into the process
accidentally.

Providing the right file descriptors is just half the problem. There
also needs to be a framework in place that gives meaning to these file
descriptors. How does a CloudABI mail server know which of the file
descriptors corresponds to the socket that receives incoming emails?
Furthermore, how will this mail server acquire its configuration
parameters, as it cannot open a configuration file from a global path on
disk?

CloudABI solves this problem by replacing traditional string command
line arguments by tree-like data structure consisting of scalars,
sequences and mappings (similar to YAML/JSON). In this structure, file
descriptors are treated as a first-class citizen. When calling exec(),
file descriptors are passed on to the new executable if and only if they
are referenced from this tree structure. See the cloudabi-run(1) man
page for more details and examples (sysutils/cloudabi-utils).

Fortunately, the kernel does not need to care about this tree structure
at all. The C library is responsible for serializing and deserializing,
but also for extracting the list of referenced file descriptors. The
system call only receives a copy of the serialized data and a layout of
what the new file descriptor table should look like:

    int proc_exec(int execfd, const void *data, size_t datalen, const int *fds,
              size_t fdslen);

This change introduces a set of fd*_remapped() functions:

- fdcopy_remapped() pulls a copy of a file descriptor table, remapping
  all of the file descriptors according to the provided mapping table.
- fdinstall_remapped() replaces the file descriptor table of the process
  by the copy created by fdcopy_remapped().
- fdescfree_remapped() frees the table in case we aborted before
  fdinstall_remapped().

We then add a function exec_copyin_data_fds() that builds on top these
functions. It copies in the data and constructs a new remapped file
descriptor. This is used by cloudabi_sys_proc_exec().

Test Plan:
cloudabi-run(1) is capable of spawning processes successfully, providing
it data and file descriptors. procstat -f seems to confirm all is good.
Regular FreeBSD processes also work properly.

Reviewers: kib, mjg

Reviewed By: mjg

Subscribers: imp

Differential Revision: https://reviews.freebsd.org/D3079
2015-07-16 07:05:42 +00:00
bin mdoc: minor Xr fixes 2015-07-14 19:45:35 +00:00
cddl Rename zfs nvpair files to not colidate with our nvlist. 2015-07-09 21:53:40 +00:00
contrib MFV r285292: 2015-07-08 23:57:58 +00:00
crypto Merge OpenSSL 1.0.1p. 2015-07-09 17:07:45 +00:00
etc Allow again periodic scripts to be run from command-line. 2015-07-13 10:15:01 +00:00
games Fix a typo. 2015-07-02 11:46:35 +00:00
gnu Use single instance of the identical INKERNEL() and PMC_IN_KERNEL() 2015-07-02 14:37:21 +00:00
include Use the __sentinel attribute. 2015-07-08 16:21:10 +00:00
kerberos5 Fix a typo introduced in r262209. 2015-06-18 21:18:43 +00:00
lib .ie is not supposed to be used in manpages 2015-07-14 15:21:00 +00:00
libexec Add on the addend when in the R_AARCH64_ABS64 and R_AARCH64_GLOB_DAT cases. 2015-07-05 11:42:01 +00:00
release Remove the r282727 entry for now, pending refinement based 2015-07-14 23:41:13 +00:00
rescue Add META_MODE support. 2015-06-13 19:20:56 +00:00
sbin fix the docs, the number of frags per inode (NFPI) changed in r228794 2015-07-15 21:35:09 +00:00
secure Merge OpenSSL 1.0.1p. 2015-07-09 17:07:45 +00:00
share Implement the CloudABI random_get() system call. 2015-07-14 18:45:15 +00:00
sys Implement CloudABI's exec() call. 2015-07-16 07:05:42 +00:00
targets Updated depends 2015-07-03 06:11:54 +00:00
tests Vendor import of tcpdump 4.7.4. 2015-07-06 02:16:08 +00:00
tools Comment out usr/sbin/mailwrapper removal 2015-07-16 02:08:54 +00:00
usr.bin Fix trimming spaces writing at index -1 if an empty string is passed 2015-07-15 18:49:15 +00:00
usr.sbin Fix formatting. 2015-07-16 05:14:20 +00:00
.arcconfig Add repository.callsign, to help arcanist figure out what repo it's 2015-07-02 22:23:52 +00:00
.arclint phabricator related changes: 2015-04-20 20:33:22 +00:00
COPYRIGHT Bump copyright year. 2014-12-31 10:00:43 +00:00
LOCKS Explicitly require Security Officer's approval for kernel PRNG bits. 2013-09-17 14:19:05 +00:00
MAINTAINERS Remove cokane@ from MAINTAINERS for 3dfx(4)/tdfx(4) because their email 2014-11-25 05:25:12 +00:00
Makefile Import OpenSSL 1.0.1p. 2015-07-09 16:41:34 +00:00
Makefile.inc1 First cut of DTrace for AArch64. 2015-07-01 15:51:11 +00:00
ObsoleteFiles.inc Rename the dtrace-* man pages to dtrace_* for consistency with other 2015-07-05 23:23:12 +00:00
README Import OpenSSL 1.0.1p. 2015-07-09 16:41:34 +00:00
UPDATING Add warning about change of behavior for sendmail 8.15.2 under FreeBSD 11 2015-07-07 03:03:17 +00:00

This is the top level of the FreeBSD source directory.  This file
was last revised on:
$FreeBSD$

For copyright information, please see the file COPYRIGHT in this
directory (additional copyright information also exists for some
sources in this tree - please see the specific source directories for
more information).

The Makefile in this directory supports a number of targets for
building components (or all) of the FreeBSD source tree.  See build(7)
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html
for more information, including setting make(1) variables.

The `buildkernel` and `installkernel` targets build and install
the kernel and the modules (see below).  Please see the top of
the Makefile in this directory for more information on the
standard build targets and compile-time flags.

Building a kernel is a somewhat more involved process.  See build(7), config(8),
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html
for more information.

Note: If you want to build and install the kernel with the
`buildkernel` and `installkernel` targets, you might need to build
world before.  More information is available in the handbook.

The kernel configuration files reside in the sys/<arch>/conf
sub-directory.  GENERIC is the default configuration used in release builds.
NOTES contains entries and documentation for all possible
devices, not just those commonly used.


Source Roadmap:
---------------

bin		System/user commands.

cddl		Various commands and libraries under the Common Development
		and Distribution License.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

games		Amusements.

gnu		Various commands and libraries under the GNU Public License.
		Please see gnu/COPYING* for more information.

include		System include files.

kerberos5	Kerberos5 (Heimdal) package.

lib		System libraries.

libexec		System daemons.

release		Release building Makefile & associated tools.

rescue		Build system for statically linked /rescue utilities.

sbin		System commands.

secure		Cryptographic libraries and commands.

share		Shared resources.

sys		Kernel sources.

tests		Regression tests which can be run by Kyua.  See tests/README
		for additional information.

tools		Utilities for regression testing and miscellaneous tasks.

usr.bin		User commands.

usr.sbin	System administration commands.


For information on synchronizing your source tree with one or more of
the FreeBSD Project's development branches, please see:

  http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/synching.html