blob: 209bd3ff1e31fe273f4638e904996207fc3d8ac3 [file] [log] [blame]
// Copyright 2020 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.
#include "content/browser/utility_sandbox_delegate.h"
#include "base/check.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "content/public/common/sandboxed_process_launcher_delegate.h"
#include "content/public/common/zygote/zygote_buildflags.h"
#include "sandbox/policy/sandbox_type.h"
#if BUILDFLAG(USE_ZYGOTE_HANDLE)
#include "content/common/zygote/zygote_handle_impl_linux.h"
#endif
namespace content {
UtilitySandboxedProcessLauncherDelegate::
UtilitySandboxedProcessLauncherDelegate(
sandbox::policy::SandboxType sandbox_type,
const base::EnvironmentMap& env,
const base::CommandLine& cmd_line)
:
#if defined(OS_POSIX)
env_(env),
#endif
sandbox_type_(sandbox_type),
cmd_line_(cmd_line) {
#if DCHECK_IS_ON()
bool supported_sandbox_type =
sandbox_type_ == sandbox::policy::SandboxType::kNoSandbox ||
#if defined(OS_WIN)
sandbox_type_ ==
sandbox::policy::SandboxType::kNoSandboxAndElevatedPrivileges ||
sandbox_type_ == sandbox::policy::SandboxType::kXrCompositing ||
sandbox_type_ == sandbox::policy::SandboxType::kProxyResolver ||
sandbox_type_ == sandbox::policy::SandboxType::kPdfConversion ||
sandbox_type_ == sandbox::policy::SandboxType::kIconReader ||
sandbox_type_ == sandbox::policy::SandboxType::kMediaFoundationCdm ||
#endif
sandbox_type_ == sandbox::policy::SandboxType::kUtility ||
sandbox_type_ == sandbox::policy::SandboxType::kNetwork ||
sandbox_type_ == sandbox::policy::SandboxType::kCdm ||
sandbox_type_ == sandbox::policy::SandboxType::kPrintCompositor ||
sandbox_type_ == sandbox::policy::SandboxType::kPpapi ||
sandbox_type_ == sandbox::policy::SandboxType::kVideoCapture ||
#if BUILDFLAG(IS_CHROMEOS_ASH)
sandbox_type_ == sandbox::policy::SandboxType::kIme ||
sandbox_type_ == sandbox::policy::SandboxType::kTts ||
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
sandbox_type_ == sandbox::policy::SandboxType::kAudio ||
#if !defined(OS_MAC)
sandbox_type_ == sandbox::policy::SandboxType::kSharingService ||
#endif
sandbox_type_ == sandbox::policy::SandboxType::kSpeechRecognition;
DCHECK(supported_sandbox_type);
#endif // DCHECK_IS_ON()
}
UtilitySandboxedProcessLauncherDelegate::
~UtilitySandboxedProcessLauncherDelegate() {}
sandbox::policy::SandboxType
UtilitySandboxedProcessLauncherDelegate::GetSandboxType() {
return sandbox_type_;
}
#if defined(OS_POSIX)
base::EnvironmentMap UtilitySandboxedProcessLauncherDelegate::GetEnvironment() {
return env_;
}
#endif // OS_POSIX
#if defined(OS_MAC) && defined(ARCH_CPU_ARM64)
bool UtilitySandboxedProcessLauncherDelegate::LaunchX86_64() {
return launch_x86_64_;
}
#endif // OS_MAC && ARCH_CPU_ARM64
#if BUILDFLAG(USE_ZYGOTE_HANDLE)
ZygoteHandle UtilitySandboxedProcessLauncherDelegate::GetZygote() {
// If the sandbox has been disabled for a given type, don't use a zygote.
if (sandbox::policy::IsUnsandboxedSandboxType(sandbox_type_))
return nullptr;
// Utility processes which need specialized sandboxes fork from the
// unsandboxed zygote and then apply their actual sandboxes in the forked
// process upon startup.
if (sandbox_type_ == sandbox::policy::SandboxType::kNetwork ||
#if BUILDFLAG(IS_CHROMEOS_ASH)
sandbox_type_ == sandbox::policy::SandboxType::kIme ||
sandbox_type_ == sandbox::policy::SandboxType::kTts ||
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
sandbox_type_ == sandbox::policy::SandboxType::kAudio ||
sandbox_type_ == sandbox::policy::SandboxType::kSpeechRecognition) {
return GetUnsandboxedZygote();
}
// All other types use the pre-sandboxed zygote.
return GetGenericZygote();
}
#endif // BUILDFLAG(USE_ZYGOTE_HANDLE)
} // namespace content