OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sandbox/src/policy_engine_params.h" | 5 #include "sandbox/src/policy_engine_params.h" |
6 #include "sandbox/src/policy_engine_processor.h" | 6 #include "sandbox/src/policy_engine_processor.h" |
7 #include "sandbox/src/policy_low_level.h" | 7 #include "sandbox/src/policy_low_level.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 #define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = { | 10 #define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = { |
11 #define POLPARAM(p) sandbox::ParamPickerMake(p), | 11 #define POLPARAM(p) sandbox::ParamPickerMake(p), |
12 #define POLPARAMS_END } | 12 #define POLPARAMS_END } |
13 | 13 |
14 namespace sandbox { | 14 namespace sandbox { |
15 | 15 |
| 16 bool SetupNtdllImports(); |
| 17 |
16 // Testing that we allow opcode generation on valid string patterns. | 18 // Testing that we allow opcode generation on valid string patterns. |
17 TEST(PolicyEngineTest, StringPatternsOK) { | 19 TEST(PolicyEngineTest, StringPatternsOK) { |
| 20 SetupNtdllImports(); |
18 PolicyRule pr(ASK_BROKER); | 21 PolicyRule pr(ASK_BROKER); |
19 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\adobe\\ver??\\", CASE_SENSITIVE)); | 22 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\adobe\\ver??\\", CASE_SENSITIVE)); |
20 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"*.tmp", CASE_SENSITIVE)); | 23 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"*.tmp", CASE_SENSITIVE)); |
21 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*.doc", CASE_SENSITIVE)); | 24 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*.doc", CASE_SENSITIVE)); |
22 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\windows\\*", CASE_SENSITIVE)); | 25 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\windows\\*", CASE_SENSITIVE)); |
23 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"d:\\adobe\\acrobat.exe", | 26 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"d:\\adobe\\acrobat.exe", |
24 CASE_SENSITIVE)); | 27 CASE_SENSITIVE)); |
25 } | 28 } |
26 | 29 |
27 // Testing that we signal invalid string patterns. | 30 // Testing that we signal invalid string patterns. |
28 TEST(PolicyEngineTest, StringPatternsBAD) { | 31 TEST(PolicyEngineTest, StringPatternsBAD) { |
| 32 SetupNtdllImports(); |
29 PolicyRule pr(ASK_BROKER); | 33 PolicyRule pr(ASK_BROKER); |
30 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"one**two", CASE_SENSITIVE)); | 34 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"one**two", CASE_SENSITIVE)); |
31 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"**three", CASE_SENSITIVE)); | 35 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"**three", CASE_SENSITIVE)); |
32 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"five?six*?seven", CASE_SENSITIVE)); | 36 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"five?six*?seven", CASE_SENSITIVE)); |
33 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"eight?*nine", CASE_SENSITIVE)); | 37 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"eight?*nine", CASE_SENSITIVE)); |
34 } | 38 } |
35 | 39 |
36 // Helper function to allocate space (on the heap) for policy. | 40 // Helper function to allocate space (on the heap) for policy. |
37 PolicyGlobal* MakePolicyMemory() { | 41 PolicyGlobal* MakePolicyMemory() { |
38 const size_t kTotalPolicySz = 4096*8; | 42 const size_t kTotalPolicySz = 4096*8; |
39 char* mem = new char[kTotalPolicySz]; | 43 char* mem = new char[kTotalPolicySz]; |
40 memset(mem, 0, kTotalPolicySz); | 44 memset(mem, 0, kTotalPolicySz); |
41 PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem); | 45 PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem); |
42 policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal); | 46 policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal); |
43 return policy; | 47 return policy; |
44 } | 48 } |
45 | 49 |
46 // The simplest test using LowLevelPolicy it should test a single opcode which | 50 // The simplest test using LowLevelPolicy it should test a single opcode which |
47 // does a exact string comparison. | 51 // does a exact string comparison. |
48 TEST(PolicyEngineTest, SimpleStrMatch) { | 52 TEST(PolicyEngineTest, SimpleStrMatch) { |
| 53 SetupNtdllImports(); |
49 PolicyRule pr(ASK_BROKER); | 54 PolicyRule pr(ASK_BROKER); |
50 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt", | 55 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt", |
51 CASE_INSENSITIVE)); | 56 CASE_INSENSITIVE)); |
52 | 57 |
53 PolicyGlobal* policy = MakePolicyMemory(); | 58 PolicyGlobal* policy = MakePolicyMemory(); |
54 const uint32 kFakeService = 2; | 59 const uint32 kFakeService = 2; |
55 | 60 |
56 LowLevelPolicy policyGen(policy); | 61 LowLevelPolicy policyGen(policy); |
57 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 62 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
58 EXPECT_TRUE(policyGen.Done()); | 63 EXPECT_TRUE(policyGen.Done()); |
(...skipping 12 matching lines...) Expand all Loading... |
71 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); | 76 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); |
72 | 77 |
73 filename = L"Z:\\Directory\\domo.txt.tmp"; | 78 filename = L"Z:\\Directory\\domo.txt.tmp"; |
74 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 79 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
75 EXPECT_EQ(NO_POLICY_MATCH, result); | 80 EXPECT_EQ(NO_POLICY_MATCH, result); |
76 | 81 |
77 delete [] reinterpret_cast<char*>(policy); | 82 delete [] reinterpret_cast<char*>(policy); |
78 } | 83 } |
79 | 84 |
80 TEST(PolicyEngineTest, SimpleIfNotStrMatch) { | 85 TEST(PolicyEngineTest, SimpleIfNotStrMatch) { |
| 86 SetupNtdllImports(); |
81 PolicyRule pr(ASK_BROKER); | 87 PolicyRule pr(ASK_BROKER); |
82 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\", | 88 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\", |
83 CASE_SENSITIVE)); | 89 CASE_SENSITIVE)); |
84 | 90 |
85 PolicyGlobal* policy = MakePolicyMemory(); | 91 PolicyGlobal* policy = MakePolicyMemory(); |
86 const uint32 kFakeService = 2; | 92 const uint32 kFakeService = 2; |
87 LowLevelPolicy policyGen(policy); | 93 LowLevelPolicy policyGen(policy); |
88 | 94 |
89 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 95 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
90 EXPECT_TRUE(policyGen.Done()); | 96 EXPECT_TRUE(policyGen.Done()); |
(...skipping 17 matching lines...) Expand all Loading... |
108 | 114 |
109 filename = L"c:\\Microsoft\\domo.txt"; | 115 filename = L"c:\\Microsoft\\domo.txt"; |
110 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 116 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
111 EXPECT_EQ(POLICY_MATCH, result); | 117 EXPECT_EQ(POLICY_MATCH, result); |
112 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); | 118 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); |
113 | 119 |
114 delete [] reinterpret_cast<char*>(policy); | 120 delete [] reinterpret_cast<char*>(policy); |
115 } | 121 } |
116 | 122 |
117 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) { | 123 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) { |
| 124 SetupNtdllImports(); |
118 PolicyRule pr(ASK_BROKER); | 125 PolicyRule pr(ASK_BROKER); |
119 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", | 126 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", |
120 CASE_SENSITIVE)); | 127 CASE_SENSITIVE)); |
121 | 128 |
122 PolicyGlobal* policy = MakePolicyMemory(); | 129 PolicyGlobal* policy = MakePolicyMemory(); |
123 const uint32 kFakeService = 3; | 130 const uint32 kFakeService = 3; |
124 LowLevelPolicy policyGen(policy); | 131 LowLevelPolicy policyGen(policy); |
125 | 132 |
126 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 133 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
127 EXPECT_TRUE(policyGen.Done()); | 134 EXPECT_TRUE(policyGen.Done()); |
(...skipping 12 matching lines...) Expand all Loading... |
140 | 147 |
141 filename = L"c:\\MicroNerd\\domo.txt"; | 148 filename = L"c:\\MicroNerd\\domo.txt"; |
142 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 149 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
143 EXPECT_EQ(POLICY_MATCH, result); | 150 EXPECT_EQ(POLICY_MATCH, result); |
144 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); | 151 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); |
145 | 152 |
146 delete [] reinterpret_cast<char*>(policy); | 153 delete [] reinterpret_cast<char*>(policy); |
147 } | 154 } |
148 | 155 |
149 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) { | 156 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) { |
| 157 SetupNtdllImports(); |
150 PolicyRule pr(ASK_BROKER); | 158 PolicyRule pr(ASK_BROKER); |
151 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt", | 159 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt", |
152 CASE_SENSITIVE)); | 160 CASE_SENSITIVE)); |
153 | 161 |
154 PolicyGlobal* policy = MakePolicyMemory(); | 162 PolicyGlobal* policy = MakePolicyMemory(); |
155 const uint32 kFakeService = 3; | 163 const uint32 kFakeService = 3; |
156 LowLevelPolicy policyGen(policy); | 164 LowLevelPolicy policyGen(policy); |
157 | 165 |
158 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 166 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
159 EXPECT_TRUE(policyGen.Done()); | 167 EXPECT_TRUE(policyGen.Done()); |
(...skipping 17 matching lines...) Expand all Loading... |
177 | 185 |
178 filename = L"c:\\Microsoft\\domo.bmp"; | 186 filename = L"c:\\Microsoft\\domo.bmp"; |
179 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 187 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
180 EXPECT_EQ(POLICY_MATCH, result); | 188 EXPECT_EQ(POLICY_MATCH, result); |
181 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); | 189 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction()); |
182 | 190 |
183 delete [] reinterpret_cast<char*>(policy); | 191 delete [] reinterpret_cast<char*>(policy); |
184 } | 192 } |
185 | 193 |
186 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) { | 194 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) { |
| 195 SetupNtdllImports(); |
187 PolicyRule pr(ASK_BROKER); | 196 PolicyRule pr(ASK_BROKER); |
188 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", | 197 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*", |
189 CASE_SENSITIVE)); | 198 CASE_SENSITIVE)); |
190 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); | 199 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); |
191 | 200 |
192 PolicyGlobal* policy = MakePolicyMemory(); | 201 PolicyGlobal* policy = MakePolicyMemory(); |
193 const uint32 kFakeService = 3; | 202 const uint32 kFakeService = 3; |
194 LowLevelPolicy policyGen(policy); | 203 LowLevelPolicy policyGen(policy); |
195 | 204 |
196 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); | 205 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); |
(...skipping 27 matching lines...) Expand all Loading... |
224 | 233 |
225 filename = L"c:\\Micronesia\\domo.txt"; | 234 filename = L"c:\\Micronesia\\domo.txt"; |
226 access = 42; | 235 access = 42; |
227 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 236 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
228 EXPECT_EQ(NO_POLICY_MATCH, result); | 237 EXPECT_EQ(NO_POLICY_MATCH, result); |
229 | 238 |
230 delete [] reinterpret_cast<char*>(policy); | 239 delete [] reinterpret_cast<char*>(policy); |
231 } | 240 } |
232 | 241 |
233 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) { | 242 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) { |
| 243 SetupNtdllImports(); |
234 PolicyRule pr(ASK_BROKER); | 244 PolicyRule pr(ASK_BROKER); |
235 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); | 245 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL)); |
236 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt", | 246 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt", |
237 CASE_SENSITIVE)); | 247 CASE_SENSITIVE)); |
238 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL)); | 248 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL)); |
239 | 249 |
240 PolicyGlobal* policy = MakePolicyMemory(); | 250 PolicyGlobal* policy = MakePolicyMemory(); |
241 const uint32 kFakeService = 3; | 251 const uint32 kFakeService = 3; |
242 LowLevelPolicy policyGen(policy); | 252 LowLevelPolicy policyGen(policy); |
243 | 253 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 sharing = 0; | 306 sharing = 0; |
297 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 307 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
298 EXPECT_EQ(NO_POLICY_MATCH, result); | 308 EXPECT_EQ(NO_POLICY_MATCH, result); |
299 | 309 |
300 delete [] reinterpret_cast<char*>(policy); | 310 delete [] reinterpret_cast<char*>(policy); |
301 } | 311 } |
302 | 312 |
303 // Testing one single rule in one single service. The service is made to | 313 // Testing one single rule in one single service. The service is made to |
304 // resemble NtCreateFile. | 314 // resemble NtCreateFile. |
305 TEST(PolicyEngineTest, OneRuleTest) { | 315 TEST(PolicyEngineTest, OneRuleTest) { |
| 316 SetupNtdllImports(); |
306 PolicyRule pr(ASK_BROKER); | 317 PolicyRule pr(ASK_BROKER); |
307 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt", | 318 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt", |
308 CASE_SENSITIVE)); | 319 CASE_SENSITIVE)); |
309 EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL)); | 320 EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL)); |
310 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); | 321 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); |
311 | 322 |
312 PolicyGlobal* policy = MakePolicyMemory(); | 323 PolicyGlobal* policy = MakePolicyMemory(); |
313 | 324 |
314 const uint32 kNtFakeCreateFile = 7; | 325 const uint32 kNtFakeCreateFile = 7; |
315 | 326 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 | 377 |
367 filename = L"c:\\Microsoft\\1.ttt"; | 378 filename = L"c:\\Microsoft\\1.ttt"; |
368 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); | 379 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); |
369 EXPECT_EQ(NO_POLICY_MATCH, result); | 380 EXPECT_EQ(NO_POLICY_MATCH, result); |
370 | 381 |
371 delete [] reinterpret_cast<char*>(policy); | 382 delete [] reinterpret_cast<char*>(policy); |
372 } | 383 } |
373 | 384 |
374 // Testing 3 rules in 3 services. Two of the services resemble File services. | 385 // Testing 3 rules in 3 services. Two of the services resemble File services. |
375 TEST(PolicyEngineTest, ThreeRulesTest) { | 386 TEST(PolicyEngineTest, ThreeRulesTest) { |
| 387 SetupNtdllImports(); |
376 PolicyRule pr_pipe(FAKE_SUCCESS); | 388 PolicyRule pr_pipe(FAKE_SUCCESS); |
377 EXPECT_TRUE(pr_pipe.AddStringMatch(IF, 0, L"\\\\/?/?\\Pipe\\Chrome.*", | 389 EXPECT_TRUE(pr_pipe.AddStringMatch(IF, 0, L"\\\\/?/?\\Pipe\\Chrome.*", |
378 CASE_INSENSITIVE)); | 390 CASE_INSENSITIVE)); |
379 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 1, OPEN_EXISTING, EQUAL)); | 391 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 1, OPEN_EXISTING, EQUAL)); |
380 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); | 392 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL)); |
381 | 393 |
382 size_t opc1 = pr_pipe.GetOpcodeCount(); | 394 size_t opc1 = pr_pipe.GetOpcodeCount(); |
383 EXPECT_EQ(3, opc1); | 395 EXPECT_EQ(3, opc1); |
384 | 396 |
385 PolicyRule pr_dump(ASK_BROKER); | 397 PolicyRule pr_dump(ASK_BROKER); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 result = eval_None.Evaluate(kShortEval, params, _countof(params)); | 566 result = eval_None.Evaluate(kShortEval, params, _countof(params)); |
555 EXPECT_EQ(NO_POLICY_MATCH, result); | 567 EXPECT_EQ(NO_POLICY_MATCH, result); |
556 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params)); | 568 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params)); |
557 EXPECT_EQ(POLICY_MATCH, result); | 569 EXPECT_EQ(POLICY_MATCH, result); |
558 EXPECT_EQ(FAKE_SUCCESS, eval_OpenFile.GetAction()); | 570 EXPECT_EQ(FAKE_SUCCESS, eval_OpenFile.GetAction()); |
559 | 571 |
560 delete [] reinterpret_cast<char*>(policy); | 572 delete [] reinterpret_cast<char*>(policy); |
561 } | 573 } |
562 | 574 |
563 } // namespace sandbox | 575 } // namespace sandbox |
OLD | NEW |