CVE
containerd · critical · rated critical by containerd; no CVSS vector publishedUpdated September 29, 2026

CVE-2026-95837: containerd checkpoint restore ignores the pod's security context

What the containerd CRI checkpoint-restore flaw does, which versions are affected, how to check your nodes, and why the Kubernetes API cannot show whether a container was restored with more privilege than it asked for.

Short answer

CVE-2026-95837 lets a container restored from a crafted checkpoint through containerd's CRI CreateContainer path run as root with full capabilities and no seccomp filter, regardless of the security context Kubernetes requested; it affects containerd 2.1 and 2.2 before 2.2.7 and 2.3 before 2.3.4, where the fix turns that restore path off by default.

01

What the vulnerability does

containerd's CRI plugin can create a container from a checkpoint: an archive or an annotated OCI image that holds a process saved by CRIU. When it does, CRIU restores the process credentials, Linux capabilities, no_new_privs and seccomp state from the checkpoint data. The security context the orchestrator asked for in the CRI ContainerConfig is not applied to the restored process.

So anyone who can run a container from a checkpoint image they crafted can end up with processes running as root, with every capability and no seccomp filter, inside a pod whose spec asked for a non-root user, dropped capabilities and a restrictive profile.

The part that matters most for detection: containerd's CRI status reports the configuration that was requested, not the state of the restored process. The kubelet, admission controllers and anything reading the Kubernetes API see the restrictive settings they asked for.

02

Affected and fixed versions

From the containerd advisory. Only Linux nodes with CRI checkpoint restore available are affected; the advisory states that users not using CRI checkpoint restore are not affected.

  • Affected: github.com/containerd/containerd/v2 from 2.1.0 before 2.2.7, and from 2.3.0 before 2.3.4.
  • Fixed: 2.2.7 and 2.3.4, which disable checkpoint restore through CreateContainer by default. In 2.4.0 the feature is removed.
  • The advisory does not list the 1.7 or 2.0 release lines.
  • Not a workaround on unpatched versions: containerd offers no setting there to switch restore through CreateContainer off.

03

Check your nodes

Start with the runtime version on every node; the Kubernetes API reports it. Then, on patched nodes, confirm the restore path is still off, because the fix added an option that turns it back on.

ShellRuntime version per node, then the restore settings
kubectl get nodes -o custom-columns=\
NODE:.metadata.name,\
RUNTIME:.status.nodeInfo.containerRuntimeVersion

# On a node running 2.2.7, 2.3.4 or later:
containerd config dump | grep -E \
  'enable_criu|enable_experimental_restore_via_create'
enable_experimental_restore_via_create must be false. The advisory is explicit that setting it to true leaves the vulnerability in place.

04

What the API cannot tell you, and what can

Because containerd reports the requested security context, every check that reads the Kubernetes API or the CRI status will say a restored container is fine. The only reliable view is the process itself, as the kernel sees it.

Compare what the pod asked for with what its first process actually holds. Uid 0, a full CapEff mask, NoNewPrivs 0 or Seccomp 0 on a container whose spec asked for a non-root user, dropped capabilities or a seccomp profile is the mismatch this vulnerability produces.

A restore also leaves a trace in process activity: CRIU runs on the node to restore the process. Any runtime sensor that records process executions on nodes, such as Falco, Tetragon or Primod, will show a criu restore that nobody planned, and which pod it created.

ShellThe process state the kernel enforces
# On the node: the container's first process
crictl inspect <container-id> | grep -m1 '"pid"'
grep -E '^(Uid|CapEff|NoNewPrivs|Seccomp):' \
  /proc/<pid>/status

05

Fixing it

Upgrade containerd to 2.2.7, 2.3.4 or later, and leave enable_experimental_restore_via_create off. The advisory also says containers that were restored from untrusted checkpoints should be stopped, deleted and recreated, since the upgrade does not change processes already running.

Until the upgrade lands, the advisory's mitigations are about who can start containers from what: restrict container creation to trusted users, only allow images from registries you control, and use an admission policy to reject images that carry checkpoint data.

06

Where Primod fits

Primod's per-node eBPF sensor records process executions and lineage with the workload they belong to, so an unexpected criu restore and the processes it brought back show up against the pod they ran in. That is evidence of what happened on the node; it does not replace the upgrade.

Frequently asked questions

Does this affect clusters that never use checkpoint/restore?
The containerd advisory says users not using CRI checkpoint restore are not affected. The risk is that on unpatched 2.1 to 2.3 versions nothing in containerd's configuration turns the restore path off, so whether it can be used depends on who can create containers from which images.
Is CRI-O affected too?
CRI-O has the same class of problem as CVE-2026-92574, published on 21 September 2026, with its own fixed versions and a configuration workaround.
Will my admission controller or policy engine catch it?
Not from the pod spec. The spec and the status both show the restrictive security context that was requested; the restored process ignores it. Checking what the process actually holds, or recording process activity on the node, is what shows the difference.

Sources and references

  1. GHSA-p7v4-vr35-mj6f: Checkpoint restore bypasses destination security context

    containerd, September 2026

  2. containerd CRI plugin configuration

    containerd

  3. CRIU image security

    CRIU

  4. proc_pid_status(5): Uid, CapEff, NoNewPrivs and Seccomp fields

    Linux man-pages

Keep reading

From the engineering blog

All articles