Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(deps): update module github.com/sigstore/cosign/v2 to v2.2.4 [security] #2437

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Apr 11, 2024

Mend Renovate

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
github.com/sigstore/cosign/v2 v2.2.3 -> v2.2.4 age adoption passing confidence

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.

GitHub Vulnerability Alerts

CVE-2024-29902

Summary

A remote image with a malicious attachment can cause denial of service of the host machine running Cosign. This can impact other services on the machine that rely on having memory available such as a Redis database which can result in data loss. It can also impact the availability of other services on the machine that will not be available for the duration of the machine denial.

Details

The root cause of this issue is that Cosign reads the attachment from a remote image entirely into memory without checking the size of the attachment first. As such, a large attachment can make Cosign read a large attachment into memory; If the attachments size is larger than the machine has memory available, the machine will be denied of service. The Go runtime will make a SIGKILL after a few seconds of system-wide denial.

The root cause is that Cosign reads the contents of the attachments entirely into memory on line 238 below:

https://github.com/sigstore/cosign/blob/9bc3ee309bf35d2f6e17f5d23f231a3d8bf580bc/pkg/oci/remote/remote.go#L228-L239

...and prior to that, neither Cosign nor go-containerregistry checks the size of the attachment and enforces a max cap. In the case of a remote layer of f *attached, go-containerregistry will invoke this API:

https://github.com/google/go-containerregistry/blob/a0658aa1d0cc7a7f1bcc4a3af9155335b6943f40/pkg/v1/remote/layer.go#L36-L40

func (rl *remoteLayer) Compressed() (io.ReadCloser, error) {
	// We don't want to log binary layers -- this can break terminals.
	ctx := redact.NewContext(rl.ctx, "omitting binary blobs from logs")
	return rl.fetcher.fetchBlob(ctx, verify.SizeUnknown, rl.digest)
}

Notice that the second argument to rl.fetcher.fetchBlob is verify.SizeUnknown which results in not using the io.LimitReader in verify.ReadCloser:
https://github.com/google/go-containerregistry/blob/a0658aa1d0cc7a7f1bcc4a3af9155335b6943f40/internal/verify/verify.go#L82-L100

func ReadCloser(r io.ReadCloser, size int64, h v1.Hash) (io.ReadCloser, error) {
	w, err := v1.Hasher(h.Algorithm)
	if err != nil {
		return nil, err
	}
	r2 := io.TeeReader(r, w) // pass all writes to the hasher.
	if size != SizeUnknown {
		r2 = io.LimitReader(r2, size) // if we know the size, limit to that size.
	}
	return &and.ReadCloser{
		Reader: &verifyReader{
			inner:    r2,
			hasher:   w,
			expected: h,
			wantSize: size,
		},
		CloseFunc: r.Close,
	}, nil
}

Impact

This issue can allow a supply-chain escalation from a compromised registry to the Cosign user: If an attacher has compromised a registry or the account of an image vendor, they can include a malicious attachment and hurt the image consumer.

Remediation

Update to the latest version of Cosign, which limits the number of attachments. An environment variable can override this value.

CVE-2024-29903

Maliciously-crafted software artifacts can cause denial of service of the machine running Cosign, thereby impacting all services on the machine. The root cause is that Cosign creates slices based on the number of signatures, manifests or attestations in untrusted artifacts. As such, the untrusted artifact can control the amount of memory that Cosign allocates.

As an example, these lines demonstrate the problem:

https://github.com/sigstore/cosign/blob/286a98a4a99c1b2f32f84b0d560e324100312280/pkg/oci/remote/signatures.go#L56-L70

This Get() method gets the manifest of the image, allocates a slice equal to the length of the layers in the manifest, loops through the layers and adds a new signature to the slice.

The exact issue is Cosign allocates excessive memory on the lines that creates a slice of the same length as the manifests.

Remediation

Update to the latest version of Cosign, where the number of attestations, signatures and manifests has been limited to a reasonable value.

