diff options
author | jschuh@chromium.org <jschuh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-18 20:59:35 +0000 |
---|---|---|
committer | jschuh@chromium.org <jschuh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-18 20:59:35 +0000 |
commit | 404fbfc12f85014f70e1de7958aad0d0f67aa214 (patch) | |
tree | 4f2fea186cd0ceaa318752629168fe1b36f42aa3 /content | |
parent | 0a34b6aaf62824ad6dd176402f7ef175de181a1f (diff) | |
download | chromium_src-404fbfc12f85014f70e1de7958aad0d0f67aa214.zip chromium_src-404fbfc12f85014f70e1de7958aad0d0f67aa214.tar.gz chromium_src-404fbfc12f85014f70e1de7958aad0d0f67aa214.tar.bz2 |
Add a sandbox API to allow closing open handles at lockdown.
BUG=58069
BUG=74242
TEST=sbox_integration_tests --gtest_filter=HandleCloserTests.*
Review URL: http://codereview.chromium.org/7253054
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92887 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/common/sandbox_policy.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/content/common/sandbox_policy.cc b/content/common/sandbox_policy.cc index dd0473e..2d01bde 100644 --- a/content/common/sandbox_policy.cc +++ b/content/common/sandbox_policy.cc @@ -194,6 +194,41 @@ void AddDllEvictionPolicy(sandbox::TargetPolicy* policy) { BlacklistAddOneDll(kTroublesomeDlls[ix], policy); } +// Returns the object path prepended with the current logon session. +string16 PrependWindowsSessionPath(const char16* object) { + // Cache this because it can't change after process creation. + static string16* session_prefix = NULL; + if (!session_prefix) { + HANDLE token; + DWORD session_id; + DWORD session_id_length; + + CHECK(::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token)); + CHECK(::GetTokenInformation(token, TokenSessionId, &session_id, + sizeof(session_id), &session_id_length)); + CloseHandle(token); + + session_prefix = new string16(base::StringPrintf(L"\\Sessions\\%d", + session_id)); + } + + return *session_prefix + object; +} + +// Closes handles that are opened at process creation and initialization. +void AddBaseHandleClosePolicy(sandbox::TargetPolicy* policy) { + // Being able to manipulate anything BaseNamedObjects is bad. + policy->AddKernelObjectToClose(L"Directory", PrependWindowsSessionPath( + L"\\BaseNamedObjects").data()); + policy->AddKernelObjectToClose(L"Section", PrependWindowsSessionPath( + L"\\BaseNamedObjects\\windows_shell_global_counters").data()); +} + +void AddStrictHandleClosePolicy(sandbox::TargetPolicy* policy) { + // This is loaded when rand_s is seeded, but not needed again. + policy->AddKernelObjectToClose(L"File", L"\\Device\\KsecDD"); +} + // Adds the generic policy rules to a sandbox TargetPolicy. bool AddGenericPolicy(sandbox::TargetPolicy* policy) { sandbox::ResultCode result; @@ -279,6 +314,7 @@ void AddPolicyForRenderer(sandbox::TargetPolicy* policy) { } AddDllEvictionPolicy(policy); + AddBaseHandleClosePolicy(policy); } // The Pepper process as locked-down as a renderer execpt that it can @@ -414,6 +450,8 @@ base::ProcessHandle StartProcessWithAccess(CommandLine* cmd_line, return 0; } else { AddPolicyForRenderer(policy); + if (type == ChildProcessInfo::RENDER_PROCESS) + AddStrictHandleClosePolicy(policy); if (type_str != switches::kRendererProcess) { // Hack for Google Desktop crash. Trick GD into not injecting its DLL into |