Bug 1123245 Part 3: Add prefs for the Windows NPAPI process sandbox. r=bsmedberg

This commit is contained in:
Bob Owen 2015-01-23 08:32:21 +00:00
parent b9c17ba63a
commit 0ab45dda9a
6 changed files with 40 additions and 4 deletions

View File

@ -1182,6 +1182,12 @@ pref("browser.tabs.remote.desktopbehavior", true);
// This will require a restart. // This will require a restart.
pref("security.sandbox.windows.log", false); pref("security.sandbox.windows.log", false);
// Controls whether the Windows NPAPI plugin process is sandboxed by default.
// To get a different setting for a particular plugin replace "default", with
// the plugin's nice file name, see: nsPluginTag::GetNiceFileName.
pref("dom.ipc.plugins.sandbox.default", false);
pref("dom.ipc.plugins.sandbox.flash", false);
#if defined(MOZ_CONTENT_SANDBOX) #if defined(MOZ_CONTENT_SANDBOX)
// This controls whether the Windows content process sandbox is using a more // This controls whether the Windows content process sandbox is using a more
// strict sandboxing policy. This will require a restart. // strict sandboxing policy. This will require a restart.

View File

@ -391,11 +391,21 @@ PluginModuleChromeParent::LoadModule(const char* aFilePath, uint32_t aPluginId,
{ {
PLUGIN_LOG_DEBUG_FUNCTION; PLUGIN_LOG_DEBUG_FUNCTION;
bool enableSandbox = false;
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
nsAutoCString sandboxPref("dom.ipc.plugins.sandbox.");
sandboxPref.Append(aPluginTag->GetNiceFileName());
if (NS_FAILED(Preferences::GetBool(sandboxPref.get(), &enableSandbox))) {
enableSandbox = Preferences::GetBool("dom.ipc.plugins.sandbox.default");
}
#endif
nsAutoPtr<PluginModuleChromeParent> parent(new PluginModuleChromeParent(aFilePath, aPluginId)); nsAutoPtr<PluginModuleChromeParent> parent(new PluginModuleChromeParent(aFilePath, aPluginId));
UniquePtr<LaunchCompleteTask> onLaunchedRunnable(new LaunchedTask(parent)); UniquePtr<LaunchCompleteTask> onLaunchedRunnable(new LaunchedTask(parent));
parent->mSubprocess->SetCallRunnableImmediately(!parent->mIsStartingAsync); parent->mSubprocess->SetCallRunnableImmediately(!parent->mIsStartingAsync);
TimeStamp launchStart = TimeStamp::Now(); TimeStamp launchStart = TimeStamp::Now();
bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable)); bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable),
enableSandbox);
if (!launched) { if (!launched) {
// We never reached open // We never reached open
parent->mShutdown = true; parent->mShutdown = true;

View File

@ -43,8 +43,18 @@ PluginProcessParent::~PluginProcessParent()
} }
bool bool
PluginProcessParent::Launch(mozilla::UniquePtr<LaunchCompleteTask> aLaunchCompleteTask) PluginProcessParent::Launch(mozilla::UniquePtr<LaunchCompleteTask> aLaunchCompleteTask,
bool aEnableSandbox)
{ {
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
mEnableNPAPISandbox = aEnableSandbox;
#else
if (aEnableSandbox) {
MOZ_ASSERT(false,
"Can't enable an NPAPI process sandbox for platform/build.");
}
#endif
ProcessArchitecture currentArchitecture = base::GetCurrentProcessArchitecture(); ProcessArchitecture currentArchitecture = base::GetCurrentProcessArchitecture();
uint32_t containerArchitectures = GetSupportedArchitecturesForProcessType(GeckoProcessType_Plugin); uint32_t containerArchitectures = GetSupportedArchitecturesForProcessType(GeckoProcessType_Plugin);

View File

@ -50,8 +50,11 @@ public:
* *
* @param aLaunchCompleteTask Task that is executed on the main * @param aLaunchCompleteTask Task that is executed on the main
* thread once the asynchonous launch has completed. * thread once the asynchonous launch has completed.
* @param aEnableSandbox Enables a process sandbox if one is available for
* this platform/build. Will assert if true passed and one is not available.
*/ */
bool Launch(UniquePtr<LaunchCompleteTask> aLaunchCompleteTask = UniquePtr<LaunchCompleteTask>()); bool Launch(UniquePtr<LaunchCompleteTask> aLaunchCompleteTask = UniquePtr<LaunchCompleteTask>(),
bool aEnableSandbox = false);
void Delete(); void Delete();

View File

@ -97,6 +97,7 @@ GeckoChildProcessHost::GeckoChildProcessHost(GeckoProcessType aProcessType,
mDelegate(nullptr), mDelegate(nullptr),
#if defined(MOZ_SANDBOX) && defined(XP_WIN) #if defined(MOZ_SANDBOX) && defined(XP_WIN)
mEnableSandboxLogging(false), mEnableSandboxLogging(false),
mEnableNPAPISandbox(false),
#if defined(MOZ_CONTENT_SANDBOX) #if defined(MOZ_CONTENT_SANDBOX)
mMoreStrictContentSandbox(false), mMoreStrictContentSandbox(false),
#endif #endif
@ -813,7 +814,8 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
#endif // MOZ_CONTENT_SANDBOX #endif // MOZ_CONTENT_SANDBOX
break; break;
case GeckoProcessType_Plugin: case GeckoProcessType_Plugin:
if (!PR_GetEnv("MOZ_DISABLE_NPAPI_SANDBOX")) { if (mEnableNPAPISandbox &&
!PR_GetEnv("MOZ_DISABLE_NPAPI_SANDBOX")) {
mSandboxBroker.SetSecurityLevelForPluginProcess(); mSandboxBroker.SetSecurityLevelForPluginProcess();
cmdLine.AppendLooseValue(UTF8ToWide("-sandbox")); cmdLine.AppendLooseValue(UTF8ToWide("-sandbox"));
shouldSandboxCurrentProcess = true; shouldSandboxCurrentProcess = true;

View File

@ -172,6 +172,11 @@ protected:
SandboxBroker mSandboxBroker; SandboxBroker mSandboxBroker;
std::vector<std::wstring> mAllowedFilesRead; std::vector<std::wstring> mAllowedFilesRead;
bool mEnableSandboxLogging; bool mEnableSandboxLogging;
// XXX: Bug 1124167: We should get rid of the process specific logic for
// sandboxing in this class at some point. Unfortunately it will take a bit
// of reorganizing so I don't think this patch is the right time.
bool mEnableNPAPISandbox;
#if defined(MOZ_CONTENT_SANDBOX) #if defined(MOZ_CONTENT_SANDBOX)
bool mMoreStrictContentSandbox; bool mMoreStrictContentSandbox;
#endif #endif