...
1
2
3
4 package security
5
6 import (
7 "os"
8 "path/filepath"
9 "regexp"
10 "strings"
11 "testing"
12
13 exec "golang.org/x/sys/execabs"
14 )
15
16 const (
17 vmAccountName = `NT VIRTUAL MACHINE\\Virtual Machines`
18 vmAccountSID = "S-1-5-83-0"
19 )
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 func TestGrantVmGroupAccess(t *testing.T) {
39 f, err := os.CreateTemp("", "gvmgafile")
40 if err != nil {
41 t.Fatal(err)
42 }
43 defer func() {
44 f.Close()
45 os.Remove(f.Name())
46 }()
47
48 d := t.TempDir()
49 find, err := os.Create(filepath.Join(d, "find.txt"))
50 if err != nil {
51 t.Fatal(err)
52 }
53 defer find.Close()
54
55 if err := GrantVmGroupAccess(f.Name()); err != nil {
56 t.Fatal(err)
57 }
58
59 if err := GrantVmGroupAccess(d); err != nil {
60 t.Fatal(err)
61 }
62
63 verifyVMAccountDACLs(t,
64 f.Name(),
65 []string{`(R)`},
66 )
67
68
69
70
71
72
73
74
75
76
77
78 verifyVMAccountDACLs(t,
79 d,
80 []string{`(R)`, `(OI)(CI)(IO)(GR)`},
81 )
82
83 verifyVMAccountDACLs(t,
84 find.Name(),
85 []string{`(I)(R)`},
86 )
87 }
88
89 func verifyVMAccountDACLs(t *testing.T, name string, permissions []string) {
90 cmd := exec.Command("icacls", name)
91 outb, err := cmd.CombinedOutput()
92 if err != nil {
93 t.Fatal(err)
94 }
95 out := string(outb)
96
97 for _, p := range permissions {
98
99 p = strings.Replace(p, "(", "\\(", -1)
100 p = strings.Replace(p, ")", "\\)", -1)
101
102 nameToCheck := vmAccountName + ":" + p
103 sidToCheck := vmAccountSID + ":" + p
104
105 rxName := regexp.MustCompile(nameToCheck)
106 rxSID := regexp.MustCompile(sidToCheck)
107
108 matchesName := rxName.FindAllStringIndex(out, -1)
109 matchesSID := rxSID.FindAllStringIndex(out, -1)
110
111 if len(matchesName) != 1 && len(matchesSID) != 1 {
112 t.Fatalf("expected one match for %s or %s\n%s", nameToCheck, sidToCheck, out)
113 }
114 }
115 }
116
View as plain text