6 isolate - Isolate a process using Linux Containers
10 *isolate* 'options' *--init*
12 *isolate* 'options' *--run* +--+ 'program' 'arguments'
14 *isolate* 'options' *--cleanup*
18 Run 'program' within a sandbox, so that it cannot communicate with the
19 outside world and its resource consumption is limited. This can be used
20 for example in a programming contest to run untrusted programs submitted
21 by contestants in a controlled environment.
23 The sandbox is used in the following way:
25 * Run *isolate --init*, which initializes the sandbox, creates its working directory and
26 prints its name to the standard output.
28 * Populate the directory with the executable file of the program and its
31 * Call *isolate --run* to run the program. A single line describing the
32 status of the program is written to the standard error stream.
34 * Fetch the output of the program from the directory.
36 * Run *isolate --cleanup* to remove temporary files.
38 Please note that by default, the program is not allowed to start multiple
39 processes of threads. If you need that, turn on the control group mode
45 Output meta-data on the execution of the program to a given file.
46 See below for syntax of the meta-files.
49 Limit address space of the program to 'size' kilobytes. If more processes
50 are allowed, this applies to each of them separately.
53 Limit run time of the program to 'time' seconds. Fractional numbers are allowed.
54 Time in which the OS assigns the processor to different tasks is not counted.
56 *-w, --wall-time=*'time'::
57 Limit wall-clock time to 'time' seconds. Fractional values are allowed.
58 This clock measures the time from the start of the program to its exit,
59 so it does not stop when the program has lost the CPU or when it is waiting
60 for an external event. We recommend to use *--time* as the main limit,
61 but set *--wall-time* to a much higher value as a precaution against
64 *-x, --extra-time=*'time'::
65 When a time limit is exceeded, wait for extra 'time' seconds before
66 killing the program. This has the advantage that the real execution time
67 is reported, even though it slightly exceeds the limit. Fractional
68 numbers are again allowed.
71 When you run multiple sandboxes in parallel, you have to assign each unique
72 IDs to them by this option. See the discussion on UIDs in the INSTALLATION
73 section. The ID defaults to 0.
75 *-k, --stack=*'size'::
76 Limit process stack to 'size' kilobytes. By default, the whole address
77 space is available for the stack, but it is subject to the *--mem* limit.
79 *-q, --quota=*'blocks'*,*'inodes'::
80 Set disk quota to a given number of blocks and inodes. This requires the
81 filesystem to be mounted with support for quotas.
83 *-i, --stdin=*'file'::
84 Redirect standard input from 'file'. The 'file' has to be accessible
87 *-o, --stdout=*'file'::
88 Redirect standard output to 'file'. The 'file' has to be accessible
91 *-r, --stderr=*'file'::
92 Redirect standard error output to 'file'. The 'file' has to be accessible
95 *-p, --processes*[*=*'max']::
96 Permit the program to create up to 'max' processes and/or threads. Please
97 keep in mind that time and memory limit do not work with multiple processes
98 unless you enable the control group mode. If 'max' is not given, an arbitrary
99 number of processes can be run.
102 Tell the sandbox manager to be verbose and report on what is going on.
103 Using *-v* multiple times produces even more jabber.
107 UNIX processes normally inherit all environment variables from their parent. The
108 sandbox however passes only those variables which are explicitly requested by
112 Inherit the variable 'var' from the parent.
114 *-E, --env=*'var'*=*'value'::
115 Set the variable 'var' to 'value'. When the 'value' is empty, the
116 variable is removed from the environment.
119 Inherit all variables from the parent.
121 The rules are applied in the order in which they were given, except for
122 *--full-env*, which is applied first.
124 The list of rules is automatically initialized with *-ELIBC_FATAL_STDERR_=1*.
128 The sandboxed process gets its own filesystem namespace, which contains only subtrees
129 requested by directory rules:
131 *-d, --dir=*'in'*=*'out'[*:*'options']::
132 Bind the directory 'out' as seen by the caller to the path 'in' inside the sandbox.
133 If there already was a directory rule for 'out', it is replaced.
135 *-d, --dir=*'dir'[*:*'options']::
136 Bind the directory +/+'dir' to 'dir' inside the sandbox.
137 If there already was a directory rule for 'out', it is replaced.
139 *-d, --dir=*'in'*=*::
140 Remove a directory rule for the path 'in' inside the sandbox.
142 By default, all directories are bound read-only and restricted (no devices,
143 no setuid binaries). This behavior can be modified using the 'options':
146 Allow read-write access.
149 Allow access to character and block devices.
152 Disallow execution of binaries.
155 Silently ignore the rule if the directory to be bound does not exist.
158 Instead of binding a directory, mount a device-less filesystem called 'in'.
159 For example, this can be 'proc' or 'sysfs'.
161 The default set of directory rules binds +/bin+, +/dev+ (with devices allowed), +/lib+,
162 +/lib64+ (if it exists), and +/usr+. It also binds the working directory to +/box+ (read-write)
163 and mounts the proc filesystem at +/proc+.
167 Isolate can make use of system control groups provided by the kernel
168 to constrain programs consisting of multiple processes. Please note
169 that this feature needs special system setup described in the REQUIREMENTS
173 Enable use of control groups.
176 Limit total memory usage by the whole control group to 'size' kilobytes.
179 Use control groups for timing, so that the *--time* switch affects the
180 total run time of all processes and threads in the control group.
184 The meta-file contains miscellaneous meta-information on execution of the
185 program within the sandbox. It is a textual file consisting of lines
186 of format 'key'*:*'value'. The following keys are defined:
189 When control groups are enabled, this is the total memory use
190 by the whole control group (in kilobytes).
192 Number of context switches forced by the kernel.
194 Number of context switches caused by the process giving up the CPU
197 The program has exited normally with this exit code.
199 The program has exited after receiving this fatal signal.
201 Present when the program was terminated by the sandbox
202 (e.g., because it has exceeded the time limit).
204 Maximum resident set size of the process (in kilobytes).
206 Status message, not intended for machine processing.
207 E.g., "Time limit exceeded."
209 Two-letter status code:
210 * *RE* -- run-time error, i.e., exited with a non-zero exit code
211 * *SG* -- program died on a signal
213 * *XX* -- internal error of the sandbox
215 Run time of the program in fractional seconds.
217 Wall clock time of the program in fractional seconds.
221 When the program inside the sandbox finishes correctly, the sandbox returns 0.
222 If it finishes incorrectly, it returns 1.
223 All other return codes signal an internal error.
227 Isolate depends on several advanced features of the Linux kernel. Please
228 make sure that your kernel supports
229 PID namespaces (+CONFIG_PID_NS+),
230 IPC namespaces (+CONFIG_IPC_NS+), and
231 network namespaces (+CONFIG_NET_IS+).
232 If you want to use control groups, you need
233 the cpusets (+CONFIG_CPUSETS+),
234 CPU accounting controller (+CONFIG_CGROUP_CPUACCT+), and
235 memory resource controller (+CONFIG_CGROUP_MEM_RES_CTLR+).
237 Isolate is designed to run setuid to root. The sub-process inside the sandbox
238 then switches to a non-privileged user ID (different for each *--box-id*).
239 The range of UIDs available and several filesystem paths are embedded in the
240 isolate's binary during compilation; please see +default.cfg+ in the source
241 tree for description.
243 Before you run isolate with control groups, you have to mount the control group
244 filesystem by doing "+mount -t cgroup none -o cpuset,cpuacct,memory /sys/fs/cgroup+".
248 Isolate was written by Martin Mares and Bernard Blackham.
249 It can be distributed and used under the terms of the GNU
250 General Public License version 2.