CVE-2026-53495: containerd CRI ExecSync Goroutine Leak Leading to Node-Level Denial of Service
Impact
A bug in containerd's CRI ExecSync implementation allows exec probes and lifecycle hooks with background child processes to keep containerd's stdio-drain goroutines indefinitely blocked. Because the I/O drain phase lacks a default timeout or context cancellation handling, repeated ExecSync invocations (like probes) that include long-lived background processes against a container can cause containerd to leak goroutines and host memory. Over time, this resource exhaustion can cause the containerd daemon to be terminated by the OOM killer, rendering containerd unavailable until it is restarted. This issue affects containerd on Linux systems running with the CRI plugin enabled. Users not using containerd's CRI implementation or not running containers on Linux are not affected.
Patches
This bug has been fixed in containerd 2.3.5, 2.2.8, 2.0.12, and 1.7.35. Users should update to these versions to resolve the issue.
Workarounds
Ensure exec probes and lifecycle hooks do not launch long-lived background child processes.
Credits
The containerd project would like to thank XlabAI Team of Tencent Xuanwu Lab (xlabai@tencent.com), including Guannan Wang, Zhanpeng Liu, Jiashuo Liang, and Guancheng Li, and @IamwhatIamSY who independently discovered and responsibly disclosed this issue in accordance with the containerd security policy.
For more information
If there are any questions or comments about this advisory:
Open an issue in containerd Send an email to security@containerd.io
To report a security issue in containerd: Report a new vulnerability Send an email to security@containerd.io
Other sources
containerd CRI ExecSync Goroutine Leak Leading to Node-Level Denial of Service
— Microsoft
containerd is an open-source container runtime. Prior to 1.7.35, 2.0.12, 2.2.8, and 2.3.5, containerd on Linux with the CRI plugin enabled can indefinitely block the drainExecSyncIO goroutine in internal/cri/server/containerexecsync.go when CRI ExecSync is used by exec probes or lifecycle hooks that launch long-lived background child processes retaining standard input and output pipes. The input and output drain phase has no default timeout and did not stop when the request context was canceled, so repeated ExecSync invocations can accumulate blocked goroutines and host memory. The resulting resource exhaustion can cause the OOM killer to terminate containerd, leaving the container runtime unavailable until restart. Deployments not using containerd's CRI implementation and containers not running on Linux are not affected. This issue is fixed in versions 1.7.35, 2.0.12, 2.2.8, and 2.3.5.
— NVD
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
go/github.com/containerd/containerd/v2to a version that resolves this vulnerability.Fixed in 2.3.5 - Upgrade
Upgrade
go/github.com/containerd/containerd/v2to a version that resolves this vulnerability.Fixed in 2.2.8 - Upgrade
Upgrade
go/github.com/containerd/containerdto a version that resolves this vulnerability.Fixed in 1.7.35 - Upgrade
Upgrade
go/github.com/containerd/containerd/v2to a version that resolves this vulnerability.Fixed in 2.0.12 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 2.3.4-1 - Upgrade
Upgrade
azurelinux/moby-containerd-ccto a version that resolves this vulnerability.Fixed in 1.7.7-19 - Upgrade
Upgrade
azurelinux/containerd2to a version that resolves this vulnerability.Fixed in 2.3.4-1 - Upgrade
Upgrade
azurelinux/containerd2to a version that resolves this vulnerability.Fixed in 2.3.7-1 - Upgrade
Upgrade
alpine/containerdto a version that resolves this vulnerability.Fixed in 2.3.5-r0 - Upgrade
Upgrade
containerdto a version that resolves this vulnerability.Fixed in 1.7.35 - Upgrade
Upgrade
containerdto a version that resolves this vulnerability.Fixed in 2.0.12 - Upgrade
Upgrade
containerdto a version that resolves this vulnerability.Fixed in 2.2.8 - Upgrade
Upgrade
containerdto a version that resolves this vulnerability.Fixed in 2.3.5 - Configuration
Ensure exec probes and lifecycle hooks do not launch long-lived background child processes that retain standard input and output pipes when CRI ExecSync is used.
containerd (CRI plugin) exec probes/lifecycle hooks Background child processes retaining standard input/output pipes = Do not launch long-lived background child processes
Event History
Frequently Asked Questions
Which deployments are affected?
Affected deployments are Linux systems running containerd with the CRI plugin enabled. Systems not using containerd's CRI implementation, or not running containers on Linux, are not affected.
What conditions are needed to trigger the resource exhaustion?
An exec probe or lifecycle hook must launch a long-lived background child process. Repeated ExecSync invocations, such as recurring probes, can then leave stdio-drain goroutines blocked and progressively consume host memory.
What can be done before an update is available?
Ensure that exec probes and lifecycle hooks do not launch long-lived background child processes. This avoids the condition that causes the blocked goroutines and memory leak.
Which containerd releases contain the fix?
The issue is fixed in containerd 2.3.5, 2.2.8, 2.0.12, and 1.7.35.