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 "errors"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "github.com/carlosframework/platform/internal/release"
10)
11
12func TestPlan14PointerHistoryRootAndAgentTampering(t *testing.T) {
13 for _, attack := range []string{"delete", "rename", "empty", "directory"} {
14 t.Run(attack, func(t *testing.T) {
15 opt, data := t.TempDir(), t.TempDir()
16 p := &release.ChannelPointer{App: "console", Channel: "stable", Version: "v1", Digest: release.ManifestDigest([]byte("manifest"))}
17 if err := pointerRatchet(true, opt, data, func(string) string { return "" }).Admit("bab", p); err != nil {
18 t.Fatal(err)
19 }
20 root, agent := release.RootRatchetDir(opt), release.EdgeRatchetDir(data)
21 if err := release.NewDigestRatchet(agent, []string{root}, false).Admit("bab", p); err != nil {
22 t.Fatal(err)
23 }
24 mark := filepath.Join(agent, "bab", "console", "stable.digests")
25 switch attack {
26 case "delete":
27 if err := os.Remove(mark); err != nil {
28 t.Fatal(err)
29 }
30 case "rename":
31 if err := os.Rename(mark, mark+".old"); err != nil {
32 t.Fatal(err)
33 }
34 case "empty":
35 if err := os.WriteFile(mark, nil, 0600); err != nil {
36 t.Fatal(err)
37 }
38 case "directory":
39 if err := os.Remove(mark); err != nil {
40 t.Fatal(err)
41 }
42 if err := os.Mkdir(mark, 0700); err != nil {
43 t.Fatal(err)
44 }
45 }
46 legacy := &release.ChannelPointer{App: p.App, Channel: p.Channel, Version: p.Version}
47 for _, reader := range []*release.DigestRatchet{release.NewDigestRatchet(root, []string{agent}, false), release.NewDigestRatchet(agent, []string{root}, false)} {
48 if err := reader.Admit("bab", legacy); !errors.Is(err, release.ErrPointerWithoutDigests) {
49 t.Fatalf("tampering admitted digestless pointer: %v", err)
50 }
51 }
52 if err := release.NewDigestRatchet(root, []string{agent}, false).Admit("bab", p); err != nil {
53 t.Fatalf("signed digest pointer refused: %v", err)
54 }
55 })
56 }
57 root, agent := t.TempDir(), t.TempDir()
58 mark := filepath.Join(agent, "bab", "console", "stable.digests")
59 if err := os.MkdirAll(mark, 0700); err != nil {
60 t.Fatal(err)
61 }
62 if err := release.NewDigestRatchet(root, []string{agent}, false).Admit("bab", &release.ChannelPointer{App: "console", Channel: "stable", Version: "v1"}); !errors.Is(err, release.ErrPointerWithoutDigests) {
63 t.Fatalf("malformed additional deny failed open: %v", err)
64 }
65}
66