Index: src/processor/exploitability_linux.cc |
=================================================================== |
--- src/processor/exploitability_linux.cc (revision 1466) |
+++ src/processor/exploitability_linux.cc (working copy) |
@@ -36,6 +36,7 @@ |
#include "processor/exploitability_linux.h" |
+#include "google_breakpad/common/minidump_exception_linux.h" |
#include "google_breakpad/processor/process_state.h" |
#include "google_breakpad/processor/call_stack.h" |
#include "google_breakpad/processor/stack_frame.h" |
@@ -119,11 +120,23 @@ |
return EXPLOITABILITY_ERR_PROCESSING; |
} |
+ // Checking for the instruction pointer in a valid instruction region. |
if (!this->InstructionPointerInCode(instruction_ptr)) { |
return EXPLOITABILITY_HIGH; |
} |
- return EXPLOITABILITY_NONE; |
+ const MDRawExceptionStream *raw_exception_stream = exception->exception(); |
+ if (raw_exception_stream == NULL) { |
+ BPLOG(INFO) << "No raw exception stream."; |
+ return EXPLOITABILITY_ERR_PROCESSING; |
+ } |
+ |
+ // Checking for benign exceptions that caused the crash. |
+ if (this->BenignCrashTrigger(raw_exception_stream)) { |
+ return EXPLOITABILITY_NONE; |
+ } |
+ |
+ return EXPLOITABILITY_INTERESTING; |
} |
bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) { |
@@ -149,4 +162,46 @@ |
minidump_module_list->GetModuleForAddress(instruction_ptr); |
} |
+bool ExploitabilityLinux::BenignCrashTrigger(const MDRawExceptionStream |
+ *raw_exception_stream) { |
+ // Here we check the cause of crash. |
+ // If the exception of the crash is a benign exception, |
+ // it is probably not exploitable. |
+ switch (raw_exception_stream->exception_record.exception_code) { |
+ case MD_EXCEPTION_CODE_LIN_SIGHUP: |
+ case MD_EXCEPTION_CODE_LIN_SIGINT: |
+ case MD_EXCEPTION_CODE_LIN_SIGQUIT: |
+ case MD_EXCEPTION_CODE_LIN_SIGTRAP: |
+ case MD_EXCEPTION_CODE_LIN_SIGABRT: |
+ case MD_EXCEPTION_CODE_LIN_SIGFPE: |
+ case MD_EXCEPTION_CODE_LIN_SIGKILL: |
+ case MD_EXCEPTION_CODE_LIN_SIGUSR1: |
+ case MD_EXCEPTION_CODE_LIN_SIGUSR2: |
+ case MD_EXCEPTION_CODE_LIN_SIGPIPE: |
+ case MD_EXCEPTION_CODE_LIN_SIGALRM: |
+ case MD_EXCEPTION_CODE_LIN_SIGTERM: |
+ case MD_EXCEPTION_CODE_LIN_SIGCHLD: |
+ case MD_EXCEPTION_CODE_LIN_SIGCONT: |
+ case MD_EXCEPTION_CODE_LIN_SIGSTOP: |
+ case MD_EXCEPTION_CODE_LIN_SIGTSTP: |
+ case MD_EXCEPTION_CODE_LIN_SIGTTIN: |
+ case MD_EXCEPTION_CODE_LIN_SIGTTOU: |
+ case MD_EXCEPTION_CODE_LIN_SIGURG: |
+ case MD_EXCEPTION_CODE_LIN_SIGXCPU: |
+ case MD_EXCEPTION_CODE_LIN_SIGXFSZ: |
+ case MD_EXCEPTION_CODE_LIN_SIGVTALRM: |
+ case MD_EXCEPTION_CODE_LIN_SIGPROF: |
+ case MD_EXCEPTION_CODE_LIN_SIGWINCH: |
+ case MD_EXCEPTION_CODE_LIN_SIGIO: |
+ case MD_EXCEPTION_CODE_LIN_SIGPWR: |
+ case MD_EXCEPTION_CODE_LIN_SIGSYS: |
+ case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: |
+ return true; |
+ break; |
+ default: |
+ return false; |
+ break; |
+ } |
+} |
+ |
} // namespace google_breakpad |