carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package rootstate
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7)
8
9func TestTemplateUnitLinkRead(t *testing.T) {
10 parent := t.TempDir()
11 if err := os.Chmod(parent, 0755); err != nil {
12 t.Fatal(err)
13 }
14 name := "sshd@.service.wants"
15 if err := os.Mkdir(filepath.Join(parent, name), 0755); err != nil {
16 t.Fatal(err)
17 }
18 if err := os.Symlink("/usr/lib/systemd/system/getty@.service", filepath.Join(parent, name, "getty@tty1.service")); err != nil {
19 t.Fatal(err)
20 }
21 fd, err := os.Open(parent)
22 if err != nil {
23 t.Fatal(err)
24 }
25 defer fd.Close()
26 s, err := descend(fd, []string{name}, false, true, uint32(os.Geteuid()))
27 if err != nil {
28 t.Fatal("trusted public template directory", err)
29 }
30 defer s.Close()
31 target, err := s.(*directory).readLink("getty@tty1.service")
32 if err != nil || target != "/usr/lib/systemd/system/getty@.service" {
33 t.Fatal("template link", target, err)
34 }
35 if err = s.Write("new@record", []byte("authority")); err == nil {
36 t.Fatal("template exception admitted record write")
37 }
38 for _, parts := range [][]string{{".."}, {"../sshd@.service.wants"}, {"sshd@.service.wants/.."}} {
39 if d, e := descend(fd, parts, false, true, uint32(os.Geteuid())); e == nil {
40 d.Close()
41 t.Fatal("traversal accepted", parts)
42 }
43 }
44 if d, e := descend(fd, []string{"new@directory"}, true, true, uint32(os.Geteuid())); e == nil {
45 d.Close()
46 t.Fatal("template exception admitted directory creation")
47 }
48 if err = os.Chmod(filepath.Join(parent, name), 0777); err != nil {
49 t.Fatal(err)
50 }
51 if d, e := descend(fd, []string{name}, false, true, uint32(os.Geteuid())); e == nil {
52 d.Close()
53 t.Fatal("writable template directory accepted")
54 }
55}
56