Skip to content

chore(deps): update module github.com/distribution/distribution/v3 to v3.1.1 [security]#1454

Merged
paralta merged 2 commits into
mainfrom
renovate/go-github.com-distribution-distribution-v3-vulnerability
May 5, 2026
Merged

chore(deps): update module github.com/distribution/distribution/v3 to v3.1.1 [security]#1454
paralta merged 2 commits into
mainfrom
renovate/go-github.com-distribution-distribution-v3-vulnerability

Conversation

@agntcy-automation
Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
github.com/distribution/distribution/v3 v3.1.0v3.1.1 age confidence

Warning

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


Distribution's tag deletion bypasses storage.delete.enabled configuration

CVE-2026-41888 / GHSA-6pjf-3r9x-m592

More information

Details

Summary

Tag deletion via the DELETE /v2/<name>/manifests/<tag> endpoint bypasses the storage.delete.enabled: false configuration, allowing any API client to remove tags from repositories even when the operator has explicitly disabled deletion.

Details

When storage.delete.enabled is configured to false, digest-based manifest deletion is correctly rejected by the guard in registry/storage/linkedblobstore.go:212-215.

However, tag deletion takes a separate code path that never checks this setting:

In registry/handlers/manifests.go:439-453, DeleteManifest detects a tag reference, calls tagService.Untag(), returns, never consulting registry.deleteEnabled.

In turn, tagStore.Untag() calls the storage driver directly to delete the tag path without checking whether deletes are enabled.

PoC

Using a paired down Distribution configuration that explicitly disables deletes, such as this one, stored as config.yaml:

version: 0.1
storage:
  delete:
    enabled: false
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000

Start a local Distribution, mounting in the above configuration from the current directory:

docker run -p 5000:5000 -v "$(pwd)/config.yaml":/config.yaml --restart=always --name registry registry:3.1.0 /config.yaml

In a separate terminal session/tab, push alpine:3.23 into the running instance:

docker pull alpine:3.23
docker tag alpine:3.23 localhost:5000/alpine:3.23
docker push localhost:5000/alpine:3.23

Confirm that the tag shows up as expected:

curl 'http://localhost:5000/v2/alpine/tags/list'
{"name":"alpine","tags":["3.23"]}

Issue a delete for the 3.23 tag:

curl -X DELETE 'http://localhost:5000/v2/alpine/manifests/3.23'

Observe that the tag is now gone, despite deletes being disabled:

curl 'http://localhost:5000/v2/alpine/tags/list'
{"name":"alpine","tags":null}
Impact

This is an authorization bypass vulnerability. Any client with network access to the registry can delete tags despite the operator having disabled deletion. This can cause denial of service for consumers pulling by tag and enables supply-chain disruption by removing trusted tags from a registry that the operator and/or users believed to be immutable.

Severity

  • CVSS Score: 6.3 / 10 (Medium)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

distribution/distribution (github.com/distribution/distribution/v3)

v3.1.1

Compare Source

Welcome to the v3.1.1 release of registry!

This is a stable release

Please try out the release binaries and report any issues at
https://github.com/distribution/distribution/issues.

Notable Changes
  • Fixes CVE-2026-41888
  • Bounds-check the file basename in PurgeUploads Walk callback
  • Add S3 Express One Zone support to the S3 storage driver (#​4858)
  • Fix tag list endpoint in proxy mode (#​4846)
  • Clamp oversized n query parameter in proxy mode instead of returning 400 (#​4856)

See the full changelog below for the full list of changes.

What's Changed

New Contributors

Full Changelog: distribution/distribution@v3.1.0...v3.1.1

@agntcy-automation agntcy-automation Bot requested a review from a team as a code owner May 5, 2026 12:30
@agntcy-automation agntcy-automation Bot added go Pull requests that update go code security labels May 5, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 5, 2026

The latest Buf updates on your PR. Results from workflow Buf CI / verify-proto (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed⏩ skipped⏩ skipped✅ passedMay 5, 2026, 1:17 PM

@github-actions github-actions Bot added the size/XS Denotes a PR that changes 0-49 lines label May 5, 2026
Signed-off-by: Catarina Paralta <clouropa@cisco.com>
@paralta paralta merged commit 93aa38b into main May 5, 2026
57 of 59 checks passed
@paralta paralta deleted the renovate/go-github.com-distribution-distribution-v3-vulnerability branch May 5, 2026 13:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

go Pull requests that update go code security size/XS Denotes a PR that changes 0-49 lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant