summaryrefslogtreecommitdiffstats
path: root/sandbox/src/restricted_token_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/src/restricted_token_utils.cc')
-rw-r--r--sandbox/src/restricted_token_utils.cc38
1 files changed, 37 insertions, 1 deletions
diff --git a/sandbox/src/restricted_token_utils.cc b/sandbox/src/restricted_token_utils.cc
index b036e51..c789471 100644
--- a/sandbox/src/restricted_token_utils.cc
+++ b/sandbox/src/restricted_token_utils.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -340,4 +340,40 @@ DWORD SetProcessIntegrityLevel(IntegrityLevel integrity_level) {
return SetTokenIntegrityLevel(token.Get(), integrity_level);
}
+DWORD SetObjectDenyRestrictedAndNull(HANDLE handle, SE_OBJECT_TYPE type) {
+ PSECURITY_DESCRIPTOR sec_desc = NULL;
+ PACL old_dacl = NULL;
+
+ DWORD error = ::GetSecurityInfo(handle, type, DACL_SECURITY_INFORMATION,
+ NULL, NULL, &old_dacl, NULL, &sec_desc);
+ if (!error) {
+ Sid deny_sids[] = { Sid(WinNullSid), Sid(WinRestrictedCodeSid) };
+ const int kDenySidsCount = sizeof(deny_sids) / sizeof(deny_sids[0]);
+ EXPLICIT_ACCESS deny_aces[kDenySidsCount];
+ ::ZeroMemory(deny_aces, sizeof(deny_aces));
+
+ for (int i = 0; i < kDenySidsCount; ++i) {
+ deny_aces[i].grfAccessMode = DENY_ACCESS;
+ deny_aces[i].grfAccessPermissions = GENERIC_ALL;
+ deny_aces[i].grfInheritance = NO_INHERITANCE;
+ deny_aces[i].Trustee.TrusteeForm = TRUSTEE_IS_SID;
+ deny_aces[i].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
+ deny_aces[i].Trustee.ptstrName =
+ reinterpret_cast<LPWSTR>(const_cast<SID*>(deny_sids[i].GetPSID()));
+ }
+
+ PACL new_dacl = NULL;
+ error = ::SetEntriesInAcl(kDenySidsCount, deny_aces, old_dacl, &new_dacl);
+ if (!error) {
+ error = ::SetSecurityInfo(handle, type, DACL_SECURITY_INFORMATION,
+ NULL, NULL, new_dacl, NULL);
+ ::LocalFree(new_dacl);
+ }
+
+ ::LocalFree(sec_desc);
+ }
+
+ return error;
+}
+
} // namespace sandbox