Cosign PoC

In the case of this API (also referenced above):

https://github.com/sigstore/cosign/blob/286a98a4a99c1b2f32f84b0d560e324100312280/pkg/oci/remote/signatures.go#L56-L70

… The first line can contain a length that is safe for the system and will not throw a runtime panic or be blocked by other safety mechanisms. For the sake of argument, let’s say that the length of m, err := s.Manifest() is the max allowed (by the machine without throwing OOM panics) manifests minus 1. When Cosign then allocates a new slice on this line: signatures := make([]oci.Signature, 0, len(m.Layers)), Cosign will allocate more memory than is available and the machine will be denied of service, causing Cosign and all other services on the machine to be unavailable.

To illustrate the issue here, we run a modified version of TestSignedImageIndex() in pkg/oci/remote:

https://github.com/sigstore/cosign/blob/14795db16417579fac0c00c11e166868d7976b61/pkg/oci/remote/index_test.go#L31-L57

Here, wantLayers is the number of manifests from these lines:

https://github.com/sigstore/cosign/blob/286a98a4a99c1b2f32f84b0d560e324100312280/pkg/oci/remote/signatures.go#L56-L60

To test this, we want to make wantLayers high enough to not cause a memory on its own but still trigger the machine-wide OOM when a slice gets create with the same length. On my local machine, it would take hours to create a slice of layers that fulfils that criteria, so instead I modify the Cosign production code to reflect a long list of manifests:

