Index: components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
diff --git a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
index 869658f9f8b4eddec6efdd545b89c966626b0440..4ff1d4c076dcf71f5f7df6013fcc1c9452407843 100644 |
--- a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
+++ b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc |
@@ -139,10 +139,14 @@ void NaClSandbox::InitializeLayerOneSandbox() { |
layer_one_enabled_ = true; |
} else if (sandbox::NamespaceSandbox::InNewUserNamespace()) { |
CHECK(sandbox::Credentials::MoveToNewUserNS()); |
- // This relies on SealLayerOneSandbox() to be called later since this |
- // class is keeping a file descriptor to /proc/. |
CHECK(sandbox::Credentials::DropFileSystemAccess(proc_fd_.get())); |
- CHECK(sandbox::Credentials::DropAllCapabilities(proc_fd_.get())); |
+ |
+ // We do not drop CAP_SYS_ADMIN because we need it to place each child |
+ // process in its own PID namespace later on. |
+ std::vector<sandbox::Credentials::Capability> caps; |
+ caps.push_back(sandbox::Credentials::Capability::SYS_ADMIN); |
+ CHECK(sandbox::Credentials::SetCapabilities(proc_fd_.get(), caps)); |
+ |
CHECK(IsSandboxed()); |
layer_one_enabled_ = true; |
} |