// Copyright 2021 the V8 project 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 V8_SANDBOX_SANDBOX_H_ #define V8_SANDBOX_SANDBOX_H_ #include "include/v8-internal.h" #include "include/v8-platform.h" #include "include/v8config.h" #include "src/base/bounds.h" #include "src/common/globals.h" #include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck namespace v8 { namespace internal { #ifdef V8_ENABLE_SANDBOX /** * The V8 Sandbox. * * When enabled, V8 reserves a large region of virtual address space - the * sandbox - and places most of its objects inside of it. It is then assumed * that an attacker can, by exploiting a vulnerability in V8, corrupt memory * inside the sandbox arbitrarily and from different threads. The sandbox * attempts to stop an attacker from corrupting other memory in the process. * * The sandbox relies on a number of different mechanisms to achieve its goal. * For example, objects inside the sandbox can reference each other through * offsets from the start of the sandbox ("sandboxed pointers") instead of raw * pointers, and external objects can be referenced through indices into a * per-Isolate table of external pointers ("sandboxed external pointers"). * * The pointer compression region, which contains most V8 objects, and inside * of which compressed (32-bit) pointers are used, is located at the start of * the sandbox. The remainder of the sandbox is mostly used for memory * buffers, in particular ArrayBuffer backing stores and WASM memory cages. * * As the embedder is responsible for providing ArrayBuffer allocators, V8 * exposes the virtual address space backing the sandbox to the embedder. */ class V8_EXPORT_PRIVATE Sandbox { … }; V8_EXPORT_PRIVATE Sandbox* GetProcessWideSandbox(); #endif // V8_ENABLE_SANDBOX // Helper function that can be used to ensure that certain objects are not // located inside the sandbox. Typically used for trusted objects. // Will always return false when the sandbox is disabled or partially reserved. V8_INLINE bool InsideSandbox(uintptr_t address) { … } V8_INLINE void* EmptyBackingStoreBuffer() { … } } // namespace internal } // namespace v8 #endif // V8_SANDBOX_SANDBOX_H_