Commit efd8e880 authored by Sharon Yang's avatar Sharon Yang Committed by Commit Bot

[fuchsia] Add video capture type to sandbox types

Add a minimally-privileged sandbox. This is used by the
VideoCaptureService under Fuchsia, but is equivalent to no sandbox on
other platforms.

Bug: 998310
Test: CQ
Change-Id: I418d05b96e7489ab2bb0db6f7c360db7390d7c72
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2161618Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarCharlie Reis <creis@chromium.org>
Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Commit-Queue: Sharon Yang <yangsharon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#763530}
parent 05b95648
...@@ -3597,6 +3597,7 @@ base::string16 ChromeContentBrowserClient::GetAppContainerSidForSandboxType( ...@@ -3597,6 +3597,7 @@ base::string16 ChromeContentBrowserClient::GetAppContainerSidForSandboxType(
case service_manager::SandboxType::kProxyResolver: case service_manager::SandboxType::kProxyResolver:
case service_manager::SandboxType::kPdfConversion: case service_manager::SandboxType::kPdfConversion:
case service_manager::SandboxType::kSharingService: case service_manager::SandboxType::kSharingService:
case service_manager::SandboxType::kVideoCapture:
// Should never reach here. // Should never reach here.
CHECK(0); CHECK(0);
return base::string16(); return base::string16();
......
...@@ -60,6 +60,8 @@ std::string GetSandboxTypeInEnglish(content::SandboxType sandbox_type) { ...@@ -60,6 +60,8 @@ std::string GetSandboxTypeInEnglish(content::SandboxType sandbox_type) {
return "PDF Conversion"; return "PDF Conversion";
case content::SandboxType::kSharingService: case content::SandboxType::kSharingService:
return "Sharing"; return "Sharing";
case content::SandboxType::kVideoCapture:
return "Video Capture";
} }
} }
......
...@@ -33,6 +33,8 @@ const char* ProcessNameFromSandboxType( ...@@ -33,6 +33,8 @@ const char* ProcessNameFromSandboxType(
return "gpu"; return "gpu";
case service_manager::SandboxType::kNetwork: case service_manager::SandboxType::kNetwork:
return "network"; return "network";
case service_manager::SandboxType::kVideoCapture:
return "video-capture";
default: default:
NOTREACHED() << "Unknown sandbox_type."; NOTREACHED() << "Unknown sandbox_type.";
return nullptr; return nullptr;
......
...@@ -244,6 +244,7 @@ void SetupSandboxParameters(service_manager::SandboxType sandbox_type, ...@@ -244,6 +244,7 @@ void SetupSandboxParameters(service_manager::SandboxType sandbox_type,
SetupUtilitySandboxParameters(client, command_line); SetupUtilitySandboxParameters(client, command_line);
break; break;
case service_manager::SandboxType::kNoSandbox: case service_manager::SandboxType::kNoSandbox:
case service_manager::SandboxType::kVideoCapture:
CHECK(false) << "Unhandled parameters for sandbox_type " CHECK(false) << "Unhandled parameters for sandbox_type "
<< static_cast<int>(sandbox_type); << static_cast<int>(sandbox_type);
} }
......
...@@ -88,6 +88,7 @@ class UtilitySandboxedProcessLauncherDelegate ...@@ -88,6 +88,7 @@ class UtilitySandboxedProcessLauncherDelegate
sandbox_type_ == service_manager::SandboxType::kCdm || sandbox_type_ == service_manager::SandboxType::kCdm ||
sandbox_type_ == service_manager::SandboxType::kPrintCompositor || sandbox_type_ == service_manager::SandboxType::kPrintCompositor ||
sandbox_type_ == service_manager::SandboxType::kPpapi || sandbox_type_ == service_manager::SandboxType::kPpapi ||
sandbox_type_ == service_manager::SandboxType::kVideoCapture ||
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
sandbox_type_ == service_manager::SandboxType::kIme || sandbox_type_ == service_manager::SandboxType::kIme ||
#endif // OS_CHROMEOS #endif // OS_CHROMEOS
......
...@@ -95,10 +95,13 @@ class UtilityProcessSandboxBrowserTest ...@@ -95,10 +95,13 @@ class UtilityProcessSandboxBrowserTest
void OnGotSandboxStatusOnIOThread(int32_t sandbox_status) { void OnGotSandboxStatusOnIOThread(int32_t sandbox_status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
// Aside from kNoSandox, every utility process launched explicitly with a // Aside from kNoSandbox, every utility process launched explicitly with a
// sandbox type should always end up with a sandbox. // sandbox type should always end up with a sandbox.
// kVideoCapture is equivalent to kNoSandbox on all platforms except
// Fuchsia.
switch (GetParam()) { switch (GetParam()) {
case SandboxType::kNoSandbox: case SandboxType::kNoSandbox:
case SandboxType::kVideoCapture:
EXPECT_EQ(sandbox_status, 0); EXPECT_EQ(sandbox_status, 0);
break; break;
......
...@@ -112,7 +112,7 @@ video_capture::mojom::VideoCaptureService& GetVideoCaptureService() { ...@@ -112,7 +112,7 @@ video_capture::mojom::VideoCaptureService& GetVideoCaptureService() {
std::move(receiver), std::move(receiver),
ServiceProcessHost::Options() ServiceProcessHost::Options()
.WithDisplayName("Video Capture") .WithDisplayName("Video Capture")
.WithSandboxType(service_manager::SandboxType::kNoSandbox) .WithSandboxType(service_manager::SandboxType::kVideoCapture)
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
// On Mac, the service requires a CFRunLoop which is provided by a // On Mac, the service requires a CFRunLoop which is provided by a
// UI message loop. See https://crbug.com/834581. // UI message loop. See https://crbug.com/834581.
......
...@@ -118,6 +118,7 @@ component("sandbox") { ...@@ -118,6 +118,7 @@ component("sandbox") {
] ]
deps += [ deps += [
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.camera3",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.fonts", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.fonts",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.intl", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.intl",
"//third_party/fuchsia-sdk/sdk/fidl/fuchsia.logger", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.logger",
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <zircon/processargs.h> #include <zircon/processargs.h>
#include <zircon/syscalls/policy.h> #include <zircon/syscalls/policy.h>
#include <fuchsia/camera3/cpp/fidl.h>
#include <fuchsia/fonts/cpp/fidl.h> #include <fuchsia/fonts/cpp/fidl.h>
#include <fuchsia/intl/cpp/fidl.h> #include <fuchsia/intl/cpp/fidl.h>
#include <fuchsia/logger/cpp/fidl.h> #include <fuchsia/logger/cpp/fidl.h>
...@@ -103,6 +104,13 @@ constexpr SandboxConfig kRendererConfig = { ...@@ -103,6 +104,13 @@ constexpr SandboxConfig kRendererConfig = {
kAmbientMarkVmoAsExecutable, kAmbientMarkVmoAsExecutable,
}; };
constexpr SandboxConfig kVideoCaptureConfig = {
base::make_span((const char* const[]){
fuchsia::camera3::DeviceWatcher::Name_,
}),
0,
};
// No-access-to-anything. // No-access-to-anything.
constexpr SandboxConfig kEmptySandboxConfig = { constexpr SandboxConfig kEmptySandboxConfig = {
base::span<const char* const>(), base::span<const char* const>(),
...@@ -121,6 +129,8 @@ const SandboxConfig* GetConfigForSandboxType(SandboxType type) { ...@@ -121,6 +129,8 @@ const SandboxConfig* GetConfigForSandboxType(SandboxType type) {
return &kRendererConfig; return &kRendererConfig;
case SandboxType::kWebContext: case SandboxType::kWebContext:
return &kWebContextConfig; return &kWebContextConfig;
case SandboxType::kVideoCapture:
return &kVideoCaptureConfig;
// Remaining types receive no-access-to-anything. // Remaining types receive no-access-to-anything.
case SandboxType::kAudio: case SandboxType::kAudio:
case SandboxType::kCdm: case SandboxType::kCdm:
......
...@@ -188,6 +188,7 @@ std::unique_ptr<BPFBasePolicy> SandboxSeccompBPF::PolicyForSandboxType( ...@@ -188,6 +188,7 @@ std::unique_ptr<BPFBasePolicy> SandboxSeccompBPF::PolicyForSandboxType(
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
case SandboxType::kZygoteIntermediateSandbox: case SandboxType::kZygoteIntermediateSandbox:
case SandboxType::kNoSandbox: case SandboxType::kNoSandbox:
case SandboxType::kVideoCapture:
NOTREACHED(); NOTREACHED();
return nullptr; return nullptr;
} }
...@@ -234,6 +235,7 @@ void SandboxSeccompBPF::RunSandboxSanityChecks( ...@@ -234,6 +235,7 @@ void SandboxSeccompBPF::RunSandboxSanityChecks(
case SandboxType::kNetwork: case SandboxType::kNetwork:
case SandboxType::kUtility: case SandboxType::kUtility:
case SandboxType::kNoSandbox: case SandboxType::kNoSandbox:
case SandboxType::kVideoCapture:
case SandboxType::kZygoteIntermediateSandbox: case SandboxType::kZygoteIntermediateSandbox:
// Otherwise, no checks required. // Otherwise, no checks required.
break; break;
......
...@@ -261,6 +261,7 @@ std::string SandboxMac::GetSandboxProfile(SandboxType sandbox_type) { ...@@ -261,6 +261,7 @@ std::string SandboxMac::GetSandboxProfile(SandboxType sandbox_type) {
profile += service_manager::kSeatbeltPolicyString_renderer; profile += service_manager::kSeatbeltPolicyString_renderer;
break; break;
case service_manager::SandboxType::kNoSandbox: case service_manager::SandboxType::kNoSandbox:
case service_manager::SandboxType::kVideoCapture:
case service_manager::SandboxType::kSpeechRecognition: case service_manager::SandboxType::kSpeechRecognition:
CHECK(false); CHECK(false);
break; break;
......
...@@ -30,6 +30,12 @@ bool IsUnsandboxedSandboxType(SandboxType sandbox_type) { ...@@ -30,6 +30,12 @@ bool IsUnsandboxedSandboxType(SandboxType sandbox_type) {
#endif #endif
case SandboxType::kAudio: case SandboxType::kAudio:
return !IsAudioSandboxEnabled(); return !IsAudioSandboxEnabled();
case SandboxType::kVideoCapture:
#if defined(OS_FUCHSIA)
return false;
#else
return true;
#endif
case SandboxType::kNetwork: case SandboxType::kNetwork:
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
return false; return false;
...@@ -105,6 +111,7 @@ void SetCommandLineFlagsForSandboxType(base::CommandLine* command_line, ...@@ -105,6 +111,7 @@ void SetCommandLineFlagsForSandboxType(base::CommandLine* command_line,
case SandboxType::kCdm: case SandboxType::kCdm:
case SandboxType::kPrintCompositor: case SandboxType::kPrintCompositor:
case SandboxType::kAudio: case SandboxType::kAudio:
case SandboxType::kVideoCapture:
#if defined(OS_WIN) #if defined(OS_WIN)
case SandboxType::kXrCompositing: case SandboxType::kXrCompositing:
case SandboxType::kProxyResolver: case SandboxType::kProxyResolver:
...@@ -215,6 +222,8 @@ std::string StringFromUtilitySandboxType(SandboxType sandbox_type) { ...@@ -215,6 +222,8 @@ std::string StringFromUtilitySandboxType(SandboxType sandbox_type) {
return switches::kUtilitySandbox; return switches::kUtilitySandbox;
case SandboxType::kAudio: case SandboxType::kAudio:
return switches::kAudioSandbox; return switches::kAudioSandbox;
case SandboxType::kVideoCapture:
return switches::kVideoCaptureSandbox;
#if !defined(OS_MACOSX) #if !defined(OS_MACOSX)
case SandboxType::kSharingService: case SandboxType::kSharingService:
return switches::kSharingServiceSandbox; return switches::kSharingServiceSandbox;
...@@ -283,6 +292,8 @@ SandboxType UtilitySandboxTypeFromString(const std::string& sandbox_string) { ...@@ -283,6 +292,8 @@ SandboxType UtilitySandboxTypeFromString(const std::string& sandbox_string) {
return SandboxType::kAudio; return SandboxType::kAudio;
if (sandbox_string == switches::kSpeechRecognitionSandbox) if (sandbox_string == switches::kSpeechRecognitionSandbox)
return SandboxType::kSpeechRecognition; return SandboxType::kSpeechRecognition;
if (sandbox_string == switches::kVideoCaptureSandbox)
return SandboxType::kVideoCapture;
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
if (sandbox_string == switches::kImeSandbox) if (sandbox_string == switches::kImeSandbox)
return SandboxType::kIme; return SandboxType::kIme;
......
...@@ -84,7 +84,11 @@ enum class SandboxType { ...@@ -84,7 +84,11 @@ enum class SandboxType {
// The speech recognition service process. // The speech recognition service process.
kSpeechRecognition, kSpeechRecognition,
kMaxValue = kSpeechRecognition // Equivalent to no sandbox on all non-Fuchsia platforms.
// Minimally privileged sandbox on Fuchsia.
kVideoCapture,
kMaxValue = kVideoCapture
}; };
SERVICE_MANAGER_SANDBOX_EXPORT bool IsUnsandboxedSandboxType( SERVICE_MANAGER_SANDBOX_EXPORT bool IsUnsandboxedSandboxType(
......
...@@ -30,6 +30,7 @@ const char kPrintCompositorSandbox[] = "print_compositor"; ...@@ -30,6 +30,7 @@ const char kPrintCompositorSandbox[] = "print_compositor";
const char kAudioSandbox[] = "audio"; const char kAudioSandbox[] = "audio";
const char kSharingServiceSandbox[] = "sharing_service"; const char kSharingServiceSandbox[] = "sharing_service";
const char kSpeechRecognitionSandbox[] = "speech_recognition"; const char kSpeechRecognitionSandbox[] = "speech_recognition";
const char kVideoCaptureSandbox[] = "video_capture";
#if defined(OS_WIN) #if defined(OS_WIN)
const char kPdfConversionSandbox[] = "pdf_conversion"; const char kPdfConversionSandbox[] = "pdf_conversion";
......
...@@ -29,6 +29,7 @@ SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPrintCompositorSandbox[]; ...@@ -29,6 +29,7 @@ SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPrintCompositorSandbox[];
SERVICE_MANAGER_SANDBOX_EXPORT extern const char kAudioSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kAudioSandbox[];
SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSharingServiceSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSharingServiceSandbox[];
SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSpeechRecognitionSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSpeechRecognitionSandbox[];
SERVICE_MANAGER_SANDBOX_EXPORT extern const char kVideoCaptureSandbox[];
#if defined(OS_WIN) #if defined(OS_WIN)
SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPdfConversionSandbox[]; SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPdfConversionSandbox[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment