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·67 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

•41 minutes ago•CVE-2026-77596
9.6

CVE-2026-77596: Cross-Tenant Authorization Bypass in Kubeflow Pipelines Upload API

CVE-2026-77596 is an authorization bypass vulnerability in the Kubeflow Pipelines API server affecting multi-user deployments prior to version 2.18.0. The HTTP multipart upload handlers prematurely terminate authorization checks and return success when the target namespace parameter is empty or omitted. Because the default configuration allows pipelines without namespaces to function as cluster-wide shared resources, any low-privileged tenant can create shared pipelines or inject arbitrary pipeline versions into existing shared pipelines without undergoing Kubernetes SubjectAccessReview validation. When other tenants execute unpinned recurring runs tracking these shared pipelines, the attacker-supplied workload runs inside the victim tenant's namespace using the victim's service account credentials.

Alon Barad
Alon Barad
2 views•10 min read
•about 2 hours ago•CVE-2026-85737
6.5

CVE-2026-85737: Missing Authorization and Arbitrary File Disclosure in Velocidex Velociraptor sql() VQL Plugin

An authorization bypass vulnerability in Velocidex Velociraptor versions prior to 0.77.2 allows authenticated users with low-privilege query permissions to bypass access controls in the sql() VQL plugin. By supplying crafted MySQL connection strings pointing to an attacker-controlled rogue MySQL server with local-infile enabled, an attacker can read arbitrary files from the Velociraptor server host filesystem with the privileges of the server process.

Alon Barad
Alon Barad
3 views•8 min read
•about 3 hours ago•CVE-2026-97705
7.5

CVE-2026-97705: Unauthenticated Denial of Service in Moleculer TCP Transporter Packet Parser

CVE-2026-97705 (GHSA-h89v-g948-47vp) is a high-severity unauthenticated Denial of Service (DoS) vulnerability affecting the Moleculer microservices framework for Node.js in versions prior to 0.14.36 and 0.15.2. The vulnerability resides in the internal TCP transporter packet parser (`src/transporters/tcp/parser.js`), which decodes the 4-byte packet length field as a signed 32-bit integer using `Buffer.prototype.readInt32BE()`. An unauthenticated attacker with network access to an exposed TCP transporter port can transmit a single malformed packet containing a negative length value or a positive length value less than the 6-byte header size. Due to how Node.js `Buffer.prototype.slice()` processes negative or sub-header offsets, the parser fails to advance the incoming buffer cursor while remaining inside a synchronous `while (packet.length > 0)` loop. Because Node.js relies on a single-threaded event loop, this infinite loop permanently blocks execution, freezing all services and endpoints within the affected process until manual intervention.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 4 hours ago•CVE-2026-108262
6.5

CVE-2026-108262: Arbitrary Host File Overwrite via Tar Symlink Traversal in DDEV

CVE-2026-108262 (GHSA-9hq4-hm3j-jmph) is a path traversal and arbitrary file overwrite vulnerability in the tar archive extraction routine of DDEV versions 1.25.2 and 1.25.3. Resulting from an incomplete fix for CVE-2026-32885, the Untar function in pkg/archive/archive.go validates absolute symbolic link targets by rebasing them against the extraction destination directory, but subsequently creates the symbolic link on disk using the raw, unvalidated absolute path. When subsequent entries in the archive write through the planted symbolic link, the host operating system resolves the link directly to the host filesystem, allowing an attacker to overwrite arbitrary files with the privileges of the user executing DDEV.

Amit Schendel
Amit Schendel
5 views•10 min read
•about 5 hours ago•CVE-2026-119298
4.2

CVE-2026-119298: Overwrite Confirmation Bypass in schollz/croc via Unvalidated Text Artifact Prefix

CVE-2026-119298 (GHSA-x89h-7h96-v88f) is a file overwrite confirmation bypass vulnerability in schollz/croc prior to version 11.5.2. The receive-side file validation logic in src/croc/croc.go improperly exempted any incoming file whose basename began with the prefix 'croc-stdin-' from interactive overwrite prompts and automatic collision renaming, failing to verify if the transfer session was actually an internal text transfer. An unauthenticated remote peer participating in a transfer session can exploit this flaw to silently overwrite, truncate, or replace matching pre-existing files in the receiver's working directory.

Amit Schendel
Amit Schendel
4 views•9 min read
•about 6 hours ago•CVE-2026-88968
7.7

CVE-2026-88968: TOCTOU Race Condition in Claude Code Edit Tool Allows Arbitrary File Overwrite

Claude Code prior to version 2.1.251 contains a Time-of-Check to Time-of-Use (TOCTOU) race condition in its internal file manipulation tools (Edit, Write, Read). Because path validation was performed using string-based pathname and symbolic link resolution without binding to the underlying directory inodes or open file descriptors, a process running concurrently inside the macOS Bash sandbox can atomically replace an in-workspace directory with a symbolic link after validation passes. This causes the unsandboxed main process to follow the symlink and overwrite user-writable files outside the permitted workspace boundary.

Alon Barad
Alon Barad
5 views•9 min read