OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sandbox/src/target_services.h" | 5 #include "sandbox/src/target_services.h" |
6 | 6 |
7 #include <process.h> | 7 #include <process.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "sandbox/src/crosscall_client.h" | 10 #include "sandbox/src/crosscall_client.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 TargetServicesBase::TargetServicesBase() { | 64 TargetServicesBase::TargetServicesBase() { |
65 } | 65 } |
66 | 66 |
67 ResultCode TargetServicesBase::Init() { | 67 ResultCode TargetServicesBase::Init() { |
68 process_state_.SetInitCalled(); | 68 process_state_.SetInitCalled(); |
69 return SBOX_ALL_OK; | 69 return SBOX_ALL_OK; |
70 } | 70 } |
71 | 71 |
72 // Failure here is a breach of security so the process is terminated. | 72 // Failure here is a breach of security so the process is terminated. |
73 void TargetServicesBase::LowerToken() { | 73 void TargetServicesBase::LowerToken() { |
74 DWORD error_code = SetProcessIntegrityLevel(g_shared_delayed_integrity_level); | 74 if (ERROR_SUCCESS != |
75 // Here we don't terminate the process if the error is ERROR_INVALID_HANDLE, | 75 SetProcessIntegrityLevel(g_shared_delayed_integrity_level)) |
76 // this is because this error is not possible in normal circumstances, unless | |
77 // it is hooked by sftldr_wow64.dll, in which case we prefer to keep running. | |
78 // See http://crbug.com/95888. | |
79 if (ERROR_SUCCESS != error_code && ERROR_INVALID_HANDLE != error_code) | |
80 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_INTEGRITY); | 76 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_INTEGRITY); |
81 process_state_.SetRevertedToSelf(); | 77 process_state_.SetRevertedToSelf(); |
82 // If the client code as called RegOpenKey, advapi32.dll has cached some | 78 // If the client code as called RegOpenKey, advapi32.dll has cached some |
83 // handles. The following code gets rid of them. | 79 // handles. The following code gets rid of them. |
84 if (!::RevertToSelf()) | 80 if (!::RevertToSelf()) |
85 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_DROPTOKEN); | 81 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_DROPTOKEN); |
86 if (!FlushCachedRegHandles()) | 82 if (!FlushCachedRegHandles()) |
87 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_FLUSHANDLES); | 83 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_FLUSHANDLES); |
88 if (ERROR_SUCCESS != ::RegDisablePredefinedCache()) | 84 if (ERROR_SUCCESS != ::RegDisablePredefinedCache()) |
89 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_CACHEDISABLE); | 85 ::TerminateProcess(::GetCurrentProcess(), SBOX_FATAL_CACHEDISABLE); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 if (process_state_ < 2) | 169 if (process_state_ < 2) |
174 process_state_ = 2; | 170 process_state_ = 2; |
175 } | 171 } |
176 | 172 |
177 void ProcessState::SetRevertedToSelf() { | 173 void ProcessState::SetRevertedToSelf() { |
178 if (process_state_ < 3) | 174 if (process_state_ < 3) |
179 process_state_ = 3; | 175 process_state_ = 3; |
180 } | 176 } |
181 | 177 |
182 } // namespace sandbox | 178 } // namespace sandbox |
OLD | NEW |