// Get implements oci.Signatures
func (s *sigs) Get() ([]oci.Signature, error) {
        m, err := s.Manifest()
        if err != nil {
                return nil, err
        }
        // Here we imitate a long list of manifests
        ms := make([]byte, 2600000000) // imitate a long list of manifests
        signatures := make([]oci.Signature, 0, len(ms))
        panic("Done")
        //signatures := make([]oci.Signature, 0, len(m.Layers))
        for _, desc := range m.Layers {

With this modified code, if we can cause an OOM without triggering the panic("Done"), we have succeeded.


Release Notes

sigstore/cosign (github.com/sigstore/cosign/v2)

v2.2.4

Compare Source

Bug Fixes

Features

  • Adds Support for Fulcio Client Credentials Flow, and Argument to Set Flow Explicitly (#​3578)

Documentation

  • add oci bundle spec (#​3622)
  • Correct help text of triangulate cmd (#​3551)
  • Correct help text of verify-attestation policy argument (#​3527)
  • feat: add OVHcloud MPR registry tested with cosign (#​3639)

Testing

  • Refactor e2e-tests.yml workflow (#​3627)
  • Clean up and clarify e2e scripts (#​3628)
  • Don't ignore transparency log in tests if possible (#​3528)
  • Make E2E tests hermetic (#​3499)
  • add e2e test for pkcs11 token signing (#​3495)

Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate. View repository job log here.

Copy link

netlify bot commented Apr 11, 2024

Deploy Preview for zarf-docs canceled.

Name Link
🔨 Latest commit 40dcee9
🔍 Latest deploy log https://app.netlify.com/sites/zarf-docs/deploys/6669bbc555abc10008467bee

@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 5 times, most recently from 4ff5ef7 to 0bb6f5a Compare April 15, 2024 21:56
@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 5 times, most recently from 555a477 to a0f4776 Compare April 24, 2024 18:22
@renovate renovate bot requested a review from a team as a code owner April 24, 2024 18:22
@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 9 times, most recently from 1c8b982 to 528ab07 Compare April 29, 2024 19:48
@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 3 times, most recently from 940fad1 to 3974acf Compare May 6, 2024 15:20
@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 11 times, most recently from 40c0149 to 4d39f28 Compare June 3, 2024 20:16
Copy link
Contributor Author

renovate bot commented Jun 5, 2024

ℹ Artifact update notice

File name: go.mod

In order to perform the update(s) described in the table above, Renovate ran the go get command, which resulted in the following additional change(s):

  • 56 additional dependencies were updated

Details:

Package Change
github.com/google/go-containerregistry v0.19.0 -> v0.19.1
github.com/prometheus/client_golang v1.18.0 -> v1.19.0
github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1 -> v1.8.3
github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1 -> v1.8.3
github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.1 -> v1.8.3
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.1 -> v1.8.3
github.com/evanphx/json-patch/v5 v5.6.0 -> v5.6.0
cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13 -> v0.0.0-20240314152124-224736b49f2e
cuelang.org/go v0.7.0 -> v0.8.1
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 -> v1.10.0
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 -> v1.5.2
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 -> v1.1.0
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 -> v1.2.2
github.com/aws/aws-sdk-go-v2 v1.24.1 -> v1.26.0
github.com/aws/aws-sdk-go-v2/config v1.26.6 -> v1.27.9
github.com/aws/aws-sdk-go-v2/credentials v1.16.16 -> v1.17.9
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 -> v1.16.0
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 -> v1.3.4
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 -> v2.6.4
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 -> v1.8.0
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 -> v1.11.1
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 -> v1.11.6
github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 -> v1.30.0
github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 -> v1.20.3
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 -> v1.23.3
github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 -> v1.28.5
github.com/aws/smithy-go v1.19.0 -> v1.20.1
github.com/containerd/containerd v1.7.12 -> v1.7.14
github.com/containerd/ttrpc v1.2.2 -> v1.2.3
github.com/coreos/go-oidc/v3 v3.9.0 -> v3.10.0
github.com/go-openapi/analysis v0.22.0 -> v0.23.0
github.com/go-openapi/errors v0.21.0 -> v0.22.0
github.com/go-openapi/jsonpointer v0.20.2 -> v0.21.0
github.com/go-openapi/jsonreference v0.20.4 -> v0.21.0
github.com/go-openapi/loads v0.21.5 -> v0.22.0
github.com/go-openapi/runtime v0.27.1 -> v0.28.0
github.com/go-openapi/spec v0.20.13 -> v0.21.0
github.com/go-openapi/strfmt v0.22.0 -> v0.23.0
github.com/go-openapi/swag v0.22.9 -> v0.23.0
github.com/go-openapi/validate v0.22.4 -> v0.24.0
github.com/golang-jwt/jwt/v5 v5.2.0 -> v5.2.1
github.com/google/certificate-transparency-go v1.1.7 -> v1.1.8
github.com/hashicorp/vault/api v1.10.0 -> v1.12.2
github.com/jellydator/ttlcache/v3 v3.1.1 -> v3.2.0
github.com/open-policy-agent/opa v0.61.0 -> v0.63.0
github.com/prometheus/client_model v0.5.0 -> v0.6.0
github.com/prometheus/common v0.45.0 -> v0.51.1
github.com/sigstore/fulcio v1.4.3 -> v1.4.5
github.com/sigstore/rekor v1.3.4 -> v1.3.6
github.com/sigstore/sigstore v1.8.1 -> v1.8.3
github.com/sigstore/timestamp-authority v1.2.1 -> v1.2.2
github.com/spiffe/go-spiffe/v2 v2.1.7 -> v2.2.0
github.com/xanzy/go-gitlab v0.96.0 -> v0.102.0
go.mongodb.org/mongo-driver v1.13.1 -> v1.14.0
go.step.sm/crypto v0.42.1 -> v0.44.2
go.uber.org/zap v1.26.0 -> v1.27.0

@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch 16 times, most recently from 73063ab to 7326cf8 Compare June 11, 2024 20:13
@renovate renovate bot force-pushed the renovate/go-github.com/sigstore/cosign/v2-vulnerability branch from 7326cf8 to 40dcee9 Compare June 12, 2024 15:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
No open projects
Status: New
Development

Successfully merging this pull request may close these issues.

None yet

0 participants