Index: sandbox/win/src/broker_services.cc |
diff --git a/sandbox/win/src/broker_services.cc b/sandbox/win/src/broker_services.cc |
index c3df2efc96c42423ffc3deac2d987e7fd7f05119..15d905d4c38147591cc5549483d72cd49acef18c 100644 |
--- a/sandbox/win/src/broker_services.cc |
+++ b/sandbox/win/src/broker_services.cc |
@@ -330,13 +330,14 @@ ResultCode BrokerServicesBase::SpawnTarget(const wchar_t* exe_path, |
// Initialize the startup information from the policy. |
base::win::StartupInformation startup_info; |
- // The liftime of |mitigations| and |inherit_handle_list| have to be at least |
- // as long as |startup_info| because |UpdateProcThreadAttribute| requires that |
+ // The liftime of |mitigations|, |inherit_handle_list| and |
+ // |child_process_creation| have to be at least as long as |
+ // |startup_info| because |UpdateProcThreadAttribute| requires that |
// its |lpValue| parameter persist until |DeleteProcThreadAttributeList| is |
// called; StartupInformation's destructor makes such a call. |
DWORD64 mitigations; |
- |
std::vector<HANDLE> inherited_handle_list; |
+ DWORD child_process_creation = PROCESS_CREATION_CHILD_PROCESS_RESTRICTED; |
base::string16 desktop = policy_base->GetAlternateDesktop(); |
if (!desktop.empty()) { |
@@ -354,11 +355,18 @@ ResultCode BrokerServicesBase::SpawnTarget(const wchar_t* exe_path, |
++attribute_count; |
size_t mitigations_size; |
- ConvertProcessMitigationsToPolicy(policy->GetProcessMitigations(), |
+ ConvertProcessMitigationsToPolicy(policy_base->GetProcessMitigations(), |
&mitigations, &mitigations_size); |
if (mitigations) |
++attribute_count; |
+ bool restrict_child_process_creation = false; |
+ if (base::win::GetVersion() >= base::win::VERSION_WIN10_TH2 && |
+ policy_base->GetJobLevel() <= JOB_LIMITED_USER) { |
+ restrict_child_process_creation = true; |
+ ++attribute_count; |
+ } |
+ |
HANDLE stdout_handle = policy_base->GetStdoutHandle(); |
HANDLE stderr_handle = policy_base->GetStderrHandle(); |
@@ -394,6 +402,14 @@ ResultCode BrokerServicesBase::SpawnTarget(const wchar_t* exe_path, |
} |
} |
+ if (restrict_child_process_creation) { |
+ if (!startup_info.UpdateProcThreadAttribute( |
+ PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY, |
+ &child_process_creation, sizeof(child_process_creation))) { |
+ return SBOX_ERROR_PROC_THREAD_ATTRIBUTES; |
+ } |
+ } |
+ |
if (inherited_handle_list.size()) { |
if (!startup_info.UpdateProcThreadAttribute( |
PROC_THREAD_ATTRIBUTE_HANDLE_LIST, |
@@ -416,7 +432,7 @@ ResultCode BrokerServicesBase::SpawnTarget(const wchar_t* exe_path, |
if (NULL == thread_pool_) |
thread_pool_ = new Win2kThreadPool(); |
- // Create the TargetProces object and spawn the target suspended. Note that |
+ // Create the TargetProcess object and spawn the target suspended. Note that |
// Brokerservices does not own the target object. It is owned by the Policy. |
base::win::ScopedProcessInformation process_info; |
TargetProcess* target = |