| # Seccomp |
| |
| The seccomp system is used to filter the syscalls that sandboxed processes can use. The form of |
| seccomp used by crosvm (`SECCOMP_SET_MODE_FILTER`) allows for a BPF program to be used. To generate |
| the BPF programs, crosvm uses minijail's policy file format. A policy file is written for each |
| device per architecture. Each device requires a unique set of syscalls to accomplish their function |
| and each architecture has slightly different naming for similar syscalls. The ChromeOS docs have a |
| useful |
| [listing of syscalls](https://www.chromium.org/chromium-os/developer-library/reference/linux-constants/syscalls/). |
| |
| The seccomp policies are compiled from `.policy` source files into BPF bytecode by |
| [`jail/build.rs`](https://chromium.googlesource.com/crosvm/crosvm/+/refs/heads/main/jail/build.rs) |
| and embedded in the crosvm executable, so it is not necessary to install the seccomp policy files, |
| only the crosvm binary itself. Be sure to remember to rebuild crosvm after changing a policy file to |
| observe the updated behavior. |
| |
| ## Writing a Policy for crosvm |
| |
| The detailed rules for naming policy files can be found in |
| [jail/seccomp/README.md](https://chromium.googlesource.com/crosvm/crosvm/+/refs/heads/main/jail/seccomp/README.md) |
| |
| Most policy files will include the `common_device.policy` from a given architecture using this |
| directive near the top: |
| |
| ``` |
| @include /usr/share/policy/crosvm/common_device.policy |
| ``` |
| |
| The common device policy for `x86_64` is: |
| |
| ``` |
| {{#include ../../../../jail/seccomp/x86_64/common_device.policy:5:}} |
| ``` |
| |
| The syntax is simple: one syscall per line, followed by a colon `:`, followed by a boolean |
| expression used to constrain the arguments of the syscall. The simplest expression is `1` which |
| unconditionally allows the syscall. Only simple expressions work, often to allow or deny specific |
| flags. A major limitation is that checking the contents of pointers isn't possible using minijail's |
| policy format. If a syscall is not listed in a policy file, it is not allowed. |