Wed, 31 Dec 2014 06:09:35 +0100
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 |