diff options
Diffstat (limited to 'src/processor/exploitability_linux.cc')
-rw-r--r-- | src/processor/exploitability_linux.cc | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/processor/exploitability_linux.cc b/src/processor/exploitability_linux.cc index 0fae727c..46cad318 100644 --- a/src/processor/exploitability_linux.cc +++ b/src/processor/exploitability_linux.cc @@ -124,7 +124,8 @@ ExploitabilityRating ExploitabilityLinux::CheckPlatformExploitability() { // Checking for the instruction pointer in a valid instruction region. if (!this->InstructionPointerInCode(instruction_ptr) || - this->StackPointerOffStack(stack_ptr)) { + this->StackPointerOffStack(stack_ptr) || + this->ExecutableStackOrHeap()) { return EXPLOITABILITY_HIGH; } @@ -149,6 +150,24 @@ bool ExploitabilityLinux::StackPointerOffStack(uint64_t stack_ptr) { linux_maps->GetPathname().compare("[stack]")); } +bool ExploitabilityLinux::ExecutableStackOrHeap() { + MinidumpLinuxMapsList *linux_maps_list = dump_->GetLinuxMapsList(); + if (linux_maps_list) { + for (size_t i = 0; i < linux_maps_list->get_maps_count(); i++) { + const MinidumpLinuxMaps *linux_maps = + linux_maps_list->GetLinuxMapsAtIndex(i); + // Check for executable stack or heap for each mapping. + if (linux_maps && + (!linux_maps->GetPathname().compare("[stack]") || + !linux_maps->GetPathname().compare("[heap]")) && + linux_maps->IsExecutable()) { + return true; + } + } + } + return false; +} + bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) { // Get Linux memory mapping from /proc/self/maps. Checking whether the // region the instruction pointer is in has executable permission can tell |