carlos / platform Public

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

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "os"
5 "os/exec"
6 "path/filepath"
7 "testing"
8
9 "golang.org/x/sys/unix"
10)
11
12func plan14RootFixture(t *testing.T) bool {
13 t.Helper()
14 if os.Getenv("PLAN14_ROOT_FIXTURE") == t.Name() {
15 root := os.Getenv("PLAN14_ROOT_DIR")
16 if err := unix.Mount("/proc", filepath.Join(root, "proc"), "", unix.MS_BIND|unix.MS_REC, ""); err != nil {
17 t.Fatal(err)
18 }
19 source := "/usr/bin/true"
20 if os.Getenv("PLAN14_REAL_ROOT") == "1" {
21 source = filepath.Join(root, "foreign-source")
22 }
23 if err := unix.Mount(source, filepath.Join(root, "foreign"), "", unix.MS_BIND, ""); err != nil {
24 t.Fatal(err)
25 }
26 if err := unix.Mount("/usr", filepath.Join(root, "foreign-dir"), "", unix.MS_BIND, ""); err != nil {
27 t.Fatal(err)
28 }
29 if err := unix.Chroot(root); err != nil {
30 t.Fatal(err)
31 }
32 if err := os.Chdir("/"); err != nil {
33 t.Fatal(err)
34 }
35 if err := os.Chmod("/", 0755); err != nil {
36 t.Fatal(err)
37 }
38 t.Setenv("TMPDIR", "/scratch")
39 return true
40 }
41 root := t.TempDir()
42 if err := os.Mkdir(filepath.Join(root, "scratch"), 0755); err != nil {
43 t.Fatal(err)
44 }
45 if err := os.Mkdir(filepath.Join(root, "proc"), 0755); err != nil {
46 t.Fatal(err)
47 }
48 if err := os.WriteFile(filepath.Join(root, "foreign"), nil, 0644); err != nil {
49 t.Fatal(err)
50 }
51 if err := os.Mkdir(filepath.Join(root, "foreign-dir"), 0755); err != nil {
52 t.Fatal(err)
53 }
54 binary, err := os.Executable()
55 if err != nil {
56 t.Fatal(err)
57 }
58 probe := exec.Command("unshare", "--user", "--map-root-user", "--mount", "true")
59 if out, err := probe.CombinedOutput(); err != nil {
60 t.Skipf("user namespace unavailable: %v %s", err, out)
61 }
62 cmd := exec.Command("unshare", "--user", "--map-root-user", "--mount", binary, "-test.run=^"+t.Name()+"$", "-test.v")
63 cmd.Env = append(os.Environ(), "PLAN14_ROOT_FIXTURE="+t.Name(), "PLAN14_ROOT_DIR="+root)
64 if os.Geteuid() == 0 {
65 raw, err := os.ReadFile("/usr/bin/true")
66 if err != nil {
67 t.Fatal(err)
68 }
69 source := filepath.Join(root, "foreign-source")
70 if err := os.WriteFile(source, raw, 0644); err != nil {
71 t.Fatal(err)
72 }
73 if err := os.Chown(source, 65534, 65534); err != nil {
74 t.Fatal(err)
75 }
76 cmd.Env = append(cmd.Env, "PLAN14_REAL_ROOT=1")
77 }
78 if out, err := cmd.CombinedOutput(); err != nil {
79 t.Fatalf("isolated root fixture: %v\n%s", err, out)
80 } else {
81 t.Log(string(out))
82 }
83 return false
84}
85
86func makeProofAncestorsPublic(t *testing.T, path string) {
87 t.Helper()
88 for dir := filepath.Dir(path); dir != "/"; dir = filepath.Dir(dir) {
89 if err := os.Chmod(dir, 0755); err != nil {
90 t.Fatal(err)
91 }
92 }
93}
94