Containerd has image-pull DoS via crafted OCI index graph amplificationGHSA-pg57-6jwg-q645
Fix: containerd/containerd@4f5f326GHSA-pg57-6jwg-q645 is a Uncontrolled Resource Consumption vulnerability in github.com/containerd/containerd/v2. A fix is available for github.com/containerd/containerd/v2 — see the affected versions and patch details below.
Exploitation Status
No confirmed exploitation observed yet
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
- CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.
Exploitation and automatability from CISA’s SSVC triage for GHSA-pg57-6jwg-q645.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
Real-World Exposure
github.com/containerd/containerd/v2🐹github.com/containerd/containerd🐹github.com/containerd/containerd/v2🐹github.com/containerd/containerd/v2🐹github.com/containerd/containerd/v2Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.
Description
Impact
A vulnerability exists in containerd's image pull handlers where a crafted OCI image index containing deeply nested or heavily fanned-out descriptor graphs can cause unbounded CPU and memory consumption. During the PullImage operation, the recursive traversal and processing of child descriptors lack sufficient depth and breadth limits, and fail to adequately deduplicate identical descriptors. This unbounded traversal leads to excessive resource allocation.
Consequently, pulling a malicious image reference can result in prolonged stalls during container creation and significant resource pressure on the host system. This issue occurs entirely during the image pull phase, prior to any container execution.
Patches
This bug has been fixed in containerd 2.4.1, 2.3.6, 2.2.9, 2.0.13, and 1.7.36. Users should update to these versions to resolve the issue.
Workarounds
There are no known workarounds for this issue. Users are advised to only pull trusted images from known registries until the patch can be applied.
Credits
The containerd project would like to thank Jakub Ciolek at ElevenLabs and @jlgore who independently discovered and responsibly disclosed this issue in accordance with the containerd security policy.
For more information
If you have any questions or comments about this advisory:
- Open an issue in containerd
- Email us at [email protected]
To report a security issue in containerd:
- Report a new vulnerability
- Email us at [email protected]
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | github.com/containerd/containerd/v2 | ≥ 2.0.0&&< 2.0.13 | 2.0.13go get github.com/containerd/containerd/v2@v2.0.13 |
| 🐹Go | github.com/containerd/containerd | all versions | 1.7.36go get github.com/containerd/containerd@v1.7.36 |
| 🐹Go | github.com/containerd/containerd/v2 | ≥ 2.1.0&&< 2.2.9 | 2.2.9go get github.com/containerd/containerd/v2@v2.2.9 |
| 🐹Go | github.com/containerd/containerd/v2 | ≥ 2.3.0&&< 2.3.6 | 2.3.6go get github.com/containerd/containerd/v2@v2.3.6 |
| 🐹Go | github.com/containerd/containerd/v2 | ≥ 2.4.0&&< 2.4.1 | 2.4.1go get github.com/containerd/containerd/v2@v2.4.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/containerd/containerd/v2, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update github.com/containerd/containerd/v2 to 2.0.13 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-pg57-6jwg-q645 is resolved across your whole dependency graph.
Workarounds
Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.
Frequently Asked Questions
Is GHSA-pg57-6jwg-q645 in your dependencies?
Find it across Go, including transitive dependencies.