package host import ( "os" "os/exec" "path/filepath" "testing" "golang.org/x/sys/unix" ) func plan14RootFixture(t *testing.T) bool { t.Helper() if os.Getenv("PLAN14_ROOT_FIXTURE") == t.Name() { root := os.Getenv("PLAN14_ROOT_DIR") if err := unix.Mount("/proc", filepath.Join(root, "proc"), "", unix.MS_BIND|unix.MS_REC, ""); err != nil { t.Fatal(err) } source := "/usr/bin/true" if os.Getenv("PLAN14_REAL_ROOT") == "1" { source = filepath.Join(root, "foreign-source") } if err := unix.Mount(source, filepath.Join(root, "foreign"), "", unix.MS_BIND, ""); err != nil { t.Fatal(err) } if err := unix.Mount("/usr", filepath.Join(root, "foreign-dir"), "", unix.MS_BIND, ""); err != nil { t.Fatal(err) } if err := unix.Chroot(root); err != nil { t.Fatal(err) } if err := os.Chdir("/"); err != nil { t.Fatal(err) } if err := os.Chmod("/", 0755); err != nil { t.Fatal(err) } t.Setenv("TMPDIR", "/scratch") return true } root := t.TempDir() if err := os.Mkdir(filepath.Join(root, "scratch"), 0755); err != nil { t.Fatal(err) } if err := os.Mkdir(filepath.Join(root, "proc"), 0755); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(root, "foreign"), nil, 0644); err != nil { t.Fatal(err) } if err := os.Mkdir(filepath.Join(root, "foreign-dir"), 0755); err != nil { t.Fatal(err) } binary, err := os.Executable() if err != nil { t.Fatal(err) } probe := exec.Command("unshare", "--user", "--map-root-user", "--mount", "true") if out, err := probe.CombinedOutput(); err != nil { t.Skipf("user namespace unavailable: %v %s", err, out) } cmd := exec.Command("unshare", "--user", "--map-root-user", "--mount", binary, "-test.run=^"+t.Name()+"$", "-test.v") cmd.Env = append(os.Environ(), "PLAN14_ROOT_FIXTURE="+t.Name(), "PLAN14_ROOT_DIR="+root) if os.Geteuid() == 0 { raw, err := os.ReadFile("/usr/bin/true") if err != nil { t.Fatal(err) } source := filepath.Join(root, "foreign-source") if err := os.WriteFile(source, raw, 0644); err != nil { t.Fatal(err) } if err := os.Chown(source, 65534, 65534); err != nil { t.Fatal(err) } cmd.Env = append(cmd.Env, "PLAN14_REAL_ROOT=1") } if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("isolated root fixture: %v\n%s", err, out) } else { t.Log(string(out)) } return false } func makeProofAncestorsPublic(t *testing.T, path string) { t.Helper() for dir := filepath.Dir(path); dir != "/"; dir = filepath.Dir(dir) { if err := os.Chmod(dir, 0755); err != nil { t.Fatal(err) } } }