Skip to content

Commit 8ce539f

Browse files
committed
verify updater container image signatures using cosign
1 parent 4e7612f commit 8ce539f

File tree

8 files changed

+1182
-133
lines changed

8 files changed

+1182
-133
lines changed

cmd/dependabot/internal/cmd/root.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ import (
1212
)
1313

1414
type SharedFlags struct {
15-
file string
16-
cache string
17-
debugging bool
18-
flamegraph bool
19-
proxyCertPath string
20-
collectorConfigPath string
21-
extraHosts []string
22-
output string
23-
pullImages bool
24-
volumes []string
25-
timeout time.Duration
26-
local string
15+
file string
16+
cache string
17+
debugging bool
18+
flamegraph bool
19+
proxyCertPath string
20+
collectorConfigPath string
21+
extraHosts []string
22+
output string
23+
pullImages bool
24+
verifyImageSignatures bool
25+
volumes []string
26+
timeout time.Duration
27+
local string
2728
}
2829

2930
// root flags

cmd/dependabot/internal/cmd/test.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,25 @@ func NewTestCommand() *cobra.Command {
3535
processInput(&scenario.Input, nil)
3636

3737
if err := executeTestJob(infra.RunParams{
38-
CacheDir: flags.cache,
39-
CollectorConfigPath: flags.collectorConfigPath,
40-
CollectorImage: collectorImage,
41-
Creds: scenario.Input.Credentials,
42-
Debug: flags.debugging,
43-
Expected: scenario.Output,
44-
ExtraHosts: flags.extraHosts,
45-
InputName: flags.file,
46-
InputRaw: inputRaw,
47-
Job: &scenario.Input.Job,
48-
LocalDir: flags.local,
49-
Output: flags.output,
50-
ProxyCertPath: flags.proxyCertPath,
51-
ProxyImage: proxyImage,
52-
PullImages: flags.pullImages,
53-
Timeout: flags.timeout,
54-
UpdaterImage: updaterImage,
55-
Volumes: flags.volumes,
38+
CacheDir: flags.cache,
39+
CollectorConfigPath: flags.collectorConfigPath,
40+
CollectorImage: collectorImage,
41+
Creds: scenario.Input.Credentials,
42+
Debug: flags.debugging,
43+
Expected: scenario.Output,
44+
ExtraHosts: flags.extraHosts,
45+
InputName: flags.file,
46+
InputRaw: inputRaw,
47+
Job: &scenario.Input.Job,
48+
LocalDir: flags.local,
49+
Output: flags.output,
50+
ProxyCertPath: flags.proxyCertPath,
51+
ProxyImage: proxyImage,
52+
PullImages: flags.pullImages,
53+
VerifyImageSignatures: flags.verifyImageSignatures,
54+
Timeout: flags.timeout,
55+
UpdaterImage: updaterImage,
56+
Volumes: flags.volumes,
5657
}); err != nil {
5758
log.Fatal(err)
5859
}
@@ -69,6 +70,7 @@ func NewTestCommand() *cobra.Command {
6970
cmd.Flags().StringVar(&flags.proxyCertPath, "proxy-cert", "", "path to a certificate the proxy will trust")
7071
cmd.Flags().StringVar(&flags.collectorConfigPath, "collector-config", "", "path to an OpenTelemetry collector config file")
7172
cmd.Flags().BoolVar(&flags.pullImages, "pull", true, "pull the image if it isn't present")
73+
cmd.Flags().BoolVar(&flags.verifyImageSignatures, "verify", true, "verify image signatures")
7274
cmd.Flags().BoolVar(&flags.debugging, "debug", false, "run an interactive shell inside the updater")
7375
cmd.Flags().StringArrayVarP(&flags.volumes, "volume", "v", nil, "mount volumes in Docker")
7476
cmd.Flags().StringArrayVar(&flags.extraHosts, "extra-hosts", nil, "Docker extra hosts setting on the proxy")

cmd/dependabot/internal/cmd/update.go

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,27 @@ func NewUpdateCommand() *cobra.Command {
8181
}
8282

8383
if err := infra.Run(infra.RunParams{
84-
CacheDir: flags.cache,
85-
CollectorConfigPath: flags.collectorConfigPath,
86-
CollectorImage: collectorImage,
87-
Creds: input.Credentials,
88-
Debug: flags.debugging,
89-
Flamegraph: flags.flamegraph,
90-
Expected: nil, // update subcommand doesn't use expectations
91-
ExtraHosts: flags.extraHosts,
92-
InputName: flags.file,
93-
Job: &input.Job,
94-
LocalDir: flags.local,
95-
Output: flags.output,
96-
ProxyCertPath: flags.proxyCertPath,
97-
ProxyImage: proxyImage,
98-
PullImages: flags.pullImages,
99-
Timeout: flags.timeout,
100-
UpdaterImage: updaterImage,
101-
Volumes: flags.volumes,
102-
Writer: writer,
103-
ApiUrl: flags.apiUrl,
84+
CacheDir: flags.cache,
85+
CollectorConfigPath: flags.collectorConfigPath,
86+
CollectorImage: collectorImage,
87+
Creds: input.Credentials,
88+
Debug: flags.debugging,
89+
Flamegraph: flags.flamegraph,
90+
Expected: nil, // update subcommand doesn't use expectations
91+
ExtraHosts: flags.extraHosts,
92+
InputName: flags.file,
93+
Job: &input.Job,
94+
LocalDir: flags.local,
95+
Output: flags.output,
96+
ProxyCertPath: flags.proxyCertPath,
97+
ProxyImage: proxyImage,
98+
PullImages: flags.pullImages,
99+
VerifyImageSignatures: flags.verifyImageSignatures,
100+
Timeout: flags.timeout,
101+
UpdaterImage: updaterImage,
102+
Volumes: flags.volumes,
103+
Writer: writer,
104+
ApiUrl: flags.apiUrl,
104105
}); err != nil {
105106
if errors.Is(err, context.DeadlineExceeded) {
106107
log.Fatalf("update timed out after %s", flags.timeout)
@@ -126,6 +127,7 @@ func NewUpdateCommand() *cobra.Command {
126127
cmd.Flags().StringVar(&flags.proxyCertPath, "proxy-cert", "", "path to a certificate the proxy will trust")
127128
cmd.Flags().StringVar(&flags.collectorConfigPath, "collector-config", "", "path to an OpenTelemetry collector config file")
128129
cmd.Flags().BoolVar(&flags.pullImages, "pull", true, "pull the image if it isn't present")
130+
cmd.Flags().BoolVar(&flags.verifyImageSignatures, "verify-signatures", true, "verify image signatures using cosign")
129131
cmd.Flags().BoolVar(&flags.debugging, "debug", false, "run an interactive shell inside the updater")
130132
cmd.Flags().BoolVar(&flags.flamegraph, "flamegraph", false, "generate a flamegraph and other metrics")
131133
cmd.Flags().StringArrayVarP(&flags.volumes, "volume", "v", nil, "mount volumes in Docker")

go.mod

Lines changed: 174 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,212 @@
11
module github.com/dependabot/cli
22

3-
go 1.22.3
3+
go 1.23.4
4+
5+
toolchain go1.23.5
46

57
require (
68
github.com/MakeNowJust/heredoc v1.0.0
7-
github.com/docker/cli v27.3.1+incompatible
8-
github.com/docker/docker v27.3.1+incompatible
9+
github.com/docker/cli v27.5.0+incompatible
10+
github.com/docker/docker v27.5.0+incompatible
11+
github.com/google/go-containerregistry v0.20.3
912
github.com/goware/prefixer v0.0.0-20160118172347-395022866408
1013
github.com/hexops/gotextdiff v1.0.3
1114
github.com/moby/moby v27.3.1+incompatible
1215
github.com/moby/sys/signal v0.7.1
16+
github.com/sigstore/cosign/v2 v2.4.2
1317
github.com/spf13/cobra v1.8.1
1418
gopkg.in/yaml.v3 v3.0.1
1519
rsc.io/script v0.0.2
1620
)
1721

1822
require (
23+
cloud.google.com/go/compute/metadata v0.6.0 // indirect
1924
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
20-
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
25+
github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/provider v0.14.0 // indirect
26+
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
27+
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
28+
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
29+
github.com/Azure/go-autorest/autorest v0.11.29 // indirect
30+
github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect
31+
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect
32+
github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect
33+
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
34+
github.com/Azure/go-autorest/logger v0.2.1 // indirect
35+
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
2136
github.com/Microsoft/go-winio v0.6.2 // indirect
37+
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect
38+
github.com/ThalesIgnite/crypto11 v1.2.5 // indirect
39+
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect
40+
github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect
41+
github.com/alibabacloud-go/cr-20181201 v1.0.10 // indirect
42+
github.com/alibabacloud-go/darabonba-openapi v0.2.1 // indirect
43+
github.com/alibabacloud-go/debug v1.0.0 // indirect
44+
github.com/alibabacloud-go/endpoint-util v1.1.1 // indirect
45+
github.com/alibabacloud-go/openapi-util v0.1.0 // indirect
46+
github.com/alibabacloud-go/tea v1.2.1 // indirect
47+
github.com/alibabacloud-go/tea-utils v1.4.5 // indirect
48+
github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
49+
github.com/aliyun/credentials-go v1.3.2 // indirect
50+
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
51+
github.com/aws/aws-sdk-go-v2 v1.34.0 // indirect
52+
github.com/aws/aws-sdk-go-v2/config v1.29.2 // indirect
53+
github.com/aws/aws-sdk-go-v2/credentials v1.17.55 // indirect
54+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.25 // indirect
55+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29 // indirect
56+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29 // indirect
57+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
58+
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 // indirect
59+
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect
60+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
61+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.10 // indirect
62+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.12 // indirect
63+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.11 // indirect
64+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.10 // indirect
65+
github.com/aws/smithy-go v1.22.2 // indirect
66+
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect
67+
github.com/blang/semver v3.5.1+incompatible // indirect
68+
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect
69+
github.com/clbanning/mxj/v2 v2.7.0 // indirect
70+
github.com/cloudflare/circl v1.3.7 // indirect
71+
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect
2272
github.com/containerd/log v0.1.0 // indirect
73+
github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect
74+
github.com/coreos/go-oidc/v3 v3.12.0 // indirect
75+
github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect
76+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
77+
github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect
78+
github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect
79+
github.com/dimchansky/utfbom v1.1.1 // indirect
2380
github.com/distribution/reference v0.6.0 // indirect
81+
github.com/docker/distribution v2.8.3+incompatible // indirect
82+
github.com/docker/docker-credential-helpers v0.8.2 // indirect
2483
github.com/docker/go-connections v0.5.0 // indirect
2584
github.com/docker/go-units v0.5.0 // indirect
85+
github.com/dustin/go-humanize v1.0.1 // indirect
86+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
2687
github.com/felixge/httpsnoop v1.0.4 // indirect
88+
github.com/fsnotify/fsnotify v1.8.0 // indirect
89+
github.com/go-chi/chi v4.1.2+incompatible // indirect
90+
github.com/go-jose/go-jose/v3 v3.0.3 // indirect
91+
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
2792
github.com/go-logr/logr v1.4.2 // indirect
2893
github.com/go-logr/stdr v1.2.2 // indirect
94+
github.com/go-openapi/analysis v0.23.0 // indirect
95+
github.com/go-openapi/errors v0.22.0 // indirect
96+
github.com/go-openapi/jsonpointer v0.21.0 // indirect
97+
github.com/go-openapi/jsonreference v0.21.0 // indirect
98+
github.com/go-openapi/loads v0.22.0 // indirect
99+
github.com/go-openapi/runtime v0.28.0 // indirect
100+
github.com/go-openapi/spec v0.21.0 // indirect
101+
github.com/go-openapi/strfmt v0.23.0 // indirect
102+
github.com/go-openapi/swag v0.23.0 // indirect
103+
github.com/go-openapi/validate v0.24.0 // indirect
29104
github.com/gogo/protobuf v1.3.2 // indirect
105+
github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
106+
github.com/golang/protobuf v1.5.4 // indirect
107+
github.com/golang/snappy v0.0.4 // indirect
108+
github.com/google/certificate-transparency-go v1.3.1 // indirect
109+
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
110+
github.com/google/go-github/v55 v55.0.0 // indirect
111+
github.com/google/go-querystring v1.1.0 // indirect
112+
github.com/google/gofuzz v1.2.0 // indirect
113+
github.com/google/uuid v1.6.0 // indirect
114+
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
115+
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
116+
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
117+
github.com/imdario/mergo v0.3.16 // indirect
118+
github.com/in-toto/in-toto-golang v0.9.0 // indirect
30119
github.com/inconshreveable/mousetrap v1.1.0 // indirect
120+
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect
121+
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 // indirect
122+
github.com/josharian/intern v1.0.0 // indirect
123+
github.com/json-iterator/go v1.1.12 // indirect
31124
github.com/klauspost/compress v1.17.11 // indirect
32-
github.com/kr/pretty v0.3.1 // indirect
125+
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect
126+
github.com/magiconair/properties v1.8.9 // indirect
127+
github.com/mailru/easyjson v0.7.7 // indirect
128+
github.com/miekg/pkcs11 v1.1.1 // indirect
129+
github.com/mitchellh/go-homedir v1.1.0 // indirect
130+
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect
33131
github.com/moby/docker-image-spec v1.3.1 // indirect
34132
github.com/moby/patternmatcher v0.6.0 // indirect
35133
github.com/moby/sys/sequential v0.6.0 // indirect
36134
github.com/moby/sys/user v0.3.0 // indirect
37135
github.com/moby/sys/userns v0.1.0 // indirect
38-
github.com/moby/term v0.5.0 // indirect
39-
github.com/morikuni/aec v1.0.0 // indirect
136+
github.com/moby/term v0.5.2 // indirect
137+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
138+
github.com/modern-go/reflect2 v1.0.2 // indirect
139+
github.com/mozillazg/docker-credential-acr-helper v0.4.0 // indirect
140+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
141+
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect
142+
github.com/oklog/ulid v1.3.1 // indirect
40143
github.com/opencontainers/go-digest v1.0.0 // indirect
41144
github.com/opencontainers/image-spec v1.1.0 // indirect
145+
github.com/opentracing/opentracing-go v1.2.0 // indirect
146+
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
42147
github.com/pkg/errors v0.9.1 // indirect
43-
github.com/rogpeppe/go-internal v1.13.1 // indirect
148+
github.com/sagikazarmark/locafero v0.4.0 // indirect
149+
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
150+
github.com/sassoftware/relic v7.2.1+incompatible // indirect
151+
github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect
152+
github.com/segmentio/ksuid v1.0.4 // indirect
153+
github.com/shibumi/go-pathspec v1.3.0 // indirect
154+
github.com/sigstore/fulcio v1.6.6 // indirect
155+
github.com/sigstore/protobuf-specs v0.4.0 // indirect
156+
github.com/sigstore/rekor v1.3.9 // indirect
157+
github.com/sigstore/sigstore v1.8.12 // indirect
158+
github.com/sigstore/timestamp-authority v1.2.4 // indirect
44159
github.com/sirupsen/logrus v1.9.3 // indirect
45-
github.com/spf13/pflag v1.0.5 // indirect
46-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect
47-
go.opentelemetry.io/otel v1.31.0 // indirect
48-
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
49-
go.opentelemetry.io/otel/metric v1.31.0 // indirect
50-
go.opentelemetry.io/otel/sdk v1.31.0 // indirect
51-
go.opentelemetry.io/otel/trace v1.31.0 // indirect
52-
golang.org/x/sys v0.26.0 // indirect
53-
golang.org/x/time v0.7.0 // indirect
54-
golang.org/x/tools v0.26.0 // indirect
55-
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
160+
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
161+
github.com/sourcegraph/conc v0.3.0 // indirect
162+
github.com/spf13/afero v1.11.0 // indirect
163+
github.com/spf13/cast v1.7.0 // indirect
164+
github.com/spf13/pflag v1.0.6 // indirect
165+
github.com/spf13/viper v1.19.0 // indirect
166+
github.com/subosito/gotenv v1.6.0 // indirect
167+
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
168+
github.com/thales-e-security/pool v0.0.2 // indirect
169+
github.com/theupdateframework/go-tuf v0.7.0 // indirect
170+
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
171+
github.com/tjfoc/gmsm v1.4.1 // indirect
172+
github.com/transparency-dev/merkle v0.0.2 // indirect
173+
github.com/vbatts/tar-split v0.11.6 // indirect
174+
gitlab.com/gitlab-org/api/client-go v0.121.0 // indirect
175+
go.mongodb.org/mongo-driver v1.14.0 // indirect
176+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
177+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
178+
go.opentelemetry.io/otel v1.34.0 // indirect
179+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
180+
go.opentelemetry.io/otel/metric v1.34.0 // indirect
181+
go.opentelemetry.io/otel/trace v1.34.0 // indirect
182+
go.opentelemetry.io/proto/otlp v1.4.0 // indirect
183+
go.uber.org/multierr v1.11.0 // indirect
184+
go.uber.org/zap v1.27.0 // indirect
185+
golang.org/x/crypto v0.32.0 // indirect
186+
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect
187+
golang.org/x/mod v0.22.0 // indirect
188+
golang.org/x/net v0.34.0 // indirect
189+
golang.org/x/oauth2 v0.25.0 // indirect
190+
golang.org/x/sync v0.10.0 // indirect
191+
golang.org/x/sys v0.29.0 // indirect
192+
golang.org/x/term v0.28.0 // indirect
193+
golang.org/x/text v0.21.0 // indirect
194+
golang.org/x/time v0.9.0 // indirect
195+
golang.org/x/tools v0.29.0 // indirect
196+
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
197+
google.golang.org/protobuf v1.36.4 // indirect
198+
gopkg.in/inf.v0 v0.9.1 // indirect
199+
gopkg.in/ini.v1 v1.67.0 // indirect
200+
gopkg.in/yaml.v2 v2.4.0 // indirect
56201
gotest.tools/v3 v3.5.1 // indirect
202+
k8s.io/api v0.28.3 // indirect
203+
k8s.io/apimachinery v0.28.3 // indirect
204+
k8s.io/client-go v0.28.3 // indirect
205+
k8s.io/klog/v2 v2.130.1 // indirect
206+
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
207+
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect
208+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
209+
sigs.k8s.io/release-utils v0.11.0 // indirect
210+
sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect
211+
sigs.k8s.io/yaml v1.4.0 // indirect
57212
)

0 commit comments

Comments
 (0)