| Index: components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h
|
| diff --git a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ab6262563870f67eeddb81bd7892d331876e080c
|
| --- /dev/null
|
| +++ b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h
|
| @@ -0,0 +1,76 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef COMPONENTS_NACL_LOADER_SANDBOX_LINUX_NACL_SANDBOX_LINUX_H_
|
| +#define COMPONENTS_NACL_LOADER_SANDBOX_LINUX_NACL_SANDBOX_LINUX_H_
|
| +
|
| +#include "base/files/scoped_file.h"
|
| +#include "base/macros.h"
|
| +
|
| +namespace nacl {
|
| +
|
| +// NaClSandbox supports two independent layers of sandboxing.
|
| +// layer-1 uses a chroot. It requires both InitializeLayerOneSandbox() and
|
| +// SealLayerOneSandbox() to have been called to be enforcing.
|
| +// layer-2 uses seccomp-bpf. It requires the layer-1 sandbox to not yet be
|
| +// sealed when being engaged.
|
| +// For the layer-1 sandbox to work, the current process must be a child of
|
| +// the setuid sandbox. InitializeLayerOneSandbox() can only be called once
|
| +// per instance of the setuid sandbox.
|
| +//
|
| +// A typical use case of this class would be:
|
| +// 1. Load libraries and do some pre-initialization
|
| +// 2. InitializeLayerOneSandbox();
|
| +// 3. Do some more initializations (it is ok to fork() here).
|
| +// 4. CHECK(!HasOpenDirectory));
|
| +// (This check is not strictly necessary, as the only possibility for a
|
| +// new directory descriptor to exist after (2) has been called is via IPC)).
|
| +// 5. InitializeLayerTwoSandbox();
|
| +// 6. SealLayerOneSandbox();
|
| +// 7. CheckSandboxingStateWithPolicy();
|
| +class NaClSandbox {
|
| + public:
|
| + NaClSandbox();
|
| + ~NaClSandbox();
|
| +
|
| + // This API will only work if the layer-1 sandbox is not sealed and the
|
| + // layer-2 sandbox is not engaged.
|
| + bool IsSingleThreaded();
|
| + // Check whether the current process owns any directory file descriptors. This
|
| + // will ignore any directory file descriptor owned by this object (i.e. those
|
| + // that will be closed after SealLayerOneSandbox()) is called.
|
| + // This API will only work if the layer-1 sandbox is not sealed and the
|
| + // layer-2 sandbox is not engaged.
|
| + bool HasOpenDirectory();
|
| + // Will attempt to initialize the layer-1 sandbox, depending on flags and the
|
| + // environment. It can only succeed if the current process is a child of the
|
| + // setuid sandbox.
|
| + void InitializeLayerOneSandbox();
|
| + // Will attempt to initialize the layer-2 sandbox, depending on flags and the
|
| + // environment. |uses_nonsfi_mode| describes which seccomp-bpf policy is
|
| + // appropriate.
|
| + void InitializeLayerTwoSandbox(bool uses_nonsfi_mode);
|
| + // Seal the layer-1 sandbox, making it enforcing.
|
| + void SealLayerOneSandbox();
|
| + // Check that the current sandboxing state matches the level of sandboxing
|
| + // expected for NaCl in the current configuration. Crash if it does not.
|
| + void CheckSandboxingStateWithPolicy();
|
| +
|
| + bool layer_one_enabled() { return layer_one_enabled_; }
|
| + bool layer_two_enabled() { return layer_two_enabled_; }
|
| +
|
| + private:
|
| + bool layer_one_enabled_;
|
| + bool layer_one_sealed_;
|
| + bool layer_two_enabled_;
|
| + bool layer_two_is_nonsfi_;
|
| + // |proc_fd_| must be released before the layer-1 sandbox is considered
|
| + // enforcing.
|
| + base::ScopedFD proc_fd_;
|
| + DISALLOW_COPY_AND_ASSIGN(NaClSandbox);
|
| +};
|
| +
|
| +} // namespace nacl
|
| +
|
| +#endif // COMPONENTS_NACL_LOADER_SANDBOX_LINUX_NACL_SANDBOX_LINUX_H_
|
|
|