blob: 001001280ec47ee9c681a53ca5d4d80121d70060 [file] [log] [blame] [view]
# Sandboxing
This document describes how sandboxing works for a process
in Fuchsia.
## A new process has nothing
In Fuchsia, a newly created process is empty. It cannot
access any kernel objects, allocate memory, or execute code.
Because of this, processes are usually created with some
initial resources and capabilities.
Most commonly, a process starts executing some code with an initial stack, some
command line arguments, some environment variables, and a set of initial handles.
[Zircon program loading and dynamic linking](/docs/concepts/booting/program_loading.md) describes
the resources provided to programs when starting.
## Namespaces are the gateway to the world
Some of the initial handles given to a process are directories that the process
mounts into its _namespace_. These handles let the process discover and
communicate with other processes running on the system, including file systems
and other servers. See [Namespaces](/docs/concepts/framework/namespaces.md) for more details.
The namespace given to a process strongly influences how much of the system the
process can influence. Therefore, configuring the sandbox in which a process
runs amounts to configuring the process's namespace.
## Package namespace
A [component](/docs/glossary.md#component) run from a package is given access to
`/pkg`, which is a read-only view of the package containing the component. To
access these resources at runtime, a process can use the `/pkg` namespace. For
example, the `root_presenter` can access `cursor32.png` using the absolute path
`/pkg/data/cursor32.png`.
## Services
Processes that are [components](/docs/glossary.md#component) receive an `/svc`
directory in their namespace. The services available through `/svc` are a
subset of the services provided by the component's
[environment](/docs/glossary.md#environment). This subset is determined by the
[`sandbox.services`](/docs/concepts/components/v1/component_manifests.md#sandbox) allowlist in the
component's [manifest file](/docs/concepts/components/v1/component_manifests.md).
A typical component will interact with a number of services from `/svc` in
order to play some useful role in the system. For example, the service
`fuchsia.sys.Launcher` is required if a component wishes to launch other
components.
Processes that are not components may or may not have `/svc`. These processes
receive whatever `/svc` their creator provided to them.
## Configuring additional namespaces
If a component requires access to additional resources (for example, device drivers),
the package can request access to additional names by including the `sandbox`
property in its [Component Manifest](/docs/concepts/components/v1/component_manifests.md)
for the package. For example, to request direct access to the input drive,
include the following `dev` array in your `sandbox`:
```
{
"dev": [ "class/input" ]
}
```