CVE-2024-21626
High · 8.6CVSS
8.6
EPSS
18.9%
Published
Jan 31, 2024
CISA due date
—
Cloudanix analysis
A bug in container software can let attackers break out of their isolated environment and reach the underlying computer system.
- Exploitation
- Local Privilege
- Attacker needs
- User Interaction
- Complexity
- Low
- Impact
- Full Compromise
- Component
- Container Runtime
- Class
- Container Escape
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Internal file descriptor leak in runc allows a newly-spawned container process (via runc exec or run) to obtain a working directory in the host filesystem namespace, granting direct access to host files and enabling semi-arbitrary host binary overwrites for full escape.
Why it matters to the business
Successful exploitation breaks container isolation on Linux hosts, risking full host compromise, lateral movement to other containers, and data exfiltration. Weaponized public exploits combined with a rising EPSS score increase urgency for organizations running container workloads at scale.
How an attack unfolds
An attacker supplies a malicious container image or issues a runc exec command; the leaked file descriptor causes the container process to inherit a host-namespace working directory. This enables reading or writing host files, with variants allowing overwrite of host binaries to achieve complete container escape.
How to fix it
Upgrade opencontainers/runc to version 1.1.12 or later, specifically commit 51d5e94601ceffbbd85688df1c928ecccbfa4685. Rebuild and redeploy all container images and orchestration configurations that depend on the patched runc binary.
How to confirm the fix worked
Verify the installed runc binary reports version 1.1.12 or contains commit 51d5e94601ceffbbd85688df1c928ecccbfa4685; run integration tests that attempt to access host paths from within a container to confirm isolation is restored.
Typical attack path
- Craft or obtain a malicious OCI image or prepare a runc exec invocation targeting the vulnerable runc binary
- Trigger container creation (runc run) or process execution (runc exec) on a host running runc 1.1.11 or earlier
- Exploit the leaked file descriptor so the container process receives a working directory inside the host filesystem namespace
- Use host filesystem access to read sensitive data or overwrite semi-arbitrary host binaries for persistent escape
How to detect it
Review runc process logs and container runtime audit events for unexpected working-directory paths that resolve outside container rootfs; correlate with exec or run operations and look for subsequent host-file access attempts by container PIDs.
- runc.*exec.*host filesystem
- working directory.*host namespace
- container escape via file descriptor leak
What your security team should do
- Immediately upgrade all runc installations to the fixed commit and rebuild dependent container images
- Scan container registries and CI/CD pipelines for images built with vulnerable runc versions
- Enable runtime monitoring for unexpected host filesystem access originating from container processes
- Review and tighten seccomp and AppArmor/SELinux policies around runc exec operations
The record
runc is a CLI tool for spawning and running containers on Linux according to the OCI specification. In runc 1.1.11 and earlier, due to an internal file descriptor leak, an attacker could cause a newly-spawned container process (from runc exec) to have a working directory in the host filesystem namespace, allowing for a container escape by giving access to the host filesystem ("attack 2"). The same attack could be used by a malicious image to allow a container process to gain access to the host filesystem through runc run ("attack 1"). Variants of attacks 1 and 2 could be also be used to overwrite semi-arbitrary host binaries, allowing for complete container escapes ("attack 3a" and "attack 3b"). runc 1.1.12 includes patches for this issue.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Go | github.com/opencontainers/runc | 1.0.0-rc93 | 1.1.12 |
| AlmaLinux:8 | aardvark-dns | 0 | 2:1.0.1-38.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | aardvark-dns | 0 | 2:1.7.0-1.module_el8.9.0+3657+d86e192f |
| AlmaLinux:8 | buildah | 0 | 1:1.24.6-7.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | buildah | 0 | 1:1.31.3-3.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | buildah-tests | 0 | 1:1.24.6-7.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | buildah-tests | 0 | 1:1.24.6-7.module_el8.9.0+3687+dcd7ef8f |
| AlmaLinux:8 | buildah-tests | 0 | 1:1.31.3-3.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | cockpit-podman | 0 | 46-1.module_el8.7.0+3344+5bcd850f |
| AlmaLinux:8 | cockpit-podman | 0 | 75-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | conmon | 0 | 2:2.1.4-2.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | conmon | 0 | 2:2.1.4-2.module_el8.9.0+3687+dcd7ef8f |
| AlmaLinux:8 | conmon | 0 | 3:2.1.8-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | container-selinux | 0 | 2:2.205.0-3.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | container-selinux | 0 | 2:2.221.0-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | containernetworking-plugins | 0 | 1:1.1.1-6.module_el8.9.0+3711+04fcca5e |
| AlmaLinux:8 | containernetworking-plugins | 0 | 1:1.3.0-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | containers-common | 0 | 2:1-38.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | containers-common | 0 | 2:1-71.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | crit | 0 | 3.15-3.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | crit | 0 | 3.15-3.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | crit | 0 | 3.18-4.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | criu | 0 | 3.15-3.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | criu | 0 | 3.15-3.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | criu | 0 | 3.18-4.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | criu-devel | 0 | 3.15-3.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | criu-devel | 0 | 3.15-3.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | criu-devel | 0 | 3.18-4.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | criu-libs | 0 | 3.15-3.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | criu-libs | 0 | 3.15-3.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | criu-libs | 0 | 3.18-4.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | crun | 0 | 1.8.7-1.module_el8.9.0+3683+33eb0feb |
| AlmaLinux:8 | crun | 0 | 1.8.7-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | fuse-overlayfs | 0 | 1.9-2.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | fuse-overlayfs | 0 | 1.12-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | libslirp | 0 | 4.4.0-1.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | libslirp | 0 | 4.4.0-1.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | libslirp | 0 | 4.4.0-1.module_el8.8.0+3615+3543c705 |
| AlmaLinux:8 | libslirp-devel | 0 | 4.4.0-1.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | libslirp-devel | 0 | 4.4.0-1.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | libslirp-devel | 0 | 4.4.0-1.module_el8.8.0+3615+3543c705 |
| AlmaLinux:8 | netavark | 0 | 2:1.0.1-38.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | netavark | 0 | 2:1.7.0-2.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | oci-seccomp-bpf-hook | 0 | 1.2.5-2.module_el8.8.0+3468+16b86c82 |
| AlmaLinux:8 | oci-seccomp-bpf-hook | 0 | 1.2.9-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | podman | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-catatonit | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-catatonit | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-docker | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-docker | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-gvproxy | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-gvproxy | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-plugins | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-plugins | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-remote | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-remote | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | podman-tests | 0 | 2:4.0.2-26.module_el8.9.0+3722+7fd8ab2b.alma.1 |
| AlmaLinux:8 | podman-tests | 0 | 3:4.6.1-8.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | python3-criu | 0 | 3.15-3.module_el8.6.0+2877+8e437bf5 |
| AlmaLinux:8 | python3-criu | 0 | 3.15-3.module_el8.6.0+3137+d33c3efb |
| AlmaLinux:8 | python3-criu | 0 | 3.18-4.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | python3-podman | 0 | 4.0.0-2.module_el8.9.0+3711+04fcca5e |
| AlmaLinux:8 | python3-podman | 0 | 4.6.0-2.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | runc | 0 | 1:1.1.12-1.module_el8.9.0+3722+7fd8ab2b |
| AlmaLinux:8 | runc | 0 | 1:1.1.12-1.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | skopeo | 0 | 2:1.6.2-9.module_el8.9.0+3687+dcd7ef8f.alma.1 |
| AlmaLinux:8 | skopeo | 0 | 2:1.6.2-9.module_el8.9.0+3711+04fcca5e.alma.1 |
| AlmaLinux:8 | skopeo | 0 | 2:1.13.3-3.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | skopeo-tests | 0 | 2:1.6.2-9.module_el8.9.0+3687+dcd7ef8f.alma.1 |
| AlmaLinux:8 | skopeo-tests | 0 | 2:1.6.2-9.module_el8.9.0+3711+04fcca5e.alma.1 |
| AlmaLinux:8 | skopeo-tests | 0 | 2:1.13.3-3.module_el8.9.0+3717+81096349 |
| AlmaLinux:8 | slirp4netns | 0 | 1.1.8-3.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | slirp4netns | 0 | 1.2.1-1.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | toolbox | 0 | 0.0.99.4-5.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | toolbox | 0 | 0.0.99.4-5.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | toolbox-tests | 0 | 0.0.99.4-5.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | toolbox-tests | 0 | 0.0.99.4-5.module_el8.9.0+3643+9234dc3b |
| AlmaLinux:8 | udica | 0 | 0.2.6-4.module_el8.9.0+3627+db8ec155 |
| AlmaLinux:8 | udica | 0 | 0.2.6-20.module_el8.8.0+3615+3543c705 |
| AlmaLinux:9 | runc | 0 | 4:1.1.12-1.el9_3 |
| Chainguard | buildctl | 0 | 0.12.5-r1 |
| Chainguard | buildkitd | 0 | 0.12.5-r1 |
| Chainguard | cadvisor | 0 | 0.48.1-r4 |
| Chainguard | cadvisor-compat | 0 | 0.48.1-r4 |
| Chainguard | ctop | 0 | 0.7.7-r13 |
| Chainguard | datadog-agent | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-core-integrations | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-core-integrations-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-fakeintake | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-fakeintake-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-jmx | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-jmx-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-oci-compat | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-oci-compat-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-s6-overlay | 0 | 7.50.3-r1 |
| Chainguard | datadog-agent-s6-overlay-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-cluster-agent | 0 | 7.50.3-r1 |
| Chainguard | datadog-cluster-agent-fips | 0 | 7.50.3-r1 |
| Chainguard | datadog-cluster-agent-oci-compat | 0 | 7.50.3-r1 |
| Chainguard | datadog-cluster-agent-oci-compat-fips | 0 | 7.50.3-r1 |
| Chainguard | docker | 0 | 25.0.2-r0 |
| Chainguard | docker-config-mirror-gcr | 0 | 25.0.2-r0 |
| Chainguard | docker-dind | 0 | 25.0.2-r0 |
| Chainguard | docker-dind-compat | 0 | 25.0.2-r0 |
| Chainguard | docker-init | 0 | 25.0.2-r0 |
| Chainguard | docker-modprobe-compat | 0 | 25.0.2-r0 |
| Chainguard | docker-oci-entrypoint | 0 | 25.0.2-r0 |
| Chainguard | docker-rootless | 0 | 25.0.2-r0 |
| Chainguard | dockerd | 0 | 25.0.2-r0 |
| Chainguard | dockerd-oci-entrypoint | 0 | 25.0.2-r0 |
| Chainguard | dockerd-service | 0 | 25.0.2-r0 |
| Chainguard | dogstatsd | 0 | 7.50.3-r1 |
| Chainguard | grype | 0 | 0.74.4-r1 |
| Chainguard | ingress-nginx-controller | 0 | 1.9.6-r1 |
| Chainguard | ingress-nginx-controller-compat | 0 | 1.9.6-r1 |
| Chainguard | ingress-nginx-controller-fips | 0 | 1.9.5-r1 |
| Chainguard | ingress-nginx-controller-fips-compat | 0 | 1.9.5-r1 |
| Chainguard | k3d | 0 | 5.6.0-r6 |
| Chainguard | k3d-proxy | 0 | 5.6.0-r6 |
| Chainguard | k3d-tools | 0 | 5.6.0-r6 |
| Chainguard | k3s | 0 | 1.29.0-r1 |
| Chainguard | k3s-embedded | 0 | 1.29.0-r1 |
| Chainguard | k3s-images | 0 | 1.29.0-r1 |
| Chainguard | k3s-multicall | 0 | 1.29.0-r1 |
| Chainguard | k3s-static | 0 | 1.29.0-r1 |
| Chainguard | k9s | 0 | 0.31.8-r0 |
| Chainguard | kaniko | 0 | 1.20.1-r0 |
| Chainguard | kaniko-compat | 0 | 1.20.1-r0 |
| Chainguard | kaniko-warmer | 0 | 1.20.1-r0 |
| Chainguard | kaniko-warmer-compat | 0 | 1.20.1-r0 |
| Chainguard | kots | 0 | 1.107.0-r1 |
| Chainguard | kots-compat | 0 | 1.107.0-r1 |
| Chainguard | kots-symlink-compat | 0 | 1.107.0-r1 |
| Chainguard | kube-apiserver-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-apiserver-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-apiserver-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kube-apiserver-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kube-apiserver-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kube-apiserver-fips-1.27-default | 0 | 1.27.12-r1 |
| Chainguard | kube-apiserver-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-apiserver-fips-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-apiserver-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kube-apiserver-fips-1.29-default | 0 | 1.29.15-r2 |
| Chainguard | kube-controller-manager-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-controller-manager-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-controller-manager-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kube-controller-manager-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kube-controller-manager-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kube-controller-manager-fips-1.27-default | 0 | 1.27.12-r1 |
| Chainguard | kube-controller-manager-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-controller-manager-fips-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-controller-manager-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kube-controller-manager-fips-1.29-default | 0 | 1.29.15-r2 |
| Chainguard | kube-proxy-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-proxy-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-proxy-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kube-proxy-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kube-proxy-1.29-default-compat | 0 | 1.29.3-r1 |
| Chainguard | kube-proxy-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kube-proxy-fips-1.27-default | 0 | 1.27.12-r1 |
| Chainguard | kube-proxy-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-proxy-fips-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-proxy-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kube-proxy-fips-1.29-default | 0 | 1.29.15-r2 |
| Chainguard | kube-scheduler-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-scheduler-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-scheduler-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kube-scheduler-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kube-scheduler-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kube-scheduler-fips-1.27-default | 0 | 1.27.12-r1 |
| Chainguard | kube-scheduler-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kube-scheduler-fips-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kube-scheduler-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kube-scheduler-fips-1.29-default | 0 | 1.29.15-r2 |
| Chainguard | kube-webhook-certgen | 0 | 1.9.6-r1 |
| Chainguard | kube-webhook-certgen-fips | 0 | 1.9.5-r1 |
| Chainguard | kubeadm-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kubeadm-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kubeadm-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kubeadm-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kubeadm-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kubeadm-fips-1.27-default | 0 | 1.27.12-r1 |
| Chainguard | kubeadm-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kubeadm-fips-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kubeadm-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kubeadm-fips-1.29-default | 0 | 1.29.15-r2 |
| Chainguard | kubectl-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kubectl-1.28-default | 0 | 1.28.9-r0 |
| Chainguard | kubectl-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kubectl-1.29-bitnami-compat | 0 | 1.29.3-r1 |
| Chainguard | kubectl-1.29-default | 0 | 1.29.3-r1 |
| Chainguard | kubectl-1.29-iamguarded-compat | 0 | 1.29.3-r1 |
| Chainguard | kubectl-bash-completion-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kubectl-bash-completion-1.29 | 0 | 1.29.3-r1 |
| Chainguard | kubectl-bash-completion-fips-1.27 | 0 | 1.27.12-r1 |
| Chainguard | kubectl-bash-completion-fips-1.28 | 0 | 1.28.9-r0 |
| Chainguard | kubectl-bash-completion-fips-1.29 | 0 | 1.29.15-r2 |
| Chainguard | kubectl-fips-1.27 | 0 | 1.27.12-r1 |
Related vulnerabilities
- CVE-2025-64750 SingularityCE and SingularityPRO are open source container platforms. Also affects github.com/opencontainers/runc
- CVE-2025-65105 Apptainer ineffective application of selinux and apparmor --security options Also affects github.com/opencontainers/runc
- CVE-2025-52565 container escape due to /dev/console mount and related races Also affects github.com/opencontainers/runc
- CVE-2025-31133 runc container escape via "masked path" abuse due to mount race conditions Also affects github.com/opencontainers/runc
- CVE-2025-52881 runc container escape and denial of service due to arbitrary write gadgets and procfs… Also affects github.com/opencontainers/runc
- CVE-2024-45310 runc is a CLI tool for spawning and running containers according to the OCI specification. Also affects github.com/opencontainers/runc
- CVE-2025-47913 SSH clients receiving SSH_AGENT_SUCCESS when expecting a typed response will panic and… Also affects aardvark-dns
- CVE-2025-22871 The net/http package improperly accepts a bare LF as a line terminator in chunked data… Also affects aardvark-dns