| Index: sandbox/win/src/policy_low_level_unittest.cc
|
| diff --git a/sandbox/win/src/policy_low_level_unittest.cc b/sandbox/win/src/policy_low_level_unittest.cc
|
| deleted file mode 100644
|
| index fd67469f79187589046e2d041379062d4ac91d9c..0000000000000000000000000000000000000000
|
| --- a/sandbox/win/src/policy_low_level_unittest.cc
|
| +++ /dev/null
|
| @@ -1,621 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include "sandbox/win/src/policy_engine_params.h"
|
| -#include "sandbox/win/src/policy_engine_processor.h"
|
| -#include "sandbox/win/src/policy_low_level.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -#define POLPARAMS_BEGIN(x) sandbox::ParameterSet x[] = {
|
| -#define POLPARAM(p) sandbox::ParamPickerMake(p),
|
| -#define POLPARAMS_END }
|
| -
|
| -namespace sandbox {
|
| -
|
| -bool SetupNtdllImports();
|
| -
|
| -// Testing that we allow opcode generation on valid string patterns.
|
| -TEST(PolicyEngineTest, StringPatternsOK) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\adobe\\ver??\\", CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"*.tmp", CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*.doc", CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\windows\\*", CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"d:\\adobe\\acrobat.exe",
|
| - CASE_SENSITIVE));
|
| -}
|
| -
|
| -// Testing that we signal invalid string patterns.
|
| -TEST(PolicyEngineTest, StringPatternsBAD) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"one**two", CASE_SENSITIVE));
|
| - EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"**three", CASE_SENSITIVE));
|
| - EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"five?six*?seven", CASE_SENSITIVE));
|
| - EXPECT_FALSE(pr.AddStringMatch(IF, 0, L"eight?*nine", CASE_SENSITIVE));
|
| -}
|
| -
|
| -// Helper function to allocate space (on the heap) for policy.
|
| -PolicyGlobal* MakePolicyMemory() {
|
| - const size_t kTotalPolicySz = 4096*8;
|
| - char* mem = new char[kTotalPolicySz];
|
| - memset(mem, 0, kTotalPolicySz);
|
| - PolicyGlobal* policy = reinterpret_cast<PolicyGlobal*>(mem);
|
| - policy->data_size = kTotalPolicySz - sizeof(PolicyGlobal);
|
| - return policy;
|
| -}
|
| -
|
| -// The simplest test using LowLevelPolicy it should test a single opcode which
|
| -// does a exact string comparison.
|
| -TEST(PolicyEngineTest, SimpleStrMatch) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"z:\\Directory\\domo.txt",
|
| - CASE_INSENSITIVE));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 2;
|
| -
|
| - LowLevelPolicy policyGen(policy);
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = L"Z:\\Directory\\domo.txt";
|
| -
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"Z:\\Directory\\domo.txt.tmp";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, SimpleIfNotStrMatch) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\",
|
| - CASE_SENSITIVE));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 2;
|
| - LowLevelPolicy policyGen(policy);
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = NULL;
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - filename = L"c:\\Microsoft\\";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\MicroNerd\\";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Microsoft\\domo.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, SimpleIfNotStrMatchWild1) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*",
|
| - CASE_SENSITIVE));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 3;
|
| - LowLevelPolicy policyGen(policy);
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = NULL;
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - filename = L"c:\\Microsoft\\domo.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\MicroNerd\\domo.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, SimpleIfNotStrMatchWild2) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*.txt",
|
| - CASE_SENSITIVE));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 3;
|
| - LowLevelPolicy policyGen(policy);
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = NULL;
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - filename = L"c:\\Microsoft\\domo.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\MicroNerd\\domo.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Microsoft\\domo.bmp";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild1) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\Microsoft\\*",
|
| - CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 3;
|
| - LowLevelPolicy policyGen(policy);
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = NULL;
|
| - uint32_t access = 0;
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAM(access) // Argument 1
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - filename = L"c:\\Microsoft\\domo.txt";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\Microsoft\\domo.txt";
|
| - access = 42;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\MicroNerd\\domo.txt";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Micronesia\\domo.txt";
|
| - access = 42;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, IfNotStrMatchTwoRulesWild2) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddNumberMatch(IF, 1, 24, EQUAL));
|
| - EXPECT_TRUE(pr.AddStringMatch(IF_NOT, 0, L"c:\\GoogleV?\\*.txt",
|
| - CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddNumberMatch(IF, 2, 66, EQUAL));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - const uint32_t kFakeService = 3;
|
| - LowLevelPolicy policyGen(policy);
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = NULL;
|
| - uint32_t access = 0;
|
| - uint32_t sharing = 66;
|
| -
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAM(access) // Argument 1
|
| - POLPARAM(sharing) // Argument 2
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kFakeService]);
|
| -
|
| - filename = L"c:\\GoogleV2\\domo.txt";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\GoogleV2\\domo.bmp";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\GoogleV23\\domo.txt";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| -
|
| - filename = L"c:\\GoogleV2\\domo.txt";
|
| - access = 42;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\Google\\domo.txt";
|
| - access = 24;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Micronesia\\domo.txt";
|
| - access = 42;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\GoogleV2\\domo.bmp";
|
| - access = 24;
|
| - sharing = 0;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -// Testing one single rule in one single service. The service is made to
|
| -// resemble NtCreateFile.
|
| -TEST(PolicyEngineTest, OneRuleTest) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr(ASK_BROKER);
|
| - EXPECT_TRUE(pr.AddStringMatch(IF, 0, L"c:\\*Microsoft*\\*.txt",
|
| - CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr.AddNumberMatch(IF_NOT, 1, CREATE_ALWAYS, EQUAL));
|
| - EXPECT_TRUE(pr.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| -
|
| - const uint32_t kNtFakeCreateFile = 7;
|
| -
|
| - LowLevelPolicy policyGen(policy);
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
|
| - uint32_t creation_mode = OPEN_EXISTING;
|
| - uint32_t flags = FILE_ATTRIBUTE_NORMAL;
|
| - void* security_descriptor = NULL;
|
| -
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAM(creation_mode) // Argument 1
|
| - POLPARAM(flags) // Argument 2
|
| - POLPARAM(security_descriptor)
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev(policy->entry[kNtFakeCreateFile]);
|
| -
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - creation_mode = CREATE_ALWAYS;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - creation_mode = OPEN_EXISTING;
|
| - filename = L"c:\\Other\\Path\\Microsoft\\Another file.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Other\\Path\\Microsoft\\Another file.txt.tmp";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - flags = FILE_ATTRIBUTE_DEVICE;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\Other\\Macrosoft\\Another file.txt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\Microsoft\\1.txt";
|
| - flags = FILE_ATTRIBUTE_NORMAL;
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev.GetAction());
|
| -
|
| - filename = L"c:\\Microsoft\\1.ttt";
|
| - result = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -// Testing 3 rules in 3 services. Two of the services resemble File services.
|
| -TEST(PolicyEngineTest, ThreeRulesTest) {
|
| - SetupNtdllImports();
|
| - PolicyRule pr_pipe(FAKE_SUCCESS);
|
| - EXPECT_TRUE(pr_pipe.AddStringMatch(IF, 0, L"\\\\/?/?\\Pipe\\Chrome.*",
|
| - CASE_INSENSITIVE));
|
| - EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 1, OPEN_EXISTING, EQUAL));
|
| - EXPECT_TRUE(pr_pipe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
|
| -
|
| - size_t opc1 = pr_pipe.GetOpcodeCount();
|
| - EXPECT_EQ(3u, opc1);
|
| -
|
| - PolicyRule pr_dump(ASK_BROKER);
|
| - EXPECT_TRUE(pr_dump.AddStringMatch(IF, 0, L"\\\\/?/?\\*\\Crash Reports\\*",
|
| - CASE_INSENSITIVE));
|
| - EXPECT_TRUE(pr_dump.AddNumberMatch(IF, 1, CREATE_ALWAYS, EQUAL));
|
| - EXPECT_TRUE(pr_dump.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
|
| -
|
| - size_t opc2 = pr_dump.GetOpcodeCount();
|
| - EXPECT_EQ(4u, opc2);
|
| -
|
| - PolicyRule pr_winexe(SIGNAL_ALARM);
|
| - EXPECT_TRUE(pr_winexe.AddStringMatch(IF, 0, L"\\\\/?/?\\C:\\Windows\\*.exe",
|
| - CASE_INSENSITIVE));
|
| - EXPECT_TRUE(pr_winexe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
|
| -
|
| - size_t opc3 = pr_winexe.GetOpcodeCount();
|
| - EXPECT_EQ(3u, opc3);
|
| -
|
| - PolicyRule pr_adobe(GIVE_CACHED);
|
| - EXPECT_TRUE(pr_adobe.AddStringMatch(IF, 0, L"c:\\adobe\\ver?.?\\",
|
| - CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr_adobe.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_NORMAL, EQUAL));
|
| -
|
| - size_t opc4 = pr_adobe.GetOpcodeCount();
|
| - EXPECT_EQ(4u, opc4);
|
| -
|
| - PolicyRule pr_none(GIVE_FIRST);
|
| - EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_READONLY, AND));
|
| - EXPECT_TRUE(pr_none.AddNumberMatch(IF, 2, FILE_ATTRIBUTE_SYSTEM, AND));
|
| -
|
| - size_t opc5 = pr_none.GetOpcodeCount();
|
| - EXPECT_EQ(2u, opc5);
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| -
|
| - const uint32_t kNtFakeNone = 4;
|
| - const uint32_t kNtFakeCreateFile = 5;
|
| - const uint32_t kNtFakeOpenFile = 6;
|
| -
|
| - LowLevelPolicy policyGen(policy);
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_pipe));
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_dump));
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr_winexe));
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_adobe));
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeOpenFile, &pr_pipe));
|
| -
|
| - EXPECT_TRUE(policyGen.AddRule(kNtFakeNone, &pr_none));
|
| -
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - // Inspect the policy structure manually.
|
| - EXPECT_TRUE(NULL == policy->entry[0]);
|
| - EXPECT_TRUE(NULL == policy->entry[1]);
|
| - EXPECT_TRUE(NULL == policy->entry[2]);
|
| - EXPECT_TRUE(NULL == policy->entry[3]);
|
| - EXPECT_TRUE(NULL != policy->entry[4]); // kNtFakeNone.
|
| - EXPECT_TRUE(NULL != policy->entry[5]); // kNtFakeCreateFile.
|
| - EXPECT_TRUE(NULL != policy->entry[6]); // kNtFakeOpenFile.
|
| - EXPECT_TRUE(NULL == policy->entry[7]);
|
| -
|
| - // The total per service opcode counts now must take in account one
|
| - // extra opcode (action opcode) per rule.
|
| - ++opc1;
|
| - ++opc2;
|
| - ++opc3;
|
| - ++opc4;
|
| - ++opc5;
|
| -
|
| - size_t tc1 = policy->entry[kNtFakeNone]->opcode_count;
|
| - size_t tc2 = policy->entry[kNtFakeCreateFile]->opcode_count;
|
| - size_t tc3 = policy->entry[kNtFakeOpenFile]->opcode_count;
|
| -
|
| - EXPECT_EQ(opc5, tc1);
|
| - EXPECT_EQ((opc1 + opc2 + opc3), tc2);
|
| - EXPECT_EQ((opc1 + opc4), tc3);
|
| -
|
| - // Check the type of the first and last opcode of each service.
|
| -
|
| - EXPECT_EQ(OP_NUMBER_AND_MATCH,
|
| - policy->entry[kNtFakeNone]->opcodes[0].GetID());
|
| - EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeNone]->opcodes[tc1-1].GetID());
|
| - EXPECT_EQ(OP_WSTRING_MATCH,
|
| - policy->entry[kNtFakeCreateFile]->opcodes[0].GetID());
|
| - EXPECT_EQ(OP_ACTION,
|
| - policy->entry[kNtFakeCreateFile]->opcodes[tc2-1].GetID());
|
| - EXPECT_EQ(OP_WSTRING_MATCH,
|
| - policy->entry[kNtFakeOpenFile]->opcodes[0].GetID());
|
| - EXPECT_EQ(OP_ACTION, policy->entry[kNtFakeOpenFile]->opcodes[tc3-1].GetID());
|
| -
|
| - // Test the policy evaluation.
|
| -
|
| - const wchar_t* filename = L"";
|
| - uint32_t creation_mode = OPEN_EXISTING;
|
| - uint32_t flags = FILE_ATTRIBUTE_NORMAL;
|
| - void* security_descriptor = NULL;
|
| -
|
| - POLPARAMS_BEGIN(params)
|
| - POLPARAM(filename) // Argument 0
|
| - POLPARAM(creation_mode) // Argument 1
|
| - POLPARAM(flags) // Argument 2
|
| - POLPARAM(security_descriptor)
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor eval_CreateFile(policy->entry[kNtFakeCreateFile]);
|
| - PolicyProcessor eval_OpenFile(policy->entry[kNtFakeOpenFile]);
|
| - PolicyProcessor eval_None(policy->entry[kNtFakeNone]);
|
| -
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"\\\\??\\c:\\Windows\\System32\\calc.exe";
|
| - flags = FILE_ATTRIBUTE_SYSTEM;
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - flags += FILE_ATTRIBUTE_READONLY;
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(GIVE_FIRST, eval_None.GetAction());
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - flags = FILE_ATTRIBUTE_NORMAL;
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(SIGNAL_ALARM, eval_CreateFile.GetAction());
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"c:\\adobe\\ver3.2\\temp";
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(GIVE_CACHED, eval_OpenFile.GetAction());
|
| -
|
| - filename = L"c:\\adobe\\ver3.22\\temp";
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"\\\\??\\c:\\some path\\other path\\crash reports\\some path";
|
| - creation_mode = CREATE_ALWAYS;
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, eval_CreateFile.GetAction());
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - filename = L"\\\\??\\Pipe\\Chrome.12345";
|
| - creation_mode = OPEN_EXISTING;
|
| - result = eval_CreateFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(FAKE_SUCCESS, eval_CreateFile.GetAction());
|
| - result = eval_None.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| - result = eval_OpenFile.Evaluate(kShortEval, params, _countof(params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(FAKE_SUCCESS, eval_OpenFile.GetAction());
|
| -
|
| - delete [] reinterpret_cast<char*>(policy);
|
| -}
|
| -
|
| -TEST(PolicyEngineTest, PolicyRuleCopyConstructorTwoStrings) {
|
| - SetupNtdllImports();
|
| - // Both pr_orig and pr_copy should allow hello.* but not *.txt files.
|
| - PolicyRule pr_orig(ASK_BROKER);
|
| - EXPECT_TRUE(pr_orig.AddStringMatch(IF, 0, L"hello.*", CASE_SENSITIVE));
|
| -
|
| - PolicyRule pr_copy(pr_orig);
|
| - EXPECT_TRUE(pr_orig.AddStringMatch(IF_NOT, 0, L"*.txt", CASE_SENSITIVE));
|
| - EXPECT_TRUE(pr_copy.AddStringMatch(IF_NOT, 0, L"*.txt", CASE_SENSITIVE));
|
| -
|
| - PolicyGlobal* policy = MakePolicyMemory();
|
| - LowLevelPolicy policyGen(policy);
|
| - EXPECT_TRUE(policyGen.AddRule(1, &pr_orig));
|
| - EXPECT_TRUE(policyGen.AddRule(2, &pr_copy));
|
| - EXPECT_TRUE(policyGen.Done());
|
| -
|
| - const wchar_t* name = NULL;
|
| - POLPARAMS_BEGIN(eval_params)
|
| - POLPARAM(name)
|
| - POLPARAMS_END;
|
| -
|
| - PolicyResult result;
|
| - PolicyProcessor pol_ev_orig(policy->entry[1]);
|
| - name = L"domo.txt";
|
| - result = pol_ev_orig.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - name = L"hello.bmp";
|
| - result = pol_ev_orig.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev_orig.GetAction());
|
| -
|
| - PolicyProcessor pol_ev_copy(policy->entry[2]);
|
| - name = L"domo.txt";
|
| - result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(NO_POLICY_MATCH, result);
|
| -
|
| - name = L"hello.bmp";
|
| - result = pol_ev_copy.Evaluate(kShortEval, eval_params, _countof(eval_params));
|
| - EXPECT_EQ(POLICY_MATCH, result);
|
| - EXPECT_EQ(ASK_BROKER, pol_ev_copy.GetAction());
|
| -}
|
| -} // namespace sandbox
|
|
|