security/sandbox/win/src/policy_low_level_unittest.cc

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
michael@0 2 // Use of this source code is governed by a BSD-style license that can be
michael@0 3 // found in the LICENSE file.
michael@0 4
michael@0 5 #include "sandbox/win/src/policy_engine_params.h"
michael@0 6 #include "sandbox/win/src/policy_engine_processor.h"
michael@0 7 #include "sandbox/win/src/policy_low_level.h"
michael@0 8 #include "testing/gtest/include/gtest/gtest.h"
michael@0 9
michael@0 10 #define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = {
michael@0 11 #define POLPARAM(p) sandbox::ParamPickerMake(p),
michael@0 12 #define POLPARAMS_END }
michael@0 13
michael@0 14 namespace sandbox {
michael@0 15
michael@0 16 bool SetupNtdllImports();
michael@0 17
michael@0 18 // Testing that we allow opcode generation on valid string patterns.
michael@0 19 TEST(PolicyEngineTest, StringPatternsOK) {
michael@0 20 SetupNtdllImports();
michael@0 21 PolicyRule pr(ASK_BROKER);
michael@0 22 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\adobe\\ver??\\", CASE_SENSITIVE));
michael@0 23 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"*.tmp", CASE_SENSITIVE));
michael@0 24 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*.doc", CASE_SENSITIVE));
michael@0 25 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\windows\\*", CASE_SENSITIVE));
michael@0 26 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"d:\\adobe\\acrobat.exe",
michael@0 27 CASE_SENSITIVE));
michael@0 28 }
michael@0 29
michael@0 30 // Testing that we signal invalid string patterns.
michael@0 31 TEST(PolicyEngineTest, StringPatternsBAD) {
michael@0 32 SetupNtdllImports();
michael@0 33 PolicyRule pr(ASK_BROKER);
michael@0 34 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"one**two", CASE_SENSITIVE));
michael@0 35 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"**three", CASE_SENSITIVE));
michael@0 36 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"five?six*?seven", CASE_SENSITIVE));
michael@0 37 EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"eight?*nine", CASE_SENSITIVE));
michael@0 38 }
michael@0 39
michael@0 40 // Helper function to allocate space (on the heap) for policy.
michael@0 41 PolicyGlobal* MakePolicyMemory() {
michael@0 42 const size_t kTotalPolicySz = 4096*8;
michael@0 43 char* mem = new char[kTotalPolicySz];
michael@0 44 memset(mem, 0, kTotalPolicySz);
michael@0 45 PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem);
michael@0 46 policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal);
michael@0 47 return policy;
michael@0 48 }
michael@0 49
michael@0 50 // The simplest test using LowLevelPolicy it should test a single opcode which
michael@0 51 // does a exact string comparison.
michael@0 52 TEST(PolicyEngineTest, SimpleStrMatch) {
michael@0 53 SetupNtdllImports();
michael@0 54 PolicyRule pr(ASK_BROKER);
michael@0 55 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt",
michael@0 56 CASE_INSENSITIVE));
michael@0 57
michael@0 58 PolicyGlobal* policy = MakePolicyMemory();
michael@0 59 const uint32 kFakeService = 2;
michael@0 60
michael@0 61 LowLevelPolicy policyGen(policy);
michael@0 62 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 63 EXPECT_TRUE(policyGen.Done());
michael@0 64
michael@0 65 wchar_t* filename = L"Z:\\Directory\\domo.txt";
michael@0 66
michael@0 67 POLPARAMS_BEGIN(eval_params)
michael@0 68 POLPARAM(filename) // Argument 0
michael@0 69 POLPARAMS_END;
michael@0 70
michael@0 71 PolicyResult result;
michael@0 72 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 73
michael@0 74 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 75 EXPECT_EQ(POLICY_MATCH, result);
michael@0 76 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 77
michael@0 78 filename = L"Z:\\Directory\\domo.txt.tmp";
michael@0 79 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 80 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 81
michael@0 82 delete [] reinterpret_cast<char*>(policy);
michael@0 83 }
michael@0 84
michael@0 85 TEST(PolicyEngineTest, SimpleIfNotStrMatch) {
michael@0 86 SetupNtdllImports();
michael@0 87 PolicyRule pr(ASK_BROKER);
michael@0 88 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\",
michael@0 89 CASE_SENSITIVE));
michael@0 90
michael@0 91 PolicyGlobal* policy = MakePolicyMemory();
michael@0 92 const uint32 kFakeService = 2;
michael@0 93 LowLevelPolicy policyGen(policy);
michael@0 94
michael@0 95 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 96 EXPECT_TRUE(policyGen.Done());
michael@0 97
michael@0 98 wchar_t* filename = NULL;
michael@0 99 POLPARAMS_BEGIN(eval_params)
michael@0 100 POLPARAM(filename) // Argument 0
michael@0 101 POLPARAMS_END;
michael@0 102
michael@0 103 PolicyResult result;
michael@0 104 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 105
michael@0 106 filename = L"c:\\Microsoft\\";
michael@0 107 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 108 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 109
michael@0 110 filename = L"c:\\MicroNerd\\";
michael@0 111 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 112 EXPECT_EQ(POLICY_MATCH, result);
michael@0 113 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 114
michael@0 115 filename = L"c:\\Microsoft\\domo.txt";
michael@0 116 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 117 EXPECT_EQ(POLICY_MATCH, result);
michael@0 118 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 119
michael@0 120 delete [] reinterpret_cast<char*>(policy);
michael@0 121 }
michael@0 122
michael@0 123 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) {
michael@0 124 SetupNtdllImports();
michael@0 125 PolicyRule pr(ASK_BROKER);
michael@0 126 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*",
michael@0 127 CASE_SENSITIVE));
michael@0 128
michael@0 129 PolicyGlobal* policy = MakePolicyMemory();
michael@0 130 const uint32 kFakeService = 3;
michael@0 131 LowLevelPolicy policyGen(policy);
michael@0 132
michael@0 133 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 134 EXPECT_TRUE(policyGen.Done());
michael@0 135
michael@0 136 wchar_t* filename = NULL;
michael@0 137 POLPARAMS_BEGIN(eval_params)
michael@0 138 POLPARAM(filename) // Argument 0
michael@0 139 POLPARAMS_END;
michael@0 140
michael@0 141 PolicyResult result;
michael@0 142 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 143
michael@0 144 filename = L"c:\\Microsoft\\domo.txt";
michael@0 145 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 146 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 147
michael@0 148 filename = L"c:\\MicroNerd\\domo.txt";
michael@0 149 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 150 EXPECT_EQ(POLICY_MATCH, result);
michael@0 151 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 152
michael@0 153 delete [] reinterpret_cast<char*>(policy);
michael@0 154 }
michael@0 155
michael@0 156 TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) {
michael@0 157 SetupNtdllImports();
michael@0 158 PolicyRule pr(ASK_BROKER);
michael@0 159 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt",
michael@0 160 CASE_SENSITIVE));
michael@0 161
michael@0 162 PolicyGlobal* policy = MakePolicyMemory();
michael@0 163 const uint32 kFakeService = 3;
michael@0 164 LowLevelPolicy policyGen(policy);
michael@0 165
michael@0 166 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 167 EXPECT_TRUE(policyGen.Done());
michael@0 168
michael@0 169 wchar_t* filename = NULL;
michael@0 170 POLPARAMS_BEGIN(eval_params)
michael@0 171 POLPARAM(filename) // Argument 0
michael@0 172 POLPARAMS_END;
michael@0 173
michael@0 174 PolicyResult result;
michael@0 175 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 176
michael@0 177 filename = L"c:\\Microsoft\\domo.txt";
michael@0 178 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 179 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 180
michael@0 181 filename = L"c:\\MicroNerd\\domo.txt";
michael@0 182 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 183 EXPECT_EQ(POLICY_MATCH, result);
michael@0 184 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 185
michael@0 186 filename = L"c:\\Microsoft\\domo.bmp";
michael@0 187 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 188 EXPECT_EQ(POLICY_MATCH, result);
michael@0 189 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 190
michael@0 191 delete [] reinterpret_cast<char*>(policy);
michael@0 192 }
michael@0 193
michael@0 194 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) {
michael@0 195 SetupNtdllImports();
michael@0 196 PolicyRule pr(ASK_BROKER);
michael@0 197 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*",
michael@0 198 CASE_SENSITIVE));
michael@0 199 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL));
michael@0 200
michael@0 201 PolicyGlobal* policy = MakePolicyMemory();
michael@0 202 const uint32 kFakeService = 3;
michael@0 203 LowLevelPolicy policyGen(policy);
michael@0 204
michael@0 205 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 206 EXPECT_TRUE(policyGen.Done());
michael@0 207
michael@0 208 wchar_t* filename = NULL;
michael@0 209 unsigned long access = 0;
michael@0 210 POLPARAMS_BEGIN(eval_params)
michael@0 211 POLPARAM(filename) // Argument 0
michael@0 212 POLPARAM(access) // Argument 1
michael@0 213 POLPARAMS_END;
michael@0 214
michael@0 215 PolicyResult result;
michael@0 216 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 217
michael@0 218 filename = L"c:\\Microsoft\\domo.txt";
michael@0 219 access = 24;
michael@0 220 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 221 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 222
michael@0 223 filename = L"c:\\Microsoft\\domo.txt";
michael@0 224 access = 42;
michael@0 225 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 226 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 227
michael@0 228 filename = L"c:\\MicroNerd\\domo.txt";
michael@0 229 access = 24;
michael@0 230 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 231 EXPECT_EQ(POLICY_MATCH, result);
michael@0 232 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 233
michael@0 234 filename = L"c:\\Micronesia\\domo.txt";
michael@0 235 access = 42;
michael@0 236 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 237 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 238
michael@0 239 delete [] reinterpret_cast<char*>(policy);
michael@0 240 }
michael@0 241
michael@0 242 TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) {
michael@0 243 SetupNtdllImports();
michael@0 244 PolicyRule pr(ASK_BROKER);
michael@0 245 EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL));
michael@0 246 EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt",
michael@0 247 CASE_SENSITIVE));
michael@0 248 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL));
michael@0 249
michael@0 250 PolicyGlobal* policy = MakePolicyMemory();
michael@0 251 const uint32 kFakeService = 3;
michael@0 252 LowLevelPolicy policyGen(policy);
michael@0 253
michael@0 254 EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
michael@0 255 EXPECT_TRUE(policyGen.Done());
michael@0 256
michael@0 257 wchar_t* filename = NULL;
michael@0 258 unsigned long access = 0;
michael@0 259 unsigned long sharing = 66;
michael@0 260
michael@0 261 POLPARAMS_BEGIN(eval_params)
michael@0 262 POLPARAM(filename) // Argument 0
michael@0 263 POLPARAM(access) // Argument 1
michael@0 264 POLPARAM(sharing) // Argument 2
michael@0 265 POLPARAMS_END;
michael@0 266
michael@0 267 PolicyResult result;
michael@0 268 PolicyProcessor pol_ev(policy->entry[kFakeService]);
michael@0 269
michael@0 270 filename = L"c:\\GoogleV2\\domo.txt";
michael@0 271 access = 24;
michael@0 272 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 273 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 274
michael@0 275 filename = L"c:\\GoogleV2\\domo.bmp";
michael@0 276 access = 24;
michael@0 277 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 278 EXPECT_EQ(POLICY_MATCH, result);
michael@0 279 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 280
michael@0 281 filename = L"c:\\GoogleV23\\domo.txt";
michael@0 282 access = 24;
michael@0 283 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 284 EXPECT_EQ(POLICY_MATCH, result);
michael@0 285 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 286
michael@0 287
michael@0 288 filename = L"c:\\GoogleV2\\domo.txt";
michael@0 289 access = 42;
michael@0 290 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 291 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 292
michael@0 293 filename = L"c:\\Google\\domo.txt";
michael@0 294 access = 24;
michael@0 295 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 296 EXPECT_EQ(POLICY_MATCH, result);
michael@0 297 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 298
michael@0 299 filename = L"c:\\Micronesia\\domo.txt";
michael@0 300 access = 42;
michael@0 301 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 302 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 303
michael@0 304 filename = L"c:\\GoogleV2\\domo.bmp";
michael@0 305 access = 24;
michael@0 306 sharing = 0;
michael@0 307 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 308 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 309
michael@0 310 delete [] reinterpret_cast<char*>(policy);
michael@0 311 }
michael@0 312
michael@0 313 // Testing one single rule in one single service. The service is made to
michael@0 314 // resemble NtCreateFile.
michael@0 315 TEST(PolicyEngineTest, OneRuleTest) {
michael@0 316 SetupNtdllImports();
michael@0 317 PolicyRule pr(ASK_BROKER);
michael@0 318 EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt",
michael@0 319 CASE_SENSITIVE));
michael@0 320 EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL));
michael@0 321 EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
michael@0 322
michael@0 323 PolicyGlobal* policy = MakePolicyMemory();
michael@0 324
michael@0 325 const uint32 kNtFakeCreateFile = 7;
michael@0 326
michael@0 327 LowLevelPolicy policyGen(policy);
michael@0 328 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr));
michael@0 329 EXPECT_TRUE(policyGen.Done());
michael@0 330
michael@0 331 wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
michael@0 332 unsigned long creation_mode = OPEN_EXISTING;
michael@0 333 unsigned long flags = FILE_ATTRIBUTE_NORMAL;
michael@0 334 void* security_descriptor = NULL;
michael@0 335
michael@0 336 POLPARAMS_BEGIN(eval_params)
michael@0 337 POLPARAM(filename) // Argument 0
michael@0 338 POLPARAM(creation_mode) // Argument 1
michael@0 339 POLPARAM(flags) // Argument 2
michael@0 340 POLPARAM(security_descriptor)
michael@0 341 POLPARAMS_END;
michael@0 342
michael@0 343 PolicyResult result;
michael@0 344 PolicyProcessor pol_ev(policy->entry[kNtFakeCreateFile]);
michael@0 345
michael@0 346 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 347 EXPECT_EQ(POLICY_MATCH, result);
michael@0 348 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 349
michael@0 350 creation_mode = CREATE_ALWAYS;
michael@0 351 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 352 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 353
michael@0 354 creation_mode = OPEN_EXISTING;
michael@0 355 filename = L"c:\\Other\\Path\\Microsoft\\Another file.txt";
michael@0 356 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 357 EXPECT_EQ(POLICY_MATCH, result);
michael@0 358 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 359
michael@0 360 filename = L"c:\\Other\\Path\\Microsoft\\Another file.txt.tmp";
michael@0 361 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 362 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 363
michael@0 364 flags = FILE_ATTRIBUTE_DEVICE;
michael@0 365 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 366 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 367
michael@0 368 filename = L"c:\\Other\\Macrosoft\\Another file.txt";
michael@0 369 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 370 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 371
michael@0 372 filename = L"c:\\Microsoft\\1.txt";
michael@0 373 flags = FILE_ATTRIBUTE_NORMAL;
michael@0 374 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 375 EXPECT_EQ(POLICY_MATCH, result);
michael@0 376 EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
michael@0 377
michael@0 378 filename = L"c:\\Microsoft\\1.ttt";
michael@0 379 result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 380 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 381
michael@0 382 delete [] reinterpret_cast<char*>(policy);
michael@0 383 }
michael@0 384
michael@0 385 // Testing 3 rules in 3 services. Two of the services resemble File services.
michael@0 386 TEST(PolicyEngineTest, ThreeRulesTest) {
michael@0 387 SetupNtdllImports();
michael@0 388 PolicyRule pr_pipe(FAKE_SUCCESS);
michael@0 389 EXPECT_TRUE(pr_pipe.AddStringMatch(IF, 0, L"\\\\/?/?\\Pipe\\Chrome.*",
michael@0 390 CASE_INSENSITIVE));
michael@0 391 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 1, OPEN_EXISTING, EQUAL));
michael@0 392 EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
michael@0 393
michael@0 394 size_t opc1 = pr_pipe.GetOpcodeCount();
michael@0 395 EXPECT_EQ(3, opc1);
michael@0 396
michael@0 397 PolicyRule pr_dump(ASK_BROKER);
michael@0 398 EXPECT_TRUE(pr_dump.AddStringMatch(IF, 0, L"\\\\/?/?\\*\\Crash Reports\\*",
michael@0 399 CASE_INSENSITIVE));
michael@0 400 EXPECT_TRUE(pr_dump.AddNumberMatch(IF, 1, CREATE_ALWAYS, EQUAL));
michael@0 401 EXPECT_TRUE(pr_dump.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
michael@0 402
michael@0 403 size_t opc2 = pr_dump.GetOpcodeCount();
michael@0 404 EXPECT_EQ(4, opc2);
michael@0 405
michael@0 406 PolicyRule pr_winexe(SIGNAL_ALARM);
michael@0 407 EXPECT_TRUE(pr_winexe.AddStringMatch(IF, 0, L"\\\\/?/?\\C:\\Windows\\*.exe",
michael@0 408 CASE_INSENSITIVE));
michael@0 409 EXPECT_TRUE(pr_winexe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
michael@0 410
michael@0 411 size_t opc3 = pr_winexe.GetOpcodeCount();
michael@0 412 EXPECT_EQ(3, opc3);
michael@0 413
michael@0 414 PolicyRule pr_adobe(GIVE_CACHED);
michael@0 415 EXPECT_TRUE(pr_adobe.AddStringMatch(IF, 0, L"c:\\adobe\\ver?.?\\",
michael@0 416 CASE_SENSITIVE));
michael@0 417 EXPECT_TRUE(pr_adobe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
michael@0 418
michael@0 419 size_t opc4 = pr_adobe.GetOpcodeCount();
michael@0 420 EXPECT_EQ(4, opc4);
michael@0 421
michael@0 422 PolicyRule pr_none(GIVE_FIRST);
michael@0 423 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_READONLY, AND));
michael@0 424 EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_SYSTEM, AND));
michael@0 425
michael@0 426 size_t opc5 = pr_none.GetOpcodeCount();
michael@0 427 EXPECT_EQ(2, opc5);
michael@0 428
michael@0 429 PolicyGlobal* policy = MakePolicyMemory();
michael@0 430
michael@0 431 const uint32 kNtFakeNone = 4;
michael@0 432 const uint32 kNtFakeCreateFile = 5;
michael@0 433 const uint32 kNtFakeOpenFile = 6;
michael@0 434
michael@0 435 LowLevelPolicy policyGen(policy);
michael@0 436 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_pipe));
michael@0 437 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_dump));
michael@0 438 EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_winexe));
michael@0 439
michael@0 440 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_adobe));
michael@0 441 EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_pipe));
michael@0 442
michael@0 443 EXPECT_TRUE(policyGen.AddRule(kNtFakeNone, &pr_none));
michael@0 444
michael@0 445 EXPECT_TRUE(policyGen.Done());
michael@0 446
michael@0 447 // Inspect the policy structure manually.
michael@0 448 EXPECT_TRUE(NULL == policy->entry[0]);
michael@0 449 EXPECT_TRUE(NULL == policy->entry[1]);
michael@0 450 EXPECT_TRUE(NULL == policy->entry[2]);
michael@0 451 EXPECT_TRUE(NULL == policy->entry[3]);
michael@0 452 EXPECT_TRUE(NULL != policy->entry[4]); // kNtFakeNone.
michael@0 453 EXPECT_TRUE(NULL != policy->entry[5]); // kNtFakeCreateFile.
michael@0 454 EXPECT_TRUE(NULL != policy->entry[6]); // kNtFakeOpenFile.
michael@0 455 EXPECT_TRUE(NULL == policy->entry[7]);
michael@0 456
michael@0 457 // The total per service opcode counts now must take in account one
michael@0 458 // extra opcode (action opcode) per rule.
michael@0 459 ++opc1;
michael@0 460 ++opc2;
michael@0 461 ++opc3;
michael@0 462 ++opc4;
michael@0 463 ++opc5;
michael@0 464
michael@0 465 size_t tc1 = policy->entry[kNtFakeNone]->opcode_count;
michael@0 466 size_t tc2 = policy->entry[kNtFakeCreateFile]->opcode_count;
michael@0 467 size_t tc3 = policy->entry[kNtFakeOpenFile]->opcode_count;
michael@0 468
michael@0 469 EXPECT_EQ(opc5, tc1);
michael@0 470 EXPECT_EQ((opc1 + opc2 + opc3), tc2);
michael@0 471 EXPECT_EQ((opc1 + opc4), tc3);
michael@0 472
michael@0 473 // Check the type of the first and last opcode of each service.
michael@0 474
michael@0 475 EXPECT_EQ(OP_ULONG_AND_MATCH, policy->entry[kNtFakeNone]->opcodes[0].GetID());
michael@0 476 EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeNone]->opcodes[tc1-1].GetID());
michael@0 477 EXPECT_EQ(OP_WSTRING_MATCH,
michael@0 478 policy->entry[kNtFakeCreateFile]->opcodes[0].GetID());
michael@0 479 EXPECT_EQ(OP_ACTION,
michael@0 480 policy->entry[kNtFakeCreateFile]->opcodes[tc2-1].GetID());
michael@0 481 EXPECT_EQ(OP_WSTRING_MATCH,
michael@0 482 policy->entry[kNtFakeOpenFile]->opcodes[0].GetID());
michael@0 483 EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeOpenFile]->opcodes[tc3-1].GetID());
michael@0 484
michael@0 485 // Test the policy evaluation.
michael@0 486
michael@0 487 wchar_t* filename = L"";
michael@0 488 unsigned long creation_mode = OPEN_EXISTING;
michael@0 489 unsigned long flags = FILE_ATTRIBUTE_NORMAL;
michael@0 490 void* security_descriptor = NULL;
michael@0 491
michael@0 492 POLPARAMS_BEGIN(params)
michael@0 493 POLPARAM(filename) // Argument 0
michael@0 494 POLPARAM(creation_mode) // Argument 1
michael@0 495 POLPARAM(flags) // Argument 2
michael@0 496 POLPARAM(security_descriptor)
michael@0 497 POLPARAMS_END;
michael@0 498
michael@0 499 PolicyResult result;
michael@0 500 PolicyProcessor eval_CreateFile(policy->entry[kNtFakeCreateFile]);
michael@0 501 PolicyProcessor eval_OpenFile(policy->entry[kNtFakeOpenFile]);
michael@0 502 PolicyProcessor eval_None(policy->entry[kNtFakeNone]);
michael@0 503
michael@0 504 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 505 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 506 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 507 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 508 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 509 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 510
michael@0 511 filename = L"\\\\??\\c:\\Windows\\System32\\calc.exe";
michael@0 512 flags = FILE_ATTRIBUTE_SYSTEM;
michael@0 513 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 514 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 515 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 516 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 517 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 518 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 519
michael@0 520 flags += FILE_ATTRIBUTE_READONLY;
michael@0 521 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 522 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 523 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 524 EXPECT_EQ(POLICY_MATCH, result);
michael@0 525 EXPECT_EQ(GIVE_FIRST, eval_None.GetAction());
michael@0 526 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 527 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 528
michael@0 529 flags = FILE_ATTRIBUTE_NORMAL;
michael@0 530 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 531 EXPECT_EQ(POLICY_MATCH, result);
michael@0 532 EXPECT_EQ(SIGNAL_ALARM, eval_CreateFile.GetAction());
michael@0 533 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 534 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 535 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 536 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 537
michael@0 538 filename = L"c:\\adobe\\ver3.2\\temp";
michael@0 539 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 540 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 541 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 542 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 543 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 544 EXPECT_EQ(POLICY_MATCH, result);
michael@0 545 EXPECT_EQ(GIVE_CACHED, eval_OpenFile.GetAction());
michael@0 546
michael@0 547 filename = L"c:\\adobe\\ver3.22\\temp";
michael@0 548 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 549 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 550
michael@0 551 filename = L"\\\\??\\c:\\some path\\other path\\crash reports\\some path";
michael@0 552 creation_mode = CREATE_ALWAYS;
michael@0 553 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 554 EXPECT_EQ(POLICY_MATCH, result);
michael@0 555 EXPECT_EQ(ASK_BROKER, eval_CreateFile.GetAction());
michael@0 556 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 557 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 558 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 559 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 560
michael@0 561 filename = L"\\\\??\\Pipe\\Chrome.12345";
michael@0 562 creation_mode = OPEN_EXISTING;
michael@0 563 result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
michael@0 564 EXPECT_EQ(POLICY_MATCH, result);
michael@0 565 EXPECT_EQ(FAKE_SUCCESS, eval_CreateFile.GetAction());
michael@0 566 result = eval_None.Evaluate(kShortEval, params, _countof(params));
michael@0 567 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 568 result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
michael@0 569 EXPECT_EQ(POLICY_MATCH, result);
michael@0 570 EXPECT_EQ(FAKE_SUCCESS, eval_OpenFile.GetAction());
michael@0 571
michael@0 572 delete [] reinterpret_cast<char*>(policy);
michael@0 573 }
michael@0 574
michael@0 575 TEST(PolicyEngineTest, PolicyRuleCopyConstructorTwoStrings) {
michael@0 576 SetupNtdllImports();
michael@0 577 // Both pr_orig and pr_copy should allow hello.* but not *.txt files.
michael@0 578 PolicyRule pr_orig(ASK_BROKER);
michael@0 579 EXPECT_TRUE(pr_orig.AddStringMatch(IF, 0, L"hello.*", CASE_SENSITIVE));
michael@0 580
michael@0 581 PolicyRule pr_copy(pr_orig);
michael@0 582 EXPECT_TRUE(pr_orig.AddStringMatch(IF_NOT, 0, L"*.txt", CASE_SENSITIVE));
michael@0 583 EXPECT_TRUE(pr_copy.AddStringMatch(IF_NOT, 0, L"*.txt", CASE_SENSITIVE));
michael@0 584
michael@0 585 PolicyGlobal* policy = MakePolicyMemory();
michael@0 586 LowLevelPolicy policyGen(policy);
michael@0 587 EXPECT_TRUE(policyGen.AddRule(1, &pr_orig));
michael@0 588 EXPECT_TRUE(policyGen.AddRule(2, &pr_copy));
michael@0 589 EXPECT_TRUE(policyGen.Done());
michael@0 590
michael@0 591 wchar_t* name = NULL;
michael@0 592 POLPARAMS_BEGIN(eval_params)
michael@0 593 POLPARAM(name)
michael@0 594 POLPARAMS_END;
michael@0 595
michael@0 596 PolicyResult result;
michael@0 597 PolicyProcessor pol_ev_orig(policy->entry[1]);
michael@0 598 name = L"domo.txt";
michael@0 599 result = pol_ev_orig.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 600 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 601
michael@0 602 name = L"hello.bmp";
michael@0 603 result = pol_ev_orig.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 604 EXPECT_EQ(POLICY_MATCH, result);
michael@0 605 EXPECT_EQ(ASK_BROKER, pol_ev_orig.GetAction());
michael@0 606
michael@0 607 PolicyProcessor pol_ev_copy(policy->entry[2]);
michael@0 608 name = L"domo.txt";
michael@0 609 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 610 EXPECT_EQ(NO_POLICY_MATCH, result);
michael@0 611
michael@0 612 name = L"hello.bmp";
michael@0 613 result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params));
michael@0 614 EXPECT_EQ(POLICY_MATCH, result);
michael@0 615 EXPECT_EQ(ASK_BROKER, pol_ev_copy.GetAction());
michael@0 616 }
michael@0 617 } // namespace sandbox

mercurial