OLD | NEW |
(Empty) | |
| 1 With [r20110](http://src.chromium.org/viewvc/chrome?view=rev&revision=20110), Ch
romium on Linux can now sandbox its renderers using a SUID helper binary. This i
s one of [our layer-1 sandboxing solutions](LinuxSandboxing.md). |
| 2 |
| 3 ## SUID helper executable |
| 4 |
| 5 The SUID helper binary is called 'chrome\_sandbox' and you must build it separat
ely from the main 'chrome' target. To use this sandbox, you have to specify its
path in the `linux_sandbox_path` GYP variable. When spawning the zygote process
(LinuxZygote), if the suid sandbox is enabled, Chromium will check for the sandb
ox binary at the location specified by `linux_sandbox_path`. For Google Chrome,
this is set to <tt>/opt/google/chrome/chrome-sandbox</tt>, and early version had
this value hard coded in <tt>chrome/browser/zygote_host_linux.cc</tt>. |
| 6 |
| 7 |
| 8 In order for the sandbox to be used, the following conditions must be met: |
| 9 * The sandbox binary must be executable by the Chromium process. |
| 10 * It must be SUID and executable by other. |
| 11 |
| 12 If these conditions are met then the sandbox binary is used to launch the zygote
process. Once the zygote has started, it asks a helper process to chroot it to
a temp directory. |
| 13 |
| 14 ## CLONE\_NEWPID method |
| 15 |
| 16 The sandbox does three things to restrict the authority of a sandboxed process.
The SUID helper is responsible for the first two: |
| 17 * The SUID helper chroots the process. This takes away access to the filesyst
em namespace. |
| 18 * The SUID helper puts the process in a PID namespace using the CLONE\_NEWPID
option to [clone()](http://www.kernel.org/doc/man-pages/online/pages/man2/clone.
2.html). This stops the sandboxed process from being able to ptrace() or kill()
unsandboxed processes. |
| 19 |
| 20 In addition: |
| 21 * The LinuxZygote startup code sets the process to be _undumpable_ using [prct
l()](http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html). This
stops sandboxed processes from being able to ptrace() each other. More specific
ally, it stops the sandboxed process from being ptrace()'d by any other process.
This can be switched off with the `--allow-sandbox-debugging` option. |
| 22 |
| 23 Limitations: |
| 24 * Not all kernel versions support CLONE\_NEWPID. If the SUID helper is run on
a kernel that does not support CLONE\_NEWPID, it will ignore the problem withou
t a warning, but the protection offered by the sandbox will be substantially red
uced. See LinuxPidNamespaceSupport for how to test whether your system supports
PID namespaces. |
| 25 * This does not restrict network access. |
| 26 * This does not prevent processes within a given sandbox from sending each oth
er signals or killing each other. |
| 27 * Setting a process to be undumpable is not irreversible. A sandboxed proces
s can make itself dumpable again, opening itself up to being taken over by anoth
er process (either unsandboxed or within the same sandbox). |
| 28 * Breakpad (the crash reporting tool) makes use of this. If a process crash
es, Breakpad makes it dumpable in order to use ptrace() to halt threads and capt
ure the process's state at the time of the crash. This opens a small window of
vulnerability. |
| 29 |
| 30 ## setuid() method |
| 31 |
| 32 _This is an alternative to the CLONE\_NEWPID method; it is not currently impleme
nted in the Chromium codebase._ |
| 33 |
| 34 Instead of using CLONE\_NEWPID, the SUID helper can use setuid() to put the proc
ess into a currently-unused UID, which is allocated out of a range of UIDs. In
order to ensure that the UID has not been allocated for another sandbox, the SUI
D helper uses [getrlimit()](http://www.kernel.org/doc/man-pages/online/pages/man
2/getrlimit.2.html) to set RLIMIT\_NPROC temporarily to a soft limit of 1. (Not
e that the docs specify that [setuid()](http://www.kernel.org/doc/man-pages/onli
ne/pages/man2/setuid.2.html) returns EAGAIN if RLIMIT\_NPROC is exceeded.) We c
an reset RLIMIT\_NPROC afterwards in order to allow the sandboxed process to for
k child processes. |
| 35 |
| 36 As before, the SUID helper chroots the process. |
| 37 |
| 38 As before, LinuxZygote can set itself to be undumpable to stop processes in the
sandbox from being able to ptrace() each other. |
| 39 |
| 40 Limitations: |
| 41 * It is not possible for an unsandboxed process to ptrace() a sandboxed proces
s because they run under different UIDs. This makes debugging harder. There is
no equivalent of the `--allow-sandbox-debugging` other than turning the sandbox
off with `--no-sandbox`. |
| 42 * The SUID helper can check that a UID is unused before it uses it (hence this
is safe if the SUID helper is installed into multiple chroots), but it cannot p
revent other root processes from putting processes into this UID after the sandb
ox has been started. This means we should make the UID range configurable, or d
istributions should reserve a UID range. |
| 43 |
| 44 ## CLONE\_NEWNET method |
| 45 |
| 46 The SUID helper uses [CLONE\_NEWNET](http://www.kernel.org/doc/man-pages/online/
pages/man2/clone.2.html) to restrict network access. |
| 47 |
| 48 ## Future work |
| 49 |
| 50 We are splitting the SUID sandbox into a separate project which will support bot
h the CLONE\_NEWNS and setuid() methods: http://code.google.com/p/setuid-sandbox
/ |
| 51 |
| 52 Having the SUID helper as a separate project should make it easier for distribut
ions to review and package. |
| 53 |
| 54 ## Possible extensions |
| 55 |
| 56 ## History |
| 57 |
| 58 Older versions of the sandbox helper process will <i>only</i> run <tt>/opt/googl
e/chrome/chrome</tt>. This string is hard coded (<tt>sandbox/linux/suid/sandbox.
cc</tt>). If your package is going to place the Chromium binary somewhere else y
ou need to modify this string. |
| 59 |
| 60 ## See also |
| 61 * [LinuxSUIDSandboxDevelopment](LinuxSUIDSandboxDevelopment.md) |
| 62 * LinuxSandboxing |
| 63 * General information on Chromium sandboxing: http://dev.chromium.org/develope
rs/design-documents/sandbox |
OLD | NEW |