blob: 93a0940c924302e3362987493df8b64067b3c503 [file] [log] [blame]
// Copyright 2018 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 "chrome/chrome_cleaner/ipc/mojo_sandbox_hooks.h"
#include <string>
#include <utility>
#include "base/logging.h"
#include "base/rand_util.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/chrome_cleaner/constants/chrome_cleaner_switches.h"
namespace chrome_cleaner {
MojoSandboxSetupHooks::MojoSandboxSetupHooks() = default;
MojoSandboxSetupHooks::~MojoSandboxSetupHooks() = default;
mojo::ScopedMessagePipeHandle MojoSandboxSetupHooks::SetupSandboxMessagePipe(
sandbox::TargetPolicy* policy,
base::CommandLine* command_line) {
DCHECK(policy);
DCHECK(command_line);
std::string pipe_token = base::NumberToString(base::RandUint64());
mojo::ScopedMessagePipeHandle mojo_pipe =
outgoing_invitation_.AttachMessagePipe(pipe_token);
command_line->AppendSwitchASCII(kSandboxMojoPipeTokenSwitch, pipe_token);
base::HandlesToInheritVector handles_to_inherit;
mojo_channel_.PrepareToPassRemoteEndpoint(&handles_to_inherit, command_line);
for (HANDLE handle : handles_to_inherit)
policy->AddHandleToShare(handle);
message_pipe_was_created_ = true;
return mojo_pipe;
}
ResultCode MojoSandboxSetupHooks::TargetSpawned(
const base::Process& target_process,
const base::win::ScopedHandle& target_thread) {
DCHECK(message_pipe_was_created_);
// TODO(joenotcharles): Hook up the |error_callback| parameter of Send to a
// function that logs a security warning and exits. This callback will be
// called when an invalid message is written to the pipe.
mojo::OutgoingInvitation::Send(std::move(outgoing_invitation_),
target_process.Handle(),
mojo_channel_.TakeLocalEndpoint());
return RESULT_CODE_SUCCESS;
}
MojoSandboxTargetHooks::MojoSandboxTargetHooks() = default;
MojoSandboxTargetHooks::~MojoSandboxTargetHooks() = default;
mojo::ScopedMessagePipeHandle MojoSandboxTargetHooks::ExtractSandboxMessagePipe(
const base::CommandLine& command_line) {
auto channel_endpoint =
mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(command_line);
auto incoming_invitation =
mojo::IncomingInvitation::Accept(std::move(channel_endpoint));
return incoming_invitation.ExtractMessagePipe(
command_line.GetSwitchValueASCII(kSandboxMojoPipeTokenSwitch));
}
} // namespace chrome_cleaner