1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle // * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle // * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle // * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle
29*9712c20fSFrederick Mayle #ifdef HAVE_CONFIG_H
30*9712c20fSFrederick Mayle #include <config.h> // Must come first
31*9712c20fSFrederick Mayle #endif
32*9712c20fSFrederick Mayle
33*9712c20fSFrederick Mayle #include <stdlib.h>
34*9712c20fSFrederick Mayle #include <unistd.h>
35*9712c20fSFrederick Mayle
36*9712c20fSFrederick Mayle #include <type_traits>
37*9712c20fSFrederick Mayle #include <string>
38*9712c20fSFrederick Mayle
39*9712c20fSFrederick Mayle #include "breakpad_googletest_includes.h"
40*9712c20fSFrederick Mayle #include "common/using_std_string.h"
41*9712c20fSFrederick Mayle #include "google_breakpad/processor/basic_source_line_resolver.h"
42*9712c20fSFrederick Mayle #include "google_breakpad/processor/minidump_processor.h"
43*9712c20fSFrederick Mayle #include "google_breakpad/processor/process_state.h"
44*9712c20fSFrederick Mayle #ifdef __linux__
45*9712c20fSFrederick Mayle #include "processor/exploitability_linux.h"
46*9712c20fSFrederick Mayle #endif // __linux__
47*9712c20fSFrederick Mayle #include "processor/simple_symbol_supplier.h"
48*9712c20fSFrederick Mayle
49*9712c20fSFrederick Mayle #ifdef __linux__
50*9712c20fSFrederick Mayle namespace google_breakpad {
51*9712c20fSFrederick Mayle class ExploitabilityLinuxTestMinidumpContext : public MinidumpContext {
52*9712c20fSFrederick Mayle public:
ExploitabilityLinuxTestMinidumpContext(const MDRawContextAMD64 & context)53*9712c20fSFrederick Mayle explicit ExploitabilityLinuxTestMinidumpContext(
54*9712c20fSFrederick Mayle const MDRawContextAMD64& context) : MinidumpContext(NULL) {
55*9712c20fSFrederick Mayle valid_ = true;
56*9712c20fSFrederick Mayle SetContextAMD64(new MDRawContextAMD64(context));
57*9712c20fSFrederick Mayle SetContextFlags(MD_CONTEXT_AMD64);
58*9712c20fSFrederick Mayle }
59*9712c20fSFrederick Mayle };
60*9712c20fSFrederick Mayle
61*9712c20fSFrederick Mayle } // namespace google_breakpad
62*9712c20fSFrederick Mayle #endif // __linux__
63*9712c20fSFrederick Mayle
64*9712c20fSFrederick Mayle namespace {
65*9712c20fSFrederick Mayle
66*9712c20fSFrederick Mayle using google_breakpad::BasicSourceLineResolver;
67*9712c20fSFrederick Mayle #ifdef __linux__
68*9712c20fSFrederick Mayle using google_breakpad::ExploitabilityLinuxTestMinidumpContext;
69*9712c20fSFrederick Mayle #endif // __linux__
70*9712c20fSFrederick Mayle using google_breakpad::MinidumpProcessor;
71*9712c20fSFrederick Mayle using google_breakpad::ProcessState;
72*9712c20fSFrederick Mayle using google_breakpad::SimpleSymbolSupplier;
73*9712c20fSFrederick Mayle
TestDataDir()74*9712c20fSFrederick Mayle string TestDataDir() {
75*9712c20fSFrederick Mayle return string(getenv("srcdir") ? getenv("srcdir") : ".") +
76*9712c20fSFrederick Mayle "/src/processor/testdata";
77*9712c20fSFrederick Mayle }
78*9712c20fSFrederick Mayle
79*9712c20fSFrederick Mayle // Find the given dump file in <srcdir>/src/processor/testdata, process it,
80*9712c20fSFrederick Mayle // and get the exploitability rating. Returns EXPLOITABILITY_ERR_PROCESSING
81*9712c20fSFrederick Mayle // if the crash dump can't be processed.
82*9712c20fSFrederick Mayle google_breakpad::ExploitabilityRating
ExploitabilityFor(const string & filename)83*9712c20fSFrederick Mayle ExploitabilityFor(const string& filename) {
84*9712c20fSFrederick Mayle SimpleSymbolSupplier supplier(TestDataDir() + "/symbols");
85*9712c20fSFrederick Mayle BasicSourceLineResolver resolver;
86*9712c20fSFrederick Mayle MinidumpProcessor processor(&supplier, &resolver, true);
87*9712c20fSFrederick Mayle processor.set_enable_objdump_for_exploitability(true);
88*9712c20fSFrederick Mayle ProcessState state;
89*9712c20fSFrederick Mayle
90*9712c20fSFrederick Mayle string minidump_file = TestDataDir() + "/" + filename;
91*9712c20fSFrederick Mayle
92*9712c20fSFrederick Mayle if (processor.Process(minidump_file, &state) !=
93*9712c20fSFrederick Mayle google_breakpad::PROCESS_OK) {
94*9712c20fSFrederick Mayle return google_breakpad::EXPLOITABILITY_ERR_PROCESSING;
95*9712c20fSFrederick Mayle }
96*9712c20fSFrederick Mayle
97*9712c20fSFrederick Mayle return state.exploitability();
98*9712c20fSFrederick Mayle }
99*9712c20fSFrederick Mayle
TEST(ExploitabilityTest,TestWindowsEngine)100*9712c20fSFrederick Mayle TEST(ExploitabilityTest, TestWindowsEngine) {
101*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
102*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av.dmp"));
103*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
104*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av_block_write.dmp"));
105*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
106*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av_clobber_write.dmp"));
107*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
108*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av_conditional.dmp"));
109*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
110*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av_then_jmp.dmp"));
111*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
112*9712c20fSFrederick Mayle ExploitabilityFor("ascii_read_av_xchg_write.dmp"));
113*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
114*9712c20fSFrederick Mayle ExploitabilityFor("ascii_write_av.dmp"));
115*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
116*9712c20fSFrederick Mayle ExploitabilityFor("ascii_write_av_arg_to_call.dmp"));
117*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
118*9712c20fSFrederick Mayle ExploitabilityFor("null_read_av.dmp"));
119*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
120*9712c20fSFrederick Mayle ExploitabilityFor("null_write_av.dmp"));
121*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
122*9712c20fSFrederick Mayle ExploitabilityFor("stack_exhaustion.dmp"));
123*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
124*9712c20fSFrederick Mayle ExploitabilityFor("exec_av_on_stack.dmp"));
125*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_MEDIUM,
126*9712c20fSFrederick Mayle ExploitabilityFor("write_av_non_null.dmp"));
127*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
128*9712c20fSFrederick Mayle ExploitabilityFor("read_av_non_null.dmp"));
129*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
130*9712c20fSFrederick Mayle ExploitabilityFor("read_av_clobber_write.dmp"));
131*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,
132*9712c20fSFrederick Mayle ExploitabilityFor("read_av_conditional.dmp"));
133*9712c20fSFrederick Mayle }
134*9712c20fSFrederick Mayle
TEST(ExploitabilityTest,TestLinuxEngine)135*9712c20fSFrederick Mayle TEST(ExploitabilityTest, TestLinuxEngine) {
136*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
137*9712c20fSFrederick Mayle ExploitabilityFor("linux_null_read_av.dmp"));
138*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
139*9712c20fSFrederick Mayle ExploitabilityFor("linux_overflow.dmp"));
140*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
141*9712c20fSFrederick Mayle ExploitabilityFor("linux_stacksmash.dmp"));
142*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
143*9712c20fSFrederick Mayle ExploitabilityFor("linux_divide_by_zero.dmp"));
144*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
145*9712c20fSFrederick Mayle ExploitabilityFor("linux_null_dereference.dmp"));
146*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
147*9712c20fSFrederick Mayle ExploitabilityFor("linux_jmp_to_0.dmp"));
148*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
149*9712c20fSFrederick Mayle ExploitabilityFor("linux_outside_module.dmp"));
150*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,
151*9712c20fSFrederick Mayle ExploitabilityFor("linux_raise_sigabrt.dmp"));
152*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
153*9712c20fSFrederick Mayle ExploitabilityFor("linux_inside_module_exe_region1.dmp"));
154*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
155*9712c20fSFrederick Mayle ExploitabilityFor("linux_inside_module_exe_region2.dmp"));
156*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
157*9712c20fSFrederick Mayle ExploitabilityFor("linux_stack_pointer_in_stack.dmp"));
158*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
159*9712c20fSFrederick Mayle ExploitabilityFor("linux_stack_pointer_in_stack_alt_name.dmp"));
160*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
161*9712c20fSFrederick Mayle ExploitabilityFor("linux_stack_pointer_in_module.dmp"));
162*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
163*9712c20fSFrederick Mayle ExploitabilityFor("linux_executable_stack.dmp"));
164*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
165*9712c20fSFrederick Mayle ExploitabilityFor("linux_executable_heap.dmp"));
166*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
167*9712c20fSFrederick Mayle ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp"));
168*9712c20fSFrederick Mayle #ifdef __linux__
169*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
170*9712c20fSFrederick Mayle ExploitabilityFor("linux_write_to_nonwritable_module.dmp"));
171*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
172*9712c20fSFrederick Mayle ExploitabilityFor("linux_write_to_nonwritable_region_math.dmp"));
173*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
174*9712c20fSFrederick Mayle ExploitabilityFor("linux_write_to_outside_module.dmp"));
175*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,
176*9712c20fSFrederick Mayle ExploitabilityFor("linux_write_to_outside_module_via_math.dmp"));
177*9712c20fSFrederick Mayle ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING,
178*9712c20fSFrederick Mayle ExploitabilityFor("linux_write_to_under_4k.dmp"));
179*9712c20fSFrederick Mayle #endif // __linux__
180*9712c20fSFrederick Mayle }
181*9712c20fSFrederick Mayle
182*9712c20fSFrederick Mayle } // namespace
183