Container Escape Vulnerabilities in 2026: runc, cgroups, and Kernel Capabilities

Containers are not VMs. The isolation boundary is thinner than most engineers realize — a shared kernel, a set of namespaces, and some cgroup limits. When any of these layers has a bug or misconfiguration, an attacker inside a container can reach the host.

Y
Yash Pritwani
4 min read read

# Container Escape Vulnerabilities in 2026: What Still Works and How to Defend

Containers are not VMs. The isolation boundary is thinner than most engineers realize — a shared kernel, a set of namespaces, and some cgroup limits. When any of these layers has a bug or misconfiguration, an attacker inside a container can reach the host.

Here are three escape vectors that remain viable in 2026, and how to defend against each.

Vector 1: runc CVEs — The Runtime Layer

runc is the OCI container runtime that Docker and Kubernetes use under the hood. When runc has a vulnerability, every container on the host is at risk.

CVE History That Matters

CVE-2024-21626 (Leaky File Descriptors): runc leaked file descriptors into containers, allowing an attacker to access the host filesystem through /proc/self/fd/. Any container image could exploit this on first run.
CVE-2019-5736 (runc overwrite): A malicious container could overwrite the host runc binary, gaining code execution on the host when any container next starts.

These aren't theoretical. CVE-2024-21626 was exploitable with a single WORKDIR instruction in a Dockerfile.

Defense

# Check your runc version
runc --version
# Must be >= 1.1.14 (patches CVE-2024-21626)

# Use a hardened runtime instead
# gVisor (application kernel — no shared kernel)
# Kata Containers (lightweight VM — true isolation)

For high-security workloads, replace runc entirely:

# Kubernetes RuntimeClass for gVisor
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc
---
apiVersion: v1
kind: Pod
spec:
  runtimeClassName: gvisor
  containers:
  - name: untrusted-workload
    image: myapp:latest

Vector 2: cgroup Misconfiguration — The Resource Layer

cgroups limit what resources a container can use. But they also control access to devices, and misconfigurations can expose the host.

The Device Access Escape

If a container has access to the host's block devices (e.g., /dev/sda), it can mount the host filesystem directly:

# Inside a misconfigured container with device access
mkdir /tmp/host
mount /dev/sda1 /tmp/host
# Now you have full read/write access to the host filesystem
cat /tmp/host/etc/shadow

This happens when containers run with --privileged or when device cgroup rules are too permissive.

The cgroup Escape (CVE-2022-0492)

A bug in cgroup v1's release_agent mechanism allowed a container process to write to the host's cgroup filesystem and execute arbitrary commands on the host.

Defense

# Kubernetes PodSecurityStandard — enforce "restricted" profile
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/warn: restricted

Specific hardening:

Never run privileged containers in production. If a vendor requires --privileged, that's a red flag.
Use cgroup v2 — it has a fundamentally more secure design than v1.
Drop all capabilities and add back only what's needed:
securityContext:
  capabilities:
    drop: ["ALL"]
    add: ["NET_BIND_SERVICE"]  # Only if needed

Vector 3: Linux Capability Leaks — The Kernel Layer

Linux capabilities split root privileges into smaller chunks. But some capabilities are dangerous enough to enable container escapes on their own.

The Dangerous Capabilities

Capability
Why It's Dangerous

|-----------|-------------------|

CAP_SYS_ADMIN
Mount filesystems, change namespaces — nearly equivalent to root
CAP_SYS_PTRACE
Trace any process — can inject code into host processes via /proc
CAP_NET_RAW
Raw sockets — enables ARP spoofing, traffic interception
CAP_DAC_OVERRIDE
Bypass file permission checks — read any file
CAP_SYS_MODULE
Load kernel modules — direct kernel code execution

Docker's default capability set includes CAP_NET_RAW and several others that most applications don't need.

Defense: Minimal Capability Set

# In your Dockerfile — run as non-root
RUN adduser --disabled-password --gecos '' appuser
USER appuser

# In Kubernetes — drop all, add none
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop: ["ALL"]

Detection: Runtime Monitoring

Use Falco or Tetragon to detect escape attempts in real-time:

# Falco rule — detect mount from container
- rule: Container Mounted Host Path
  desc: Detect container attempting to mount host filesystem
  condition: >
    evt.type = mount and container.id != host
    and not mount.source startswith "/var/lib/docker"
  output: "Container escape attempt via mount (container=%container.name)"
  priority: CRITICAL

The Defense-in-Depth Stack

No single defense is sufficient. Layer them:

1. Build time: Scan images with Trivy/Grype, reject images running as root 2. Admission: Kubernetes PodSecurityStandards set to "restricted" 3. Runtime: Drop ALL capabilities, use read-only root filesystem 4. Detection: Falco or Tetragon monitoring for suspicious syscalls 5. Isolation: gVisor or Kata Containers for untrusted workloads 6. Patching: Automated runc/containerd updates within 48 hours of CVE disclosure

Quick Audit

Run this against your cluster to find the most obvious issues:

# Find privileged containers
kubectl get pods -A -o json | jq -r '
  .items[] | select(.spec.containers[].securityContext.privileged == true)
  | "\(.metadata.namespace)/\(.metadata.name)"'

# Find containers running as root
kubectl get pods -A -o json | jq -r '
  .items[] | select(.spec.containers[].securityContext.runAsNonRoot != true)
  | "\(.metadata.namespace)/\(.metadata.name)"'

# Find containers with dangerous capabilities
kubectl get pods -A -o json | jq -r '
  .items[] | select(.spec.containers[].securityContext.capabilities.add
  | . != null and (. | inside(["SYS_ADMIN","SYS_PTRACE","NET_RAW"])))
  | "\(.metadata.namespace)/\(.metadata.name)"'

---

Need a container security audit? We perform comprehensive runtime security assessments and help teams harden their Kubernetes deployments. Book a security consultationBook a security consultationhttps://techsaas.cloud/contact or explore our DevSecOps servicesDevSecOps serviceshttps://techsaas.cloud/services.

#[Container Security#Docker#Kubernetes#Runtime Security#DevSecOps]

Need help with general?

TechSaaS provides expert consulting and managed services for cloud infrastructure, DevOps, and AI/ML operations.