CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-53493

CVE-2026-53493: Uncontrolled Resource Consumption in containerd Image-Pull Descriptor Graph Resolution

Alon Barad
Alon Barad
Software Engineer

Sep 26, 2026·6 min read·3 visits

Executive Summary (TL;DR)

A crafted OCI index graph can force high CPU and memory usage during image pulls in containerd, leading to Denial of Service (DoS) and node instability.

containerd is an open-source container runtime. Prior to versions 1.7.36, 2.0.13, 2.2.9, 2.3.6, and 2.4.1, a crafted OCI index graph can force very high CPU/memory usage during PullImage (before container start), causing long ContainerCreating stalls and, at larger sizes, node/runtime instability. The vulnerability occurs because containerd's image-pull descriptor graph resolution handlers processed OCI image indices and manifests recursively without enforcing boundaries on traversal depth or breadth, and without maintaining a global visited registry to count duplicate references.

Vulnerability Overview

The containerd container runtime uses a content-addressable storage model to manage container images in compliance with the Open Container Initiative (OCI) Image Specification. Images are represented as directed acyclic graphs (DAGs) comprising descriptors that point to other manifests, configurations, or layer blobs. When pulling an image, the daemon must traverse this descriptor hierarchy to determine which artifacts must be retrieved and processed.

Historically, this traversal was executed recursively through the Dispatch and Walk handlers located in core/images/handlers.go. The implementation allowed client-provided manifest indexes to dictate the depth and breadth of the resolution process without enforcing limits. This unconstrained path exploration represents a significant attack surface in any multi-tenant container orchestration platform.

If an untrusted image index is processed during a pull request, the container runtime attempts to resolve all referenced descriptors. Because the resolution engine lacks a global tracking mechanism to detect and suppress duplicate or nested references, cyclic or heavily fanned-out graph structures can be used to induce severe resource exhaustion. This occurs before the container process is initialized or execution constraints are applied.

Root Cause Analysis

The core security vulnerability lies in the lack of depth boundaries and resource consumption accounting during the recursive resolution of image descriptors. The Walk function processed sibling resources synchronously but recurred indefinitely when encountering child descriptors. The Dispatch function utilized an errgroup.WithContext structure to spawn parallel Go goroutines for each resolved child, multiplying the concurrency overhead exponentially.

Without a global registry of already-visited content-addressable digests within a single dispatch transaction, the resolution system is vulnerable to path multiplication. An attacker can construct a directed graph where intermediate descriptors point back to ancestors or where nodes cross-reference each other in a diamond topology. Because each path is evaluated as a distinct task branch, the resolver performs excessive iterations on identical descriptor sub-trees.

This behavior matches the classic XML Entity Expansion attack template translated into OCI image manifest structures. Since goroutines are lightweight, the Go runtime scheduler is forced to manage thousands of parallel execution contexts. The resultant scheduling contention, context switching overhead, and rapid memory allocation pool exhaustion lead to a denial-of-service state on the host system.

Code Analysis

The fix introduces two primary mechanisms to eliminate uncontrolled recursion: a strict global reference threshold and a transition from recursive scheduling to an iterative breadth-first search (BFS). A hard ceiling of 10,000 maximum processed references is defined, and any attempt to exceed this threshold causes an immediate abort.

In the patched implementation of Walk, a dedicated walker struct maintains an internal referenceCount state across nested invocations:

type walker struct {
	referenceCount int
}
 
func (w *walker) walk(ctx context.Context, handler Handler, descs ...ocispec.Descriptor) error {
	if w.referenceCount+len(descs) > maxReferences {
		return fmt.Errorf("too many descriptors (limit %d): %w", maxReferences, errdefs.ErrResourceExhausted)
	}
	w.referenceCount += len(descs)
	// ... synchronous loop ...
}

The Dispatch function has been restructured to replace the recursive errgroup pattern with an iterative queue. The queue is managed via a level-by-level BFS loop that tracks reference counts under a synchronization mutex and enforces a concurrency ceiling of 32 parallel handlers when a custom limiter is omitted:

