Skip to content

Commit 3ae0ae5

Browse files
committed
Use c/i/types.UnparsedImage for signature verification
i.e. defer parsing of the manifest to obtain the config digest only after the signatures have been verified.
1 parent ad2dd40 commit 3ae0ae5

File tree

3 files changed

+31
-20
lines changed

3 files changed

+31
-20
lines changed

distribution/pull_v2.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import (
1313

1414
"github.com/Sirupsen/logrus"
1515
cimagedocker "github.com/containers/image/docker"
16+
ciImage "github.com/containers/image/image"
1617
"github.com/containers/image/signature"
17-
"github.com/containers/image/types"
1818
"github.com/docker/distribution"
1919
"github.com/docker/distribution/digest"
2020
"github.com/docker/distribution/manifest/manifestlist"
@@ -100,10 +100,11 @@ func (p *v2Puller) pullV2Repository(ctx context.Context, ref reference.Named) (e
100100
var layersDownloaded bool
101101
if !reference.IsNameOnly(ref) {
102102
var err error
103-
ciImage, err := p.ciImage(ctx, ref)
103+
ciImage, closer, err := p.ciImage(ctx, ref)
104104
if err != nil {
105105
return err
106106
}
107+
defer closer.Close()
107108
if p.config.SignatureCheck {
108109
ref, err = p.checkTrusted(ref, ciImage)
109110
if err != nil {
@@ -140,10 +141,11 @@ func (p *v2Puller) pullV2Repository(ctx context.Context, ref reference.Named) (e
140141
}
141142
var ref reference.Named
142143
ref = tagRef
143-
ciImage, err := p.ciImage(ctx, ref)
144+
ciImage, closer, err := p.ciImage(ctx, ref)
144145
if err != nil {
145146
return err
146147
}
148+
defer closer.Close()
147149
if p.config.SignatureCheck {
148150
trustedRef, err := p.checkTrusted(tagRef, ciImage)
149151
if err != nil {
@@ -375,7 +377,7 @@ func (ld *v2LayerDescriptor) Registered(diffID layer.DiffID) {
375377
ld.V2MetadataService.Add(diffID, metadata.V2Metadata{Digest: ld.digest, SourceRepository: ld.repoInfo.FullName()})
376378
}
377379

378-
func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named, ciImage types.Image) (tagUpdated bool, err error) {
380+
func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named, ciImage *ciImage.UnparsedImage) (tagUpdated bool, err error) {
379381
manSvc, err := p.repo.Manifests(ctx)
380382
if err != nil {
381383
return false, err

distribution/pull_v2_unix.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ package distribution
44

55
import (
66
"fmt"
7+
"io"
78
"path/filepath"
89

910
"github.com/containers/image/docker"
1011
"github.com/containers/image/docker/daemon/signatures"
1112
containersImageRef "github.com/containers/image/docker/reference"
13+
ciImage "github.com/containers/image/image"
1214
"github.com/containers/image/manifest"
1315
"github.com/containers/image/signature"
1416
"github.com/containers/image/types"
@@ -44,19 +46,19 @@ func configurePolicyContext() (*signature.PolicyContext, error) {
4446
return pc, nil
4547
}
4648

47-
// ciImage returns a containers/image/types.Image for ref.
48-
func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (types.Image, error) {
49+
// ciImage returns a *containers/image/image.UnparsedImage and a close callback for ref.
50+
func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (*ciImage.UnparsedImage, io.Closer, error) {
4951
// we can't use upstream docker/docker/reference since in projectatomic/docker
5052
// we modified docker/docker/reference and it's not doing any normalization.
5153
// we instead forked docker/docker/reference in containers/image and we need
5254
// this parsing here to make sure signature naming checks are consistent.
5355
dockerRef, err := containersImageRef.ParseNormalizedNamed(ref.String())
5456
if err != nil {
55-
return nil, err
57+
return nil, nil, err
5658
}
5759
imgRef, err := docker.NewReference(dockerRef)
5860
if err != nil {
59-
return nil, err
61+
return nil, nil, err
6062
}
6163
isSecure := (p.endpoint.TLSConfig == nil || !p.endpoint.TLSConfig.InsecureSkipVerify)
6264
authConfig := registry.ResolveAuthConfig(p.config.AuthConfigs, p.repoInfo.Index)
@@ -73,16 +75,17 @@ func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (types.Image, er
7375
if p.config.RegistryService.SecureIndex(p.repoInfo.Index.Name) {
7476
ctx.DockerCertPath = filepath.Join(registry.CertsDir, p.repoInfo.Index.Name)
7577
}
76-
img, err := imgRef.NewImage(ctx)
78+
src, err := imgRef.NewImageSource(ctx)
7779
if err != nil {
78-
return nil, err
80+
return nil, nil, err
7981
}
80-
return img, nil
82+
unparsed := ciImage.UnparsedInstance(src, nil)
83+
return unparsed, src, nil
8184
}
8285

83-
func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (reference.Named, error) {
86+
func (p *v2Puller) checkTrusted(ref reference.Named, unparsed types.UnparsedImage) (reference.Named, error) {
8487
p.originalRef = ref
85-
allowed, err := p.policyContext.IsRunningImageAllowed(ciImage)
88+
allowed, err := p.policyContext.IsRunningImageAllowed(unparsed)
8689
if !allowed {
8790
if err != nil {
8891
return nil, fmt.Errorf("%s isn't allowed: %v", ref.String(), err)
@@ -92,7 +95,7 @@ func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (refer
9295
if err != nil {
9396
return nil, err
9497
}
95-
mfst, _, err := ciImage.Manifest()
98+
mfst, _, err := unparsed.Manifest()
9699
if err != nil {
97100
return nil, err
98101
}
@@ -108,7 +111,11 @@ func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (refer
108111
}
109112

110113
// storeSignature stores the signatures of ciImage and updates the tag in ciImage.Reference() if necessary.
111-
func (p *v2Puller) storeSignatures(c gctx.Context, ciImage types.Image) error {
114+
func (p *v2Puller) storeSignatures(c gctx.Context, unparsed *ciImage.UnparsedImage) error {
115+
img, err := ciImage.FromUnparsedImage(nil, unparsed)
116+
if err != nil {
117+
return err
118+
}
112119
store := signatures.NewStore(nil)
113-
return store.RecordImage(c, ciImage)
120+
return store.RecordImage(c, img)
114121
}

distribution/pull_v2_windows.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ package distribution
55
import (
66
"encoding/json"
77
"fmt"
8+
"io"
89
"net/http"
910
"os"
1011

12+
ciImage "github.com/containers/image/image"
1113
"github.com/containers/image/signature"
1214
"github.com/containers/image/types"
1315
"github.com/docker/distribution"
@@ -76,14 +78,14 @@ func configurePolicyContext() (*signature.PolicyContext, error) {
7678
return nil, nil
7779
}
7880

79-
func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (types.Image, error) {
80-
return nil, nil
81+
func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (*ciImage.UnparsedImage, io.Closer, error) {
82+
return nil, nil, nil
8183
}
8284

83-
func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (reference.Named, error) {
85+
func (p *v2Puller) checkTrusted(ref reference.Named, unparsed types.UnparsedImage) (reference.Named, error) {
8486
return ref, nil
8587
}
8688

87-
func (p *v2Puller) storeSignatures(c gctx.Context, ciImage types.Image) error {
89+
func (p *v2Puller) storeSignatures(c gctx.Context, unparsed *ciImage.UnparsedImage) error {
8890
return nil
8991
}

0 commit comments

Comments
 (0)