Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(772)

Unified Diff: sandbox/win/src/sandbox_policy.h

Issue 1460903002: Unify PolicyBase into TargetPolicy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@policy_dispatcher
Patch Set: Rebase. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sandbox/win/src/sandbox_policy.h
diff --git a/sandbox/win/src/sandbox_policy.h b/sandbox/win/src/sandbox_policy.h
index 0c3e84738187e5c28e599fd241a5c5b315cbf733..3713ca373b7407f7ab5348ab4c527d7e3eb57e57 100644
--- a/sandbox/win/src/sandbox_policy.h
+++ b/sandbox/win/src/sandbox_policy.h
@@ -5,17 +5,39 @@
#ifndef SANDBOX_WIN_SRC_SANDBOX_POLICY_H_
#define SANDBOX_WIN_SRC_SANDBOX_POLICY_H_
-#include <string>
+#include <windows.h>
+
+#include <list>
+#include <vector>
#include "base/basictypes.h"
+#include "base/compiler_specific.h"
#include "base/strings/string16.h"
+#include "base/win/scoped_handle.h"
+#include "sandbox/win/src/app_container.h"
+#include "sandbox/win/src/crosscall_server.h"
+#include "sandbox/win/src/handle_closer.h"
+#include "sandbox/win/src/ipc_tags.h"
+#include "sandbox/win/src/policy_engine_opcodes.h"
+#include "sandbox/win/src/policy_engine_params.h"
+#include "sandbox/win/src/policy_low_level.h"
+#include "sandbox/win/src/sandbox_policy.h"
#include "sandbox/win/src/sandbox_types.h"
#include "sandbox/win/src/security_level.h"
+#include "sandbox/win/src/target_process.h"
+#include "sandbox/win/src/win_utils.h"
namespace sandbox {
+typedef std::vector<base::win::ScopedHandle*> HandleList;
+
+// A Windows sandbox policy. All public methods are virtual since they may be
+// called from a dll, while the implementation of the methods lives in the main
+// exe.
class TargetPolicy {
public:
+ TargetPolicy();
+
cpu_(ooo_6.6-7.5) 2016/01/06 18:09:40 Advance apologies for the rambling nature of the c
// Windows subsystems that can have specific rules.
// Note: The process subsystem(SUBSY_PROCESS) does not evaluate the request
// exactly like the CreateProcess API does. See the comment at the top of
@@ -61,13 +83,13 @@ class TargetPolicy {
// Increments the reference count of this object. The reference count must
// be incremented if this interface is given to another component.
- virtual void AddRef() = 0;
+ virtual void AddRef();
// Decrements the reference count of this object. When the reference count
// is zero the object is automatically destroyed.
// Indicates that the caller is done with this interface. After calling
// release no other method should be called.
- virtual void Release() = 0;
+ virtual void Release();
// Sets the security level for the target process' two tokens.
// This setting is permanent and cannot be changed once the target process is
@@ -89,13 +111,13 @@ class TargetPolicy {
// Important: most of the sandbox-provided security relies on this single
// setting. The caller should strive to set the lockdown level as restricted
// as possible.
- virtual ResultCode SetTokenLevel(TokenLevel initial, TokenLevel lockdown) = 0;
+ virtual ResultCode SetTokenLevel(TokenLevel initial, TokenLevel lockdown);
// Returns the initial token level.
- virtual TokenLevel GetInitialTokenLevel() const = 0;
+ virtual TokenLevel GetInitialTokenLevel() const;
// Returns the lockdown token level.
- virtual TokenLevel GetLockdownTokenLevel() const = 0;
+ virtual TokenLevel GetLockdownTokenLevel() const;
// Sets the security level of the Job Object to which the target process will
// belong. This setting is permanent and cannot be changed once the target
@@ -130,44 +152,44 @@ class TargetPolicy {
// http://msdn2.microsoft.com/en-us/library/ms684152.aspx
//
// Note: the recommended level is JOB_RESTRICTED or JOB_LOCKDOWN.
- virtual ResultCode SetJobLevel(JobLevel job_level, uint32 ui_exceptions) = 0;
+ virtual ResultCode SetJobLevel(JobLevel job_level, uint32 ui_exceptions);
// Sets a hard limit on the size of the commit set for the sandboxed process.
// If the limit is reached, the process will be terminated with
// SBOX_FATAL_MEMORY_EXCEEDED (7012).
- virtual ResultCode SetJobMemoryLimit(size_t memory_limit) = 0;
+ virtual ResultCode SetJobMemoryLimit(size_t memory_limit);
// Specifies the desktop on which the application is going to run. If the
// desktop does not exist, it will be created. If alternate_winstation is
// set to true, the desktop will be created on an alternate window station.
- virtual ResultCode SetAlternateDesktop(bool alternate_winstation) = 0;
+ virtual ResultCode SetAlternateDesktop(bool alternate_winstation);
// Returns the name of the alternate desktop used. If an alternate window
// station is specified, the name is prepended by the window station name,
// followed by a backslash.
- virtual base::string16 GetAlternateDesktop() const = 0;
+ virtual base::string16 GetAlternateDesktop() const;
// Precreates the desktop and window station, if any.
- virtual ResultCode CreateAlternateDesktop(bool alternate_winstation) = 0;
+ virtual ResultCode CreateAlternateDesktop(bool alternate_winstation);
// Destroys the desktop and windows station.
- virtual void DestroyAlternateDesktop() = 0;
+ virtual void DestroyAlternateDesktop();
// Sets the integrity level of the process in the sandbox. Both the initial
// token and the main token will be affected by this. If the integrity level
// is set to a level higher than the current level, the sandbox will fail
// to start.
- virtual ResultCode SetIntegrityLevel(IntegrityLevel level) = 0;
+ virtual ResultCode SetIntegrityLevel(IntegrityLevel level);
// Returns the initial integrity level used.
- virtual IntegrityLevel GetIntegrityLevel() const = 0;
+ virtual IntegrityLevel GetIntegrityLevel() const;
// Sets the integrity level of the process in the sandbox. The integrity level
// will not take effect before you call LowerToken. User Interface Privilege
// Isolation is not affected by this setting and will remain off for the
// process in the sandbox. If the integrity level is set to a level higher
// than the current level, the sandbox will fail to start.
- virtual ResultCode SetDelayedIntegrityLevel(IntegrityLevel level) = 0;
+ virtual ResultCode SetDelayedIntegrityLevel(IntegrityLevel level);
// Sets the AppContainer to be used for the sandboxed process. Any capability
// to be enabled for the process should be added before this method is invoked
@@ -178,45 +200,45 @@ class TargetPolicy {
// Note that currently Windows restricts the use of impersonation within
// AppContainers, so this function is incompatible with the use of an initial
// token.
- virtual ResultCode SetAppContainer(const wchar_t* sid) = 0;
+ virtual ResultCode SetAppContainer(const wchar_t* sid);
// Sets a capability to be enabled for the sandboxed process' AppContainer.
- virtual ResultCode SetCapability(const wchar_t* sid) = 0;
+ virtual ResultCode SetCapability(const wchar_t* sid);
// Sets the LowBox token for sandboxed process. This is mutually exclusive
// with SetAppContainer method.
- virtual ResultCode SetLowBox(const wchar_t* sid) = 0;
+ virtual ResultCode SetLowBox(const wchar_t* sid);
// Sets the mitigations enabled when the process is created. Most of these
// are implemented as attributes passed via STARTUPINFOEX. So they take
// effect before any thread in the target executes. The declaration of
// MitigationFlags is followed by a detailed description of each flag.
- virtual ResultCode SetProcessMitigations(MitigationFlags flags) = 0;
+ virtual ResultCode SetProcessMitigations(MitigationFlags flags);
// Returns the currently set mitigation flags.
- virtual MitigationFlags GetProcessMitigations() = 0;
+ virtual MitigationFlags GetProcessMitigations();
// Sets process mitigation flags that don't take effect before the call to
// LowerToken().
- virtual ResultCode SetDelayedProcessMitigations(MitigationFlags flags) = 0;
+ virtual ResultCode SetDelayedProcessMitigations(MitigationFlags flags);
// Returns the currently set delayed mitigation flags.
- virtual MitigationFlags GetDelayedProcessMitigations() const = 0;
+ virtual MitigationFlags GetDelayedProcessMitigations() const;
// Sets the interceptions to operate in strict mode. By default, interceptions
// are performed in "relaxed" mode, where if something inside NTDLL.DLL is
// already patched we attempt to intercept it anyway. Setting interceptions
// to strict mode means that when we detect that the function is patched we'll
// refuse to perform the interception.
- virtual void SetStrictInterceptions() = 0;
+ void SetStrictInterceptions();
// Set the handles the target process should inherit for stdout and
// stderr. The handles the caller passes must remain valid for the
// lifetime of the policy object. This only has an effect on
// Windows Vista and later versions. These methods accept pipe and
// file handles, but not console handles.
- virtual ResultCode SetStdoutHandle(HANDLE handle) = 0;
- virtual ResultCode SetStderrHandle(HANDLE handle) = 0;
+ virtual ResultCode SetStdoutHandle(HANDLE handle);
+ virtual ResultCode SetStderrHandle(HANDLE handle);
// Adds a policy rule effective for processes spawned using this policy.
// subsystem: One of the above enumerated windows subsystems.
@@ -229,28 +251,130 @@ class TargetPolicy {
// "c:\\documents and settings\\vince\\*.dmp"
// "c:\\documents and settings\\*\\crashdumps\\*.dmp"
// "c:\\temp\\app_log_?????_chrome.txt"
- virtual ResultCode AddRule(SubSystem subsystem, Semantics semantics,
- const wchar_t* pattern) = 0;
+ virtual ResultCode AddRule(SubSystem subsystem,
+ Semantics semantics,
+ const wchar_t* pattern);
// Adds a dll that will be unloaded in the target process before it gets
// a chance to initialize itself. Typically, dlls that cause the target
// to crash go here.
- virtual ResultCode AddDllToUnload(const wchar_t* dll_name) = 0;
+ virtual ResultCode AddDllToUnload(const wchar_t* dll_name);
// Adds a handle that will be closed in the target process after lockdown.
// A NULL value for handle_name indicates all handles of the specified type.
// An empty string for handle_name indicates the handle is unnamed.
virtual ResultCode AddKernelObjectToClose(const wchar_t* handle_type,
- const wchar_t* handle_name) = 0;
+ const wchar_t* handle_name);
// Adds a handle that will be shared with the target process.
// Returns the handle which was actually shared with the target. This is
// achieved by duplicating the handle to ensure that it is inheritable by
// the target. The caller should treat this as an opaque value.
- virtual void* AddHandleToShare(HANDLE handle) = 0;
+ virtual void* AddHandleToShare(HANDLE handle);
+
+ // Creates a Job object with the level specified in a previous call to
+ // SetJobLevel().
+ virtual ResultCode MakeJobObject(base::win::ScopedHandle* job);
+
+ // Creates the two tokens with the levels specified in a previous call to
+ // SetTokenLevel(). Also creates a lowbox token if specified based on the
+ // lowbox SID.
+ virtual ResultCode MakeTokens(base::win::ScopedHandle* initial,
+ base::win::ScopedHandle* lockdown,
+ base::win::ScopedHandle* lowbox);
+
+ virtual const AppContainerAttributes* GetAppContainer() const;
+
+ virtual PSID GetLowBoxSid() const;
+
+ // Adds a target process to the internal list of targets. Internally a
+ // call to TargetProcess::Init() is issued.
+ virtual bool AddTarget(TargetProcess* target);
+
+ // Called when there are no more active processes in a Job.
+ // Removes a Job object associated with this policy and the target associated
+ // with the job.
+ virtual bool OnJobEmpty(HANDLE job);
+
+ virtual EvalResult EvalPolicy(int service, CountedParameterSetBase* params);
+
+ virtual HANDLE GetStdoutHandle();
+ virtual HANDLE GetStderrHandle();
+
+ // Returns the list of handles being shared with the target process.
+ virtual const HandleList& GetHandlesBeingShared();
+
+ // Closes the handles being shared with the target and clears out the list.
+ virtual void ClearSharedHandles();
+
+ private:
+ friend class base::RefCountedThreadSafe<TargetPolicy>;
+ ~TargetPolicy();
+
+ // Sets up interceptions for a new target.
+ bool SetupAllInterceptions(TargetProcess* target);
+
+ // Sets up the handle closer for a new target.
+ bool SetupHandleCloser(TargetProcess* target);
+
+ ResultCode AddRuleInternal(SubSystem subsystem,
+ Semantics semantics,
+ const wchar_t* pattern);
+
+ // This lock synchronizes operations on the targets_ collection.
+ CRITICAL_SECTION lock_;
+
+ // Maintains the list of target process associated with this policy.
+ // The policy takes ownership of them.
+ typedef std::list<TargetProcess*> TargetSet;
+ TargetSet targets_;
+ // Standard object-lifetime reference counter.
+ volatile LONG ref_count;
+ // The user-defined global policy settings.
+ TokenLevel lockdown_level_;
+ TokenLevel initial_level_;
+ JobLevel job_level_;
+ uint32 ui_exceptions_;
+ size_t memory_limit_;
+ bool use_alternate_desktop_;
+ bool use_alternate_winstation_;
+ // Helps the file system policy initialization.
+ bool file_system_init_;
+ bool relaxed_interceptions_;
+ HANDLE stdout_handle_;
+ HANDLE stderr_handle_;
+ IntegrityLevel integrity_level_;
+ IntegrityLevel delayed_integrity_level_;
+ MitigationFlags mitigations_;
+ MitigationFlags delayed_mitigations_;
+ // Object in charge of generating the low level policy.
+ LowLevelPolicy* policy_maker_;
+ // Memory structure that stores the low level policy.
+ PolicyGlobal* policy_;
+ // The list of dlls to unload in the target process.
+ std::vector<base::string16> blacklisted_dlls_;
+ // This is a map of handle-types to names that we need to close in the
+ // target process. A null set means we need to close all handles of the
+ // given type.
+ HandleCloser handle_closer_;
+ std::vector<base::string16> capabilities_;
+ scoped_ptr<AppContainerAttributes> appcontainer_list_;
+ PSID lowbox_sid_;
+ base::win::ScopedHandle lowbox_directory_;
+ scoped_ptr<Dispatcher> dispatcher_;
+
+ static HDESK alternate_desktop_handle_;
+ static HWINSTA alternate_winstation_handle_;
+ static IntegrityLevel alternate_desktop_integrity_level_label_;
+
+ // Contains the list of handles being shared with the target process.
+ // This list contains handles other than the stderr/stdout handles which are
+ // shared with the target at times.
+ HandleList handles_to_share_;
+
+ DISALLOW_COPY_AND_ASSIGN(TargetPolicy);
};
} // namespace sandbox
-
#endif // SANDBOX_WIN_SRC_SANDBOX_POLICY_H_

Powered by Google App Engine
This is Rietveld 408576698