1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "gtest/gtest.h"
8
9 #include "broker/SandboxBroker.h"
10
11 namespace mozilla {
12
13 static const int MAY_ACCESS = SandboxBroker::MAY_ACCESS;
14 static const int MAY_READ = SandboxBroker::MAY_READ;
15 static const int MAY_WRITE = SandboxBroker::MAY_WRITE;
16 //static const int MAY_CREATE = SandboxBroker::MAY_CREATE;
17 //static const int RECURSIVE = SandboxBroker::RECURSIVE;
18 static const auto AddAlways = SandboxBroker::Policy::AddAlways;
19
TEST(SandboxBrokerPolicyLookup,Simple)20 TEST(SandboxBrokerPolicyLookup, Simple)
21 {
22 SandboxBroker::Policy p;
23 p.AddPath(MAY_READ, "/dev/urandom", AddAlways);
24
25 EXPECT_NE(0, p.Lookup("/dev/urandom")) << "Added path not found.";
26 EXPECT_EQ(MAY_ACCESS | MAY_READ, p.Lookup("/dev/urandom"))
27 << "Added path found with wrong perms.";
28 EXPECT_EQ(0, p.Lookup("/etc/passwd")) << "Non-added path was found.";
29 }
30
TEST(SandboxBrokerPolicyLookup,CopyCtor)31 TEST(SandboxBrokerPolicyLookup, CopyCtor)
32 {
33 SandboxBroker::Policy psrc;
34 psrc.AddPath(MAY_READ | MAY_WRITE, "/dev/null", AddAlways);
35 SandboxBroker::Policy pdst(psrc);
36 psrc.AddPath(MAY_READ, "/dev/zero", AddAlways);
37 pdst.AddPath(MAY_READ, "/dev/urandom", AddAlways);
38
39 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, psrc.Lookup("/dev/null"))
40 << "Common path absent in copy source.";
41 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, pdst.Lookup("/dev/null"))
42 << "Common path absent in copy destination.";
43
44 EXPECT_EQ(MAY_ACCESS | MAY_READ, psrc.Lookup("/dev/zero"))
45 << "Source-only path is absent.";
46 EXPECT_EQ(0, pdst.Lookup("/dev/zero"))
47 << "Source-only path is present in copy destination.";
48
49 EXPECT_EQ(0, psrc.Lookup("/dev/urandom"))
50 << "Destination-only path is present in copy source.";
51 EXPECT_EQ(MAY_ACCESS | MAY_READ, pdst.Lookup("/dev/urandom"))
52 << "Destination-only path is absent.";
53
54 EXPECT_EQ(0, psrc.Lookup("/etc/passwd"))
55 << "Non-added path is present in copy source.";
56 EXPECT_EQ(0, pdst.Lookup("/etc/passwd"))
57 << "Non-added path is present in copy source.";
58 }
59
TEST(SandboxBrokerPolicyLookup,Recursive)60 TEST(SandboxBrokerPolicyLookup, Recursive)
61 {
62 SandboxBroker::Policy psrc;
63 psrc.AddPath(MAY_READ | MAY_WRITE, "/dev/null", AddAlways);
64 psrc.AddPath(MAY_READ, "/dev/zero", AddAlways);
65 psrc.AddPath(MAY_READ, "/dev/urandom", AddAlways);
66
67 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, psrc.Lookup("/dev/null"))
68 << "Basic path is present.";
69 EXPECT_EQ(MAY_ACCESS | MAY_READ, psrc.Lookup("/dev/zero"))
70 << "Basic path has no extra flags";
71
72 psrc.AddDir(MAY_READ | MAY_WRITE, "/dev/");
73
74 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, psrc.Lookup("/dev/random"))
75 << "Permission via recursive dir.";
76 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, psrc.Lookup("/dev/sd/0"))
77 << "Permission via recursive dir, nested deeper";
78 EXPECT_EQ(0, psrc.Lookup("/dev/sd/0/"))
79 << "Invalid path format.";
80 EXPECT_EQ(0, psrc.Lookup("/usr/dev/sd"))
81 << "Match must be a prefix.";
82
83 psrc.AddDir(MAY_READ, "/dev/sd/");
84 EXPECT_EQ(MAY_ACCESS | MAY_READ | MAY_WRITE, psrc.Lookup("/dev/sd/0"))
85 << "Extra permissions from parent path granted.";
86 EXPECT_EQ(0, psrc.Lookup("/dev/.."))
87 << "Refuse attempted subdir escape.";
88
89 psrc.AddDir(MAY_READ, "/tmp");
90 EXPECT_EQ(MAY_ACCESS | MAY_READ, psrc.Lookup("/tmp/good/a"))
91 << "Check whether dir add with no trailing / was sucessful.";
92 EXPECT_EQ(0, psrc.Lookup("/tmp_good_but_bad"))
93 << "Enforce terminator on directories.";
94 EXPECT_EQ(0, psrc.Lookup("/tmp/."))
95 << "Do not allow opening a directory handle.";
96 }
97
98 } // namespace mozilla
99