|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
|
2 // Use of this source code is governed by a BSD-style license that can be |
|
3 // found in the LICENSE file. |
|
4 |
|
5 #ifndef SANDBOX_SRC_RESTRICTED_TOKEN_H_ |
|
6 #define SANDBOX_SRC_RESTRICTED_TOKEN_H_ |
|
7 |
|
8 #include <windows.h> |
|
9 #include <vector> |
|
10 |
|
11 #include "base/basictypes.h" |
|
12 #include "sandbox/win/src/restricted_token_utils.h" |
|
13 #include "sandbox/win/src/security_level.h" |
|
14 #include "sandbox/win/src/sid.h" |
|
15 |
|
16 // Flags present in the Group SID list. These 2 flags are new in Windows Vista |
|
17 #ifndef SE_GROUP_INTEGRITY |
|
18 #define SE_GROUP_INTEGRITY (0x00000020L) |
|
19 #endif |
|
20 #ifndef SE_GROUP_INTEGRITY_ENABLED |
|
21 #define SE_GROUP_INTEGRITY_ENABLED (0x00000040L) |
|
22 #endif |
|
23 |
|
24 namespace sandbox { |
|
25 |
|
26 // Handles the creation of a restricted token using the effective token or |
|
27 // any token handle. |
|
28 // Sample usage: |
|
29 // RestrictedToken restricted_token; |
|
30 // unsigned err_code = restricted_token.Init(NULL); // Use the current |
|
31 // // effective token |
|
32 // if (ERROR_SUCCESS != err_code) { |
|
33 // // handle error. |
|
34 // } |
|
35 // |
|
36 // restricted_token.AddRestrictingSid(ATL::Sids::Users().GetPSID()); |
|
37 // HANDLE token_handle; |
|
38 // err_code = restricted_token.GetRestrictedTokenHandle(&token_handle); |
|
39 // if (ERROR_SUCCESS != err_code) { |
|
40 // // handle error. |
|
41 // } |
|
42 // [...] |
|
43 // CloseHandle(token_handle); |
|
44 class RestrictedToken { |
|
45 public: |
|
46 // Init() has to be called before calling any other method in the class. |
|
47 RestrictedToken() |
|
48 : init_(false), effective_token_(NULL), |
|
49 integrity_level_(INTEGRITY_LEVEL_LAST) { } |
|
50 |
|
51 ~RestrictedToken() { |
|
52 if (effective_token_) |
|
53 CloseHandle(effective_token_); |
|
54 } |
|
55 |
|
56 // Initializes the RestrictedToken object with effective_token. |
|
57 // If effective_token is NULL, it initializes the RestrictedToken object with |
|
58 // the effective token of the current process. |
|
59 unsigned Init(HANDLE effective_token); |
|
60 |
|
61 // Creates a restricted token and returns its handle using the token_handle |
|
62 // output parameter. This handle has to be closed by the caller. |
|
63 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
64 // function fails, the return value is the win32 error code corresponding to |
|
65 // the error. |
|
66 unsigned GetRestrictedTokenHandle(HANDLE *token_handle) const; |
|
67 |
|
68 // Creates a restricted token and uses this new token to create a new token |
|
69 // for impersonation. Returns the handle of this impersonation token using |
|
70 // the token_handle output parameter. This handle has to be closed by |
|
71 // the caller. |
|
72 // |
|
73 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
74 // function fails, the return value is the win32 error code corresponding to |
|
75 // the error. |
|
76 // |
|
77 // The sample usage is the same as the GetRestrictedTokenHandle function. |
|
78 unsigned GetRestrictedTokenHandleForImpersonation(HANDLE *token_handle) const; |
|
79 |
|
80 // Lists all sids in the token and mark them as Deny Only except for those |
|
81 // present in the exceptions parameter. If there is no exception needed, |
|
82 // the caller can pass an empty list or NULL for the exceptions |
|
83 // parameter. |
|
84 // |
|
85 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
86 // function fails, the return value is the win32 error code corresponding to |
|
87 // the error. |
|
88 // |
|
89 // Sample usage: |
|
90 // std::vector<Sid> sid_exceptions; |
|
91 // sid_exceptions.push_back(ATL::Sids::Users().GetPSID()); |
|
92 // sid_exceptions.push_back(ATL::Sids::World().GetPSID()); |
|
93 // restricted_token.AddAllSidsForDenyOnly(&sid_exceptions); |
|
94 // Note: A Sid marked for Deny Only in a token cannot be used to grant |
|
95 // access to any resource. It can only be used to deny access. |
|
96 unsigned AddAllSidsForDenyOnly(std::vector<Sid> *exceptions); |
|
97 |
|
98 // Adds a user or group SID for Deny Only in the restricted token. |
|
99 // Parameter: sid is the SID to add in the Deny Only list. |
|
100 // The return value is always ERROR_SUCCESS. |
|
101 // |
|
102 // Sample Usage: |
|
103 // restricted_token.AddSidForDenyOnly(ATL::Sids::Admins().GetPSID()); |
|
104 unsigned AddSidForDenyOnly(const Sid &sid); |
|
105 |
|
106 // Adds the user sid of the token for Deny Only in the restricted token. |
|
107 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
108 // function fails, the return value is the win32 error code corresponding to |
|
109 // the error. |
|
110 unsigned AddUserSidForDenyOnly(); |
|
111 |
|
112 // Lists all privileges in the token and add them to the list of privileges |
|
113 // to remove except for those present in the exceptions parameter. If |
|
114 // there is no exception needed, the caller can pass an empty list or NULL |
|
115 // for the exceptions parameter. |
|
116 // |
|
117 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
118 // function fails, the return value is the win32 error code corresponding to |
|
119 // the error. |
|
120 // |
|
121 // Sample usage: |
|
122 // std::vector<std::wstring> privilege_exceptions; |
|
123 // privilege_exceptions.push_back(SE_CHANGE_NOTIFY_NAME); |
|
124 // restricted_token.DeleteAllPrivileges(&privilege_exceptions); |
|
125 unsigned DeleteAllPrivileges( |
|
126 const std::vector<std::wstring> *exceptions); |
|
127 |
|
128 // Adds a privilege to the list of privileges to remove in the restricted |
|
129 // token. |
|
130 // Parameter: privilege is the privilege name to remove. This is the string |
|
131 // representing the privilege. (e.g. "SeChangeNotifyPrivilege"). |
|
132 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
133 // function fails, the return value is the win32 error code corresponding to |
|
134 // the error. |
|
135 // |
|
136 // Sample usage: |
|
137 // restricted_token.DeletePrivilege(SE_LOAD_DRIVER_NAME); |
|
138 unsigned DeletePrivilege(const wchar_t *privilege); |
|
139 |
|
140 // Adds a SID to the list of restricting sids in the restricted token. |
|
141 // Parameter: sid is the sid to add to the list restricting sids. |
|
142 // The return value is always ERROR_SUCCESS. |
|
143 // |
|
144 // Sample usage: |
|
145 // restricted_token.AddRestrictingSid(ATL::Sids::Users().GetPSID()); |
|
146 // Note: The list of restricting is used to force Windows to perform all |
|
147 // access checks twice. The first time using your user SID and your groups, |
|
148 // and the second time using your list of restricting sids. The access has |
|
149 // to be granted in both places to get access to the resource requested. |
|
150 unsigned AddRestrictingSid(const Sid &sid); |
|
151 |
|
152 // Adds the logon sid of the token in the list of restricting sids for the |
|
153 // restricted token. |
|
154 // |
|
155 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
156 // function fails, the return value is the win32 error code corresponding to |
|
157 // the error. |
|
158 unsigned AddRestrictingSidLogonSession(); |
|
159 |
|
160 // Adds the owner sid of the token in the list of restricting sids for the |
|
161 // restricted token. |
|
162 // |
|
163 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
164 // function fails, the return value is the win32 error code corresponding to |
|
165 // the error. |
|
166 unsigned AddRestrictingSidCurrentUser(); |
|
167 |
|
168 // Adds all group sids and the user sid to the restricting sids list. |
|
169 // |
|
170 // If the function succeeds, the return value is ERROR_SUCCESS. If the |
|
171 // function fails, the return value is the win32 error code corresponding to |
|
172 // the error. |
|
173 unsigned AddRestrictingSidAllSids(); |
|
174 |
|
175 // Sets the token integrity level. This is only valid on Vista. The integrity |
|
176 // level cannot be higher than your current integrity level. |
|
177 unsigned SetIntegrityLevel(IntegrityLevel integrity_level); |
|
178 |
|
179 private: |
|
180 // The list of restricting sids in the restricted token. |
|
181 std::vector<Sid> sids_to_restrict_; |
|
182 // The list of privileges to remove in the restricted token. |
|
183 std::vector<LUID> privileges_to_disable_; |
|
184 // The list of sids to mark as Deny Only in the restricted token. |
|
185 std::vector<Sid> sids_for_deny_only_; |
|
186 // The token to restrict. Can only be set in a constructor. |
|
187 HANDLE effective_token_; |
|
188 // The token integrity level. Only valid on Vista. |
|
189 IntegrityLevel integrity_level_; |
|
190 // Tells if the object is initialized or not (if Init() has been called) |
|
191 bool init_; |
|
192 |
|
193 DISALLOW_COPY_AND_ASSIGN(RestrictedToken); |
|
194 }; |
|
195 |
|
196 } // namespace sandbox |
|
197 |
|
198 #endif // SANDBOX_SRC_RESTRICTED_TOKEN_H_ |