blob: 9eb1807abb5e85547f65f8927619899b288e23e8 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 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.
initial.commita814a8d52008-07-26 22:41:284
[email protected]0c57f722008-09-28 01:10:265#ifndef SANDBOX_SRC_RESTRICTED_TOKEN_H_
6#define SANDBOX_SRC_RESTRICTED_TOKEN_H_
initial.commita814a8d52008-07-26 22:41:287
8#include <windows.h>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "sandbox/src/restricted_token_utils.h"
13#include "sandbox/src/security_level.h"
14#include "sandbox/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
24namespace 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);
44class 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_EVIL_CONSTRUCTORS(RestrictedToken);
194};
195
196} // namespace sandbox
197
[email protected]0c57f722008-09-28 01:10:26198#endif // SANDBOX_SRC_RESTRICTED_TOKEN_H_
license.botbf09a502008-08-24 00:55:55199