Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1425)

Unified Diff: components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc

Issue 919203002: Linux Sandbox: add resource limits to NaCl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Correct typo. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 44cb4f57b8d2153ab4157bbe7a4f861527588a8a..dfe177c8a0e02d89af96a4c2baf83f71287a30cd 100644
--- a/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc
+++ b/components/nacl/loader/sandbox_linux/nacl_sandbox_linux.cc
@@ -11,6 +11,8 @@
#include <sys/types.h>
#include <unistd.h>
+#include <limits>
+
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/command_line.h"
@@ -28,6 +30,7 @@
#include "sandbox/linux/services/credentials.h"
#include "sandbox/linux/services/namespace_sandbox.h"
#include "sandbox/linux/services/proc_util.h"
+#include "sandbox/linux/services/resource_limits.h"
#include "sandbox/linux/services/thread_helpers.h"
#include "sandbox/linux/suid/client/setuid_sandbox_client.h"
@@ -69,6 +72,37 @@ bool MaybeSetProcessNonDumpable() {
return prctl(PR_GET_DUMPABLE) == 0;
}
+void RestrictAddressSpaceUsage() {
+#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \
+ defined(THREAD_SANITIZER)
+ // Sanitizers need to reserve huge chunks of the address space.
+ return;
+#endif
+
+ // Add a limit to the brk() heap that would prevent allocations that can't be
+ // indexed by an int. This helps working around typical security bugs.
+ // This could almost certainly be set to zero. GLibc's allocator and others
+ // would fall-back to mmap if brk() fails.
+ const rlim_t kNewDataSegmentMaxSize = std::numeric_limits<int>::max();
+ CHECK(sandbox::ResourceLimits::Lower(RLIMIT_DATA, kNewDataSegmentMaxSize));
+
+#if defined(ARCH_CPU_64_BITS)
+ // NaCl's x86-64 sandbox allocated 88GB address of space during startup:
+ // - The main sandbox is 4GB
+ // - There are two guard regions of 40GB each.
+ // - 4GB are allocated extra to have a 4GB-aligned address.
+ // See https://crbug.com/455839
+ //
+ // Set the limit to 128 GB and have some margin.
+ const rlim_t kNewAddressSpaceLimit = 1UL << 37;
+#else
+ // Some architectures such as X86 allow 32 bits processes to switch to 64
+ // bits when running under 64 bits kernels. Set a limit in case this happens.
+ const rlim_t kNewAddressSpaceLimit = std::numeric_limits<uint32_t>::max();
+#endif
+ CHECK(sandbox::ResourceLimits::Lower(RLIMIT_AS, kNewAddressSpaceLimit));
+}
+
} // namespace
NaClSandbox::NaClSandbox()
@@ -153,6 +187,8 @@ void NaClSandbox::InitializeLayerTwoSandbox(bool uses_nonsfi_mode) {
CHECK(IsSingleThreaded());
CheckForExpectedNumberOfOpenFds();
+ RestrictAddressSpaceUsage();
+
base::ScopedFD proc_self_task(GetProcSelfTask(proc_fd_.get()));
if (uses_nonsfi_mode) {
« no previous file with comments | « components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h ('k') | content/common/sandbox_linux/sandbox_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698