Reserve the bottom of the address space to prevent predictable alocations.
BUG=113891 Review URL: http://codereview.chromium.org/9447078 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123920 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
@ -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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
@ -39,6 +39,27 @@ void CopyPolicyToTarget(const void* source, size_t size, void* dest) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reserve a random range at the bottom of the address space in the target
|
||||||
|
// process to prevent predictable alocations at low addresses.
|
||||||
|
void PoisonLowerAddressRange(HANDLE process) {
|
||||||
|
unsigned int limit;
|
||||||
|
rand_s(&limit);
|
||||||
|
char* ptr = 0;
|
||||||
|
const size_t kMask64k = 0xFFFF;
|
||||||
|
// Random range (512k-4.5mb) in 64k steps.
|
||||||
|
const char* end = ptr + ((((limit % 4096) + 512) * 1024) & ~kMask64k);
|
||||||
|
while (ptr < end) {
|
||||||
|
MEMORY_BASIC_INFORMATION memory_info;
|
||||||
|
if (!::VirtualQueryEx(process, ptr, &memory_info, sizeof(memory_info)))
|
||||||
|
break;
|
||||||
|
size_t size = std::min((memory_info.RegionSize + kMask64k) & ~kMask64k,
|
||||||
|
static_cast<SIZE_T>(end - ptr));
|
||||||
|
if (ptr && memory_info.State == MEM_FREE)
|
||||||
|
::VirtualAllocEx(process, ptr, size, MEM_RESERVE, PAGE_NOACCESS);
|
||||||
|
ptr += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace sandbox {
|
namespace sandbox {
|
||||||
@ -152,6 +173,8 @@ DWORD TargetProcess::Create(const wchar_t* exe_path,
|
|||||||
return ::GetLastError();
|
return ::GetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PoisonLowerAddressRange(process_info.hProcess);
|
||||||
|
|
||||||
DWORD win_result = ERROR_SUCCESS;
|
DWORD win_result = ERROR_SUCCESS;
|
||||||
|
|
||||||
// Assign the suspended target to the windows job object
|
// Assign the suspended target to the windows job object
|
||||||
|
Reference in New Issue
Block a user