Index: sandbox/src/target_process.cc |
=================================================================== |
--- sandbox/src/target_process.cc (revision 123489) |
+++ sandbox/src/target_process.cc (working copy) |
@@ -39,8 +39,29 @@ |
} |
} |
+// 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 { |
SANDBOX_INTERCEPT HANDLE g_shared_section; |
@@ -152,6 +173,8 @@ |
return ::GetLastError(); |
} |
+ PoisonLowerAddressRange(process_info.hProcess); |
+ |
DWORD win_result = ERROR_SUCCESS; |
// Assign the suspended target to the windows job object |