Index: sandbox/win/src/sandbox_policy_base.cc |
diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc |
index 7b9262b079a58923cba919860ca5e54f0e43c3b1..4604bfdad69cda40feb7d68fb65fc22e72c7deea 100644 |
--- a/sandbox/win/src/sandbox_policy_base.cc |
+++ b/sandbox/win/src/sandbox_policy_base.cc |
@@ -373,85 +373,16 @@ ResultCode PolicyBase::SetStderrHandle(HANDLE handle) { |
return SBOX_ALL_OK; |
} |
-ResultCode PolicyBase::AddRule(SubSystem subsystem, Semantics semantics, |
+ResultCode PolicyBase::AddRule(SubSystem subsystem, |
+ Semantics semantics, |
const wchar_t* pattern) { |
- if (NULL == policy_) { |
- policy_ = MakeBrokerPolicyMemory(); |
- DCHECK(policy_); |
- policy_maker_ = new LowLevelPolicy(policy_); |
- DCHECK(policy_maker_); |
- } |
- |
- switch (subsystem) { |
- case SUBSYS_FILES: { |
- if (!file_system_init_) { |
- if (!FileSystemPolicy::SetInitialRules(policy_maker_)) |
- return SBOX_ERROR_BAD_PARAMS; |
- file_system_init_ = true; |
- } |
- if (!FileSystemPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- case SUBSYS_SYNC: { |
- if (!SyncPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- case SUBSYS_PROCESS: { |
- if (lockdown_level_ < USER_INTERACTIVE && |
- TargetPolicy::PROCESS_ALL_EXEC == semantics) { |
- // This is unsupported. This is a huge security risk to give full access |
- // to a process handle. |
- return SBOX_ERROR_UNSUPPORTED; |
- } |
- if (!ProcessPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- case SUBSYS_NAMED_PIPES: { |
- if (!NamedPipePolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- case SUBSYS_REGISTRY: { |
- if (!RegistryPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- case SUBSYS_HANDLES: { |
- if (!HandlePolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- |
- case SUBSYS_WIN32K_LOCKDOWN: { |
- if (!ProcessMitigationsWin32KLockdownPolicy::GenerateRules( |
- pattern, semantics,policy_maker_)) { |
- NOTREACHED(); |
- return SBOX_ERROR_BAD_PARAMS; |
- } |
- break; |
- } |
- |
- default: { |
- return SBOX_ERROR_UNSUPPORTED; |
- } |
- } |
- |
- return SBOX_ALL_OK; |
+ ResultCode result = AddRuleInternal(subsystem, semantics, pattern); |
+ LOG_IF(ERROR, result != SBOX_ALL_OK) << "Failed to add sandbox rule." |
+ << " error = " << result |
+ << ", subsystem = " << subsystem |
+ << ", semantics = " << semantics |
+ << ", pattern = '" << pattern << "'"; |
+ return result; |
} |
ResultCode PolicyBase::AddDllToUnload(const wchar_t* dll_name) { |
@@ -735,4 +666,84 @@ bool PolicyBase::SetupHandleCloser(TargetProcess* target) { |
return handle_closer_.InitializeTargetHandles(target); |
} |
+ResultCode PolicyBase::AddRuleInternal(SubSystem subsystem, |
+ Semantics semantics, |
+ const wchar_t* pattern) { |
+ if (NULL == policy_) { |
+ policy_ = MakeBrokerPolicyMemory(); |
+ DCHECK(policy_); |
+ policy_maker_ = new LowLevelPolicy(policy_); |
+ DCHECK(policy_maker_); |
+ } |
+ |
+ switch (subsystem) { |
+ case SUBSYS_FILES: { |
+ if (!file_system_init_) { |
+ if (!FileSystemPolicy::SetInitialRules(policy_maker_)) |
+ return SBOX_ERROR_BAD_PARAMS; |
+ file_system_init_ = true; |
+ } |
+ if (!FileSystemPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ case SUBSYS_SYNC: { |
+ if (!SyncPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ case SUBSYS_PROCESS: { |
+ if (lockdown_level_ < USER_INTERACTIVE && |
+ TargetPolicy::PROCESS_ALL_EXEC == semantics) { |
+ // This is unsupported. This is a huge security risk to give full access |
+ // to a process handle. |
+ return SBOX_ERROR_UNSUPPORTED; |
+ } |
+ if (!ProcessPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ case SUBSYS_NAMED_PIPES: { |
+ if (!NamedPipePolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ case SUBSYS_REGISTRY: { |
+ if (!RegistryPolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ case SUBSYS_HANDLES: { |
+ if (!HandlePolicy::GenerateRules(pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ |
+ case SUBSYS_WIN32K_LOCKDOWN: { |
+ if (!ProcessMitigationsWin32KLockdownPolicy::GenerateRules( |
+ pattern, semantics, policy_maker_)) { |
+ NOTREACHED(); |
+ return SBOX_ERROR_BAD_PARAMS; |
+ } |
+ break; |
+ } |
+ |
+ default: { return SBOX_ERROR_UNSUPPORTED; } |
+ } |
+ |
+ return SBOX_ALL_OK; |
+} |
+ |
} // namespace sandbox |