Skip to content
This repository was archived by the owner on Mar 9, 2022. It is now read-only.

Commit 415727c

Browse files
author
Yanqiang Miao
committed
verify selinux level format
Signed-off-by: Yanqiang Miao <[email protected]>
1 parent c9d6151 commit 415727c

2 files changed

Lines changed: 98 additions & 3 deletions

File tree

pkg/server/helpers.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"path"
2323
"path/filepath"
24+
"regexp"
2425
"strconv"
2526
"strings"
2627

@@ -375,6 +376,12 @@ func initSelinuxOpts(selinuxOpt *runtime.SELinuxOption) (string, string, error)
375376
return "", "", nil
376377
}
377378

379+
// make sure the format of "level" is correct.
380+
ok, err := checkSelinuxLevel(selinuxOpt.GetLevel())
381+
if err != nil || !ok {
382+
return "", "", err
383+
}
384+
378385
labelOpts := fmt.Sprintf("%s:%s:%s:%s",
379386
selinuxOpt.GetUser(),
380387
selinuxOpt.GetRole(),
@@ -383,6 +390,14 @@ func initSelinuxOpts(selinuxOpt *runtime.SELinuxOption) (string, string, error)
383390
return label.InitLabels(selinux.DupSecOpt(labelOpts))
384391
}
385392

393+
func checkSelinuxLevel(level string) (bool, error) {
394+
matched, err := regexp.MatchString(`^s\d(-s\d)??(:c\d{1,4}((.c\d{1,4})?,c\d{1,4})*(.c\d{1,4})?(,c\d{1,4}(.c\d{1,4})?)*)?$`, level)
395+
if err != nil || !matched {
396+
return false, fmt.Errorf("the format of 'level' %q is not correct: %v", level, err)
397+
}
398+
return true, nil
399+
}
400+
386401
// isInCRIMounts checks whether a destination is in CRI mount list.
387402
func isInCRIMounts(dst string, mounts []*runtime.Mount) bool {
388403
for _, m := range mounts {

pkg/server/helpers_selinux_test.go

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func TestInitSelinuxOpts(t *testing.T) {
3535
selinuxOpt *runtime.SELinuxOption
3636
processLabel string
3737
mountLabels []string
38+
expectErr bool
3839
}{
3940
"Should return empty strings for processLabel and mountLabel when selinuxOpt is nil": {
4041
selinuxOpt: nil,
@@ -61,12 +62,91 @@ func TestInitSelinuxOpts(t *testing.T) {
6162
processLabel: "user_u:user_r:user_t:s0:c1,c2",
6263
mountLabels: []string{"user_u:object_r:container_file_t:s0:c1,c2", "user_u:object_r:svirt_sandbox_file_t:s0:c1,c2"},
6364
},
65+
"Should return error when the format of 'level' is not correct": {
66+
selinuxOpt: &runtime.SELinuxOption{
67+
User: "user_u",
68+
Role: "user_r",
69+
Type: "user_t",
70+
Level: "s0,c1,c2",
71+
},
72+
expectErr: true,
73+
},
6474
} {
6575
t.Run(desc, func(t *testing.T) {
6676
processLabel, mountLabel, err := initSelinuxOpts(test.selinuxOpt)
67-
assert.NoError(t, err)
68-
assert.Equal(t, test.processLabel, processLabel)
69-
assert.Contains(t, test.mountLabels, mountLabel)
77+
if test.expectErr {
78+
assert.Error(t, err)
79+
} else {
80+
assert.NoError(t, err)
81+
assert.Equal(t, test.processLabel, processLabel)
82+
assert.Contains(t, test.mountLabels, mountLabel)
83+
}
84+
})
85+
}
86+
}
87+
88+
func TestCheckSelinuxLevel(t *testing.T) {
89+
for desc, test := range map[string]struct {
90+
level string
91+
expectErr bool
92+
}{
93+
"s0": {
94+
level: "s0",
95+
},
96+
"s0-s0": {
97+
level: "s0-s0",
98+
},
99+
"s0:c0": {
100+
level: "s0:c0",
101+
},
102+
"s0:c0.c3": {
103+
level: "s0:c0.c3",
104+
},
105+
"s0:c0,c3": {
106+
level: "s0:c0,c3",
107+
},
108+
"s0-s0:c0,c3": {
109+
level: "s0-s0:c0,c3",
110+
},
111+
"s0-s0:c0,c3.c6": {
112+
level: "s0-s0:c0,c3.c6",
113+
},
114+
"s0-s0:c0,c3.c6,c8.c10": {
115+
level: "s0-s0:c0,c3.c6,c8.c10",
116+
},
117+
"s0-s0:c0,c3.c6,c8,c10": {
118+
level: "s0-s0:c0,c3.c6",
119+
},
120+
"s0,c0,c3": {
121+
level: "s0,c0,c3",
122+
expectErr: true,
123+
},
124+
"s0:c0.c3.c6": {
125+
level: "s0:c0.c3.c6",
126+
expectErr: true,
127+
},
128+
"s0-s0,c0,c3": {
129+
level: "s0-s0,c0,c3",
130+
expectErr: true,
131+
},
132+
"s0-s0:c0.c3.c6": {
133+
level: "s0-s0:c0.c3.c6",
134+
expectErr: true,
135+
},
136+
"s0-s0:c0,c3.c6.c8": {
137+
level: "s0-s0:c0,c3.c6.c8",
138+
expectErr: true,
139+
},
140+
} {
141+
t.Run(desc, func(t *testing.T) {
142+
ok, err := checkSelinuxLevel(test.level)
143+
if test.expectErr {
144+
assert.Error(t, err)
145+
assert.False(t, ok)
146+
} else {
147+
assert.NoError(t, err)
148+
assert.True(t, ok)
149+
}
70150
})
71151
}
72152
}

0 commit comments

Comments
 (0)