| package fs |
| |
| import ( |
| "path/filepath" |
| "strings" |
| "testing" |
| |
| "github.com/opencontainers/runc/libcontainer/cgroups" |
| "github.com/opencontainers/runc/libcontainer/configs" |
| ) |
| |
| func TestInvalidCgroupPath(t *testing.T) { |
| if cgroups.IsCgroup2UnifiedMode() { |
| t.Skip("cgroup v2 is not supported") |
| } |
| |
| root, err := rootPath() |
| if err != nil { |
| t.Fatalf("couldn't get cgroup root: %v", err) |
| } |
| |
| testCases := []struct { |
| test string |
| path, name, parent string |
| }{ |
| { |
| test: "invalid cgroup path", |
| path: "../../../../../../../../../../some/path", |
| }, |
| { |
| test: "invalid absolute cgroup path", |
| path: "/../../../../../../../../../../some/path", |
| }, |
| { |
| test: "invalid cgroup parent", |
| parent: "../../../../../../../../../../some/path", |
| name: "name", |
| }, |
| { |
| test: "invalid absolute cgroup parent", |
| parent: "/../../../../../../../../../../some/path", |
| name: "name", |
| }, |
| { |
| test: "invalid cgroup name", |
| parent: "parent", |
| name: "../../../../../../../../../../some/path", |
| }, |
| { |
| test: "invalid absolute cgroup name", |
| parent: "parent", |
| name: "/../../../../../../../../../../some/path", |
| }, |
| { |
| test: "invalid cgroup name and parent", |
| parent: "../../../../../../../../../../some/path", |
| name: "../../../../../../../../../../some/path", |
| }, |
| { |
| test: "invalid absolute cgroup name and parent", |
| parent: "/../../../../../../../../../../some/path", |
| name: "/../../../../../../../../../../some/path", |
| }, |
| } |
| |
| for _, tc := range testCases { |
| t.Run(tc.test, func(t *testing.T) { |
| config := &configs.Cgroup{Path: tc.path, Name: tc.name, Parent: tc.parent} |
| |
| inner, err := innerPath(config) |
| if err != nil { |
| t.Fatalf("couldn't get cgroup data: %v", err) |
| } |
| |
| // Make sure the final inner path doesn't go outside the cgroup mountpoint. |
| if strings.HasPrefix(inner, "..") { |
| t.Errorf("SECURITY: cgroup innerPath is outside cgroup mountpoint!") |
| } |
| |
| // Double-check, using an actual cgroup. |
| deviceRoot := filepath.Join(root, "devices") |
| devicePath, err := subsysPath(root, inner, "devices") |
| if err != nil { |
| t.Fatalf("couldn't get cgroup path: %v", err) |
| } |
| if !strings.HasPrefix(devicePath, deviceRoot) { |
| t.Errorf("SECURITY: cgroup path() is outside cgroup mountpoint!") |
| } |
| }) |
| } |
| } |
| |
| func TestTryDefaultCgroupRoot(t *testing.T) { |
| res := tryDefaultCgroupRoot() |
| exp := defaultCgroupRoot |
| if cgroups.IsCgroup2UnifiedMode() { |
| // checking that tryDefaultCgroupRoot does return "" |
| // in case /sys/fs/cgroup is not cgroup v1 root dir. |
| exp = "" |
| } |
| if res != exp { |
| t.Errorf("tryDefaultCgroupRoot: want %q, got %q", exp, res) |
| } |
| } |