Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1010)

Unified Diff: sandbox/win/src/sandbox_nt_util.cc

Issue 84063004: Restructure sandbox code to reduce dependencies pulled in by intercept code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove sandbox re-libification Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sandbox/win/src/sandbox_nt_util.cc
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc
index 71314611283e85057964617b191b3514f18b964e..7abecbe646299002f186ff36093b74d6a1fa7d6e 100644
--- a/sandbox/win/src/sandbox_nt_util.cc
+++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -107,56 +107,6 @@ namespace sandbox {
// Handle for our private heap.
void* g_heap = NULL;
-SANDBOX_INTERCEPT HANDLE g_shared_section;
-SANDBOX_INTERCEPT size_t g_shared_IPC_size = 0;
-SANDBOX_INTERCEPT size_t g_shared_policy_size = 0;
-
-void* volatile g_shared_policy_memory = NULL;
-void* volatile g_shared_IPC_memory = NULL;
-
-// Both the IPC and the policy share a single region of memory in which the IPC
-// memory is first and the policy memory is last.
-bool MapGlobalMemory() {
rvargas (doing something else) 2013/11/26 20:42:12 I don't see anything in this block of code that sh
robertshield 2013/11/27 20:28:01 The code in just this block doesn't actually pull
- if (NULL == g_shared_IPC_memory) {
- void* memory = NULL;
- SIZE_T size = 0;
- // Map the entire shared section from the start.
- NTSTATUS ret = g_nt.MapViewOfSection(g_shared_section, NtCurrentProcess,
- &memory, 0, 0, NULL, &size, ViewUnmap,
- 0, PAGE_READWRITE);
-
- if (!NT_SUCCESS(ret) || NULL == memory) {
- NOTREACHED_NT();
- return false;
- }
-
- if (NULL != _InterlockedCompareExchangePointer(&g_shared_IPC_memory,
- memory, NULL)) {
- // Somebody beat us to the memory setup.
- ret = g_nt.UnmapViewOfSection(NtCurrentProcess, memory);
- VERIFY_SUCCESS(ret);
- }
- DCHECK_NT(g_shared_IPC_size > 0);
- g_shared_policy_memory = reinterpret_cast<char*>(g_shared_IPC_memory)
- + g_shared_IPC_size;
- }
- DCHECK_NT(g_shared_policy_memory);
- DCHECK_NT(g_shared_policy_size > 0);
- return true;
-}
-
-void* GetGlobalIPCMemory() {
- if (!MapGlobalMemory())
- return NULL;
- return g_shared_IPC_memory;
-}
-
-void* GetGlobalPolicyMemory() {
- if (!MapGlobalMemory())
- return NULL;
- return g_shared_policy_memory;
-}
-
bool InitHeap() {
if (!g_heap) {
// Create a new heap using default values for everything.
@@ -205,74 +155,6 @@ bool ValidParameter(void* buffer, size_t size, RequiredAccess intent) {
return true;
}
-NTSTATUS CopyData(void* destination, const void* source, size_t bytes) {
- NTSTATUS ret = STATUS_SUCCESS;
- __try {
- if (SandboxFactory::GetTargetServices()->GetState()->InitCalled()) {
rvargas (doing something else) 2013/11/26 20:42:12 Same thing here... and ExtractModuleName... is it
robertshield 2013/11/27 20:28:01 Yes, the GetTargetServices() call is the problem.
rvargas (doing something else) 2013/11/27 23:53:50 Carlos may have an opinion here, but I'd say we co
robertshield 2013/11/29 01:21:26 I believe this is now solved by your observation t
- memcpy(destination, source, bytes);
- } else {
- const char* from = reinterpret_cast<const char*>(source);
- char* to = reinterpret_cast<char*>(destination);
- for (size_t i = 0; i < bytes; i++) {
- to[i] = from[i];
- }
- }
- } __except(EXCEPTION_EXECUTE_HANDLER) {
- ret = GetExceptionCode();
- }
- return ret;
-}
-
-// Hacky code... replace with AllocAndCopyObjectAttributes.
-NTSTATUS AllocAndCopyName(const OBJECT_ATTRIBUTES* in_object,
- wchar_t** out_name, uint32* attributes,
- HANDLE* root) {
- if (!InitHeap())
- return STATUS_NO_MEMORY;
-
- DCHECK_NT(out_name);
- *out_name = NULL;
- NTSTATUS ret = STATUS_UNSUCCESSFUL;
- __try {
- do {
- if (in_object->RootDirectory != static_cast<HANDLE>(0) && !root)
- break;
- if (NULL == in_object->ObjectName)
- break;
- if (NULL == in_object->ObjectName->Buffer)
- break;
-
- size_t size = in_object->ObjectName->Length + sizeof(wchar_t);
- *out_name = new(NT_ALLOC) wchar_t[size/sizeof(wchar_t)];
- if (NULL == *out_name)
- break;
-
- ret = CopyData(*out_name, in_object->ObjectName->Buffer,
- size - sizeof(wchar_t));
- if (!NT_SUCCESS(ret))
- break;
-
- (*out_name)[size / sizeof(wchar_t) - 1] = L'\0';
-
- if (attributes)
- *attributes = in_object->Attributes;
-
- if (root)
- *root = in_object->RootDirectory;
- ret = STATUS_SUCCESS;
- } while (false);
- } __except(EXCEPTION_EXECUTE_HANDLER) {
- ret = GetExceptionCode();
- }
-
- if (!NT_SUCCESS(ret) && *out_name) {
- operator delete(*out_name, NT_ALLOC);
- *out_name = NULL;
- }
-
- return ret;
-}
-
NTSTATUS GetProcessId(HANDLE process, ULONG *process_id) {
PROCESS_BASIC_INFORMATION proc_info;
ULONG bytes_returned;
@@ -431,55 +313,6 @@ UNICODE_STRING* GetBackingFilePath(PVOID address) {
}
}
-UNICODE_STRING* ExtractModuleName(const UNICODE_STRING* module_path) {
- if ((!module_path) || (!module_path->Buffer))
- return NULL;
-
- wchar_t* sep = NULL;
- int start_pos = module_path->Length / sizeof(wchar_t) - 1;
- int ix = start_pos;
-
- for (; ix >= 0; --ix) {
- if (module_path->Buffer[ix] == L'\\') {
- sep = &module_path->Buffer[ix];
- break;
- }
- }
-
- // Ends with path separator. Not a valid module name.
- if ((ix == start_pos) && sep)
- return NULL;
-
- // No path separator found. Use the entire name.
- if (!sep) {
- sep = &module_path->Buffer[-1];
- }
-
- // Add one to the size so we can null terminate the string.
- size_t size_bytes = (start_pos - ix + 1) * sizeof(wchar_t);
-
- // Based on the code above, size_bytes should always be small enough
- // to make the static_cast below safe.
- DCHECK_NT(kuint16max > size_bytes);
- char* str_buffer = new(NT_ALLOC) char[size_bytes + sizeof(UNICODE_STRING)];
- if (!str_buffer)
- return NULL;
-
- UNICODE_STRING* out_string = reinterpret_cast<UNICODE_STRING*>(str_buffer);
- out_string->Buffer = reinterpret_cast<wchar_t*>(&out_string[1]);
- out_string->Length = static_cast<USHORT>(size_bytes - sizeof(wchar_t));
- out_string->MaximumLength = static_cast<USHORT>(size_bytes);
-
- NTSTATUS ret = CopyData(out_string->Buffer, &sep[1], out_string->Length);
- if (!NT_SUCCESS(ret)) {
- operator delete(out_string, NT_ALLOC);
- return NULL;
- }
-
- out_string->Buffer[out_string->Length / sizeof(wchar_t)] = L'\0';
- return out_string;
-}
-
NTSTATUS AutoProtectMemory::ChangeProtection(void* address, size_t bytes,
ULONG protect) {
DCHECK_NT(!changed_);
@@ -546,6 +379,26 @@ bool IsSupportedRenameCall(FILE_RENAME_INFORMATION* file_info, DWORD length,
return true;
}
+bool WriteProtectedChildMemory(HANDLE child_process, void* address,
+ const void* buffer, size_t length) {
+ // First, remove the protections.
+ DWORD old_protection;
+ if (!::VirtualProtectEx(child_process, address, length,
rvargas (doing something else) 2013/11/26 20:42:12 This, on the other hand, is not part of the nt lay
robertshield 2013/11/27 20:28:01 Moved it back.
+ PAGE_WRITECOPY, &old_protection))
+ return false;
+
+ SIZE_T written;
+ bool ok = ::WriteProcessMemory(child_process, address, buffer, length,
+ &written) && (length == written);
+
+ // Always attempt to restore the original protection.
+ if (!::VirtualProtectEx(child_process, address, length,
+ old_protection, &old_protection))
+ return false;
+
+ return ok;
+}
+
} // namespace sandbox
void* operator new(size_t size, sandbox::AllocationType type,

Powered by Google App Engine
This is Rietveld 408576698