var (
	mu             sync.Mutex
	next           []ocispec.Descriptor
	referenceCount int
)
 
admit := func(descs []ocispec.Descriptor) error {
	mu.Lock()
	defer mu.Unlock()
	if referenceCount+len(descs) > maxReferences {
		return fmt.Errorf("too many descriptors (limit %d): %w", maxReferences, errdefs.ErrResourceExhausted)
	}
	referenceCount += len(descs)
	next = append(next, descs...)
	return nil
}

By flattening the traversal into a level-by-level loop and gating new additions via the admit function, the engine ensures that no deep nested recursion stacks are formed, and the total memory allocation remains bounded.

Exploitation Mechanics

An attack requires a container registry accessible to the target container engine. The attacker crafts an OCI image manifest containing recursive or wide fan-out structures. These structures are defined within the manifests list of an OCI Image Index, where the descriptor digests point to other nested manifest indexes instead of final container configuration blobs.

The following diagram illustrates the topological structure of a graph amplification attack, where multiple parent references point to shared child indexes, leading to exponential path expansion during recursive resolution:

When containerd receives a command to pull this image, it requests the root descriptor. As the parser descends into the nested indexes, it initiates parallel dispatches. Because of the diamond-shaped cross-references, identical nodes are resolved repeatedly. For example, if each layer has a fan-out factor of 10 and a depth of 5, the resolver attempts to process 100,000 descriptor branches. The concurrent routines thrash the host CPU cache, exhaust the kernel thread limit, and trigger the kernel Out-of-Memory (OOM) killer.

Impact Assessment

The security impact of CVE-2026-53493 is classified as a network-vector, low-complexity Denial of Service (DoS). While the vulnerability does not lead directly to remote code execution or privilege escalation, it compromises the availability of the entire container host. In multi-tenant environments, such as managed Kubernetes clusters, any tenant with permissions to deploy a pod can submit a malicious image reference.

When the kubelet instructs containerd to pull the malicious image, the runtime node locks up during the ContainerCreating phase. Because containerd is a shared system service, the local CPU and memory exhaustion prevents other healthy containers on the same worker node from running. The node eventually becomes unresponsive to orchestrator heartbeat signals.

The Kubernetes control plane then marks the affected worker node as NotReady and attempts to reschedule all running workloads to alternative nodes. If the malicious deployment spec is global or replicates across the cluster, the rescheduling action will propagate the exploit to healthy worker nodes. This sequential node crash behavior results in cluster-wide degradation.

Remediation & Hardening

The primary remediation path is to upgrade containerd to the patched releases: 1.7.36, 2.0.13, 2.2.9, 2.3.6, or 2.4.1. These versions enforce the 10,000 maximum reference ceiling and use iterative level-by-level BFS traversal to process descriptors safely.

For environments where immediate system upgrades are not feasible, network and administrative boundaries can be used to mitigate the risk. Organizations should configure private container registries and establish registry pull policies that restrict hosts to trusted, internal image registries. Implementing Admission Controllers to block deployment of images from unvalidated public domains is an effective preventative measure.

Additionally, implementing strict resource quotas on worker nodes and isolating the system daemon's resource allocations using systemd slices can help protect critical system services. Assigning containerd and kubelet to dedicated CPU sets or setting absolute memory limits prevents a guest-induced memory spike from causing host kernel starvation.

Official Patches

containerdOfficial Advisory and Patches

Technical Appendix

CVSS Score
6.9/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
EPSS Probability
0.36%
Top 73% most exploited

Affected Systems

containerd

Affected Versions Detail

Product
Affected Versions
Fixed Version
containerd
containerd
< 1.7.361.7.36
containerd
containerd
>= 2.0.0, < 2.0.132.0.13
containerd
containerd
>= 2.2.0, < 2.2.92.2.9
containerd
containerd
>= 2.3.0, < 2.3.62.3.6
containerd
containerd
>= 2.4.0, < 2.4.12.4.1
AttributeDetail
Vulnerability IDCVE-2026-53493
CWE IDCWE-400
Attack VectorNetwork
Privileges RequiredNone
CVSS Score6.9
Exploit StatusProof-of-Concept
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

The software does not properly control the allocation and maintenance of resources, specifically CPU and memory, during the recursive parsing of descriptor hierarchies.

Vulnerability Timeline

Initial security patch written, tested, and code boundaries validated
2026-07-28
Release branch preparation, dependency updates, and regression review
2026-09-16
CVE-2026-53493 published and security advisory GHSA-pg57-6jwg-q645 announced
2026-09-25

References & Sources

  • [1]NVD - CVE-2026-53493
  • [2]GitHub Security Advisory GHSA-pg57-6jwg-q645
  • [3]CVE.org - CVE-2026-53493

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•GHSA-62MM-XWMV-CRHG
7.5

GHSA-62MM-XWMV-CRHG: Unauthenticated Path Traversal in Khoj Static File Serving Endpoint

An unauthenticated path traversal vulnerability exists in the Khoj AI assistant platform via the static file serving endpoint `/home/{file_path:path}`. Due to improper path sanitization when handling user input with Python's pathlib module, a remote attacker can read arbitrary files from the server's filesystem.

Alon Barad
Alon Barad
3 views•5 min read
•about 3 hours ago•CVE-2026-100369
8.4

CVE-2026-100369: Argument Injection Vulnerability in CliInvoke Process Runner Factories

An argument injection vulnerability (CWE-88) in CliInvoke and AlastairLundy.CliInvoke allows local attackers to execute arbitrary system commands. By injecting double-quote characters into target file paths or arguments, attackers can terminate operating-system-level quoted boundaries and introduce new commands when shell runners are utilized.

Amit Schendel
Amit Schendel
3 views•5 min read
•about 4 hours ago•CVE-2026-100368
8.4

CVE-2026-100368: OS Command Injection in CliInvoke Shell Wrappers

An OS command injection vulnerability exists in the PowerShell and Cmd shell wrappers of the CliInvoke .NET library (specifically the CliInvoke.Specializations package). Under vulnerable configurations, arguments and targets are passed as a single flat string to ProcessStartInfo.Arguments, permitting double-quote breakout and execution of arbitrary secondary commands with host process privileges.

Amit Schendel
Amit Schendel
3 views•7 min read
•about 5 hours ago•GHSA-VV77-66RF-PM86
8.8

GHSA-vv77-66rf-pm86: Gas Draining Vulnerability in mpp Multi-Party Payments Library

A critical-severity input validation vulnerability in the Elixir multi-party payment library `mpp` allows unauthenticated remote attackers to exhaust the transaction fee payer's wallet balance. By submitting a crafted Ethereum transaction envelope with artificially inflated gas parameters, an attacker can force the server to co-sign and commit to pay exorbitant fees, leading to severe financial loss and Denial of Service.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 6 hours ago•GHSA-QPXH-FF8M-C62V
7.5

GHSA-QPXH-FF8M-C62V: Gas Draining and Resource Exhaustion in ZenHive mpp Library

A critical gas draining vulnerability exists in the ZenHive mpp (Multi-Payment Protocol) library prior to version v0.6.0. By omitting validation of EIP-2930 access lists in custom 0x76 transaction envelopes, the library allows malicious clients to pad transaction payloads with dummy addresses, draining the gas sponsor's hot wallet.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 7 hours ago•GHSA-VJ8P-HP9X-GH47
8.8

GHSA-vj8p-hp9x-gh47: Zero-Cost Fee-Payer Wallet Gas Draining in mpp Elixir Library

A high-severity vulnerability exists in the Elixir library `mpp` (Multi-Party Payments) prior to version `0.6.0`. When acting as a sponsored transaction fee payer, the server co-signs and broadcasts user-provided transactions without verifying if the user-specified gas limit is sufficient. An attacker can submit transactions designed to run out of gas and revert. The transaction reversion ensures the attacker pays zero fees, while the sponsor's fee-payer wallet is fully billed for the wasted gas, resulting in a low-cost, high-impact Denial of Service (DoS) vector.

Amit Schendel
Amit Schendel
3 views•6 min read