Skip to content

CVE-2026-92574: Verified Reproduction

CVE-2026-92574: CRI-O checkpoint restore bypasses destination Kubernetes security context

CVE-2026-92574 is verified against cri-o/cri-o · go. Affected versions: >=1.34.0 <1.34.14. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00372.

REPRO-2026-00372 cri-o/cri-o · go Sep 24, 2026 CVE entry .txt
Severity
HIGH
CVSS
8.8
Confidence
HIGH
Reproduced in
200m 9s
Tool calls
631
Spend
$100.23
01 · Overview

What Is CVE-2026-92574?

CVE-2026-92574 is a high-severity vulnerability affecting cri-o/cri-o >=1.34.0 <1.34.14. Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00372).

02 · Severity & CVSS

CVE-2026-92574 Severity & CVSS Score

CVE-2026-92574 is rated high severity, with a CVSS base score of 8.8 out of 10.

HIGH threat level
8.8 / 10 CVSS base
Weakness CWE-250

High — serious impact or readily exploitable. Prioritize remediation.

03 · Affected Versions

Affected cri-o/cri-o Versions

cri-o/cri-o · go versions >=1.34.0 <1.34.14 are affected.

How to Reproduce CVE-2026-92574

$ pruva-verify REPRO-2026-00372
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00372/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-92574

Privilege escalation — reproduced
  • reached the target end-to-end
  • full exploit chain demonstrated
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

A privileged CRIU checkpoint archive supplied as ContainerConfig.image together with a restricted destination ContainerConfig

Attack chain
  1. crictl CreateContainer
  2. CRI-O CRImportCheckpoint
  3. StartContainer
  4. runc/CRIU restore
How the agent worked 1,239 events · 631 tool calls · 4h 50m
4h 50mDuration
631Tool calls
62Reasoning steps
1,239Events
54Dead-ends
Agent activity over 4h 50m
Policy
1
Support
24
Repro
1,002
Judge
53
Variant
154
Verify
1
0:00289:47

Root Cause and Exploit Chain for CVE-2026-92574

Versions: Reported upstream ranges 1.34.0–1.34.13, 1.35.0–1.35.8, and 1.36.0–1.36.5. This run anchors the vulnerable source to commit 6e902ee2a9f7ce535855c68c92c6838f087f578f, the resolved parent of fix commit f4d95dfe70c4af4afff0c5a96e1a36975c2f65f9.

CVE-2026-92574 is confirmed in CRI-O's real CRI checkpoint/restore workflow. At vulnerable commit 6e902ee2a9f7ce535855c68c92c6838f087f578f (the parent of the ticket's first fix commit), CRI-O accepts a CRIU checkpoint archive through RuntimeService.CreateContainer even when the destination ContainerConfig requests UID/GID 65534, no_new_privs, runtime-default seccomp, and all capabilities dropped. RuntimeService.StartContainer then restores the checkpoint's process state: both current-run attempts executed as UID/GID 0 with effective capabilities 000001ffffffffff, NoNewPrivs: 0, and Seccomp: 0, while CRI inspection continued to report UID/GID 65534. The final fixed release-1.36 commit bb54fa0fba793889d815e5943abd6f8afc938c39 defaults container restore to checkpoint_only; both controls rejected the same archive during CreateContainer.

  • Package/component affected: CRI-O container checkpoint import/restore path (CreateContainer -> CRImportCheckpoint -> runc/CRIU restore).
  • Affected versions: Reported upstream ranges 1.34.0–1.34.13, 1.35.0–1.35.8, and 1.36.0–1.36.5. This run anchors the vulnerable source to commit 6e902ee2a9f7ce535855c68c92c6838f087f578f, the resolved parent of fix commit f4d95dfe70c4af4afff0c5a96e1a36975c2f65f9.
  • Risk level and consequences: High. An actor able to cause CRI-O to restore an attacker-prepared checkpoint can bypass the destination security context and run a restored process with root credentials, all capabilities available in the runtime namespace, no_new_privs disabled, and seccomp disabled. This is a concrete privilege escalation relative to the requested destination policy.

Impact Parity

  • Disclosed/claimed maximum impact: Privilege escalation through CRI-O's service/API checkpoint restore workflow.
  • Reproduced impact from this run: A real CRI-O endpoint restored an attacker checkpoint twice. Requested state was UID/GID 65534, drop all capabilities, no_new_privs=true, and runtime-default seccomp; observed live process state was UID/GID 0, CapEff=000001ffffffffff, NoNewPrivs=0, and Seccomp=0.
  • Parity: full.
  • Not demonstrated: The variant using an annotated checkpoint image fetched from a remote registry was not needed for impact parity; this run uses the supported checkpoint-archive image path across the same CRI endpoint. Node/host escape beyond the demonstrated destination container security-context boundary was not attempted.

Root Cause

In the vulnerable source, container restore is globally enabled by enable_criu_support. server/container_create.go recognizes a filesystem path in ContainerConfig.image as a checkpoint archive and dispatches to CRImportCheckpoint. The import path does copy the destination CRI Linux.SecurityContext into the newly registered container configuration, which is why crictl inspect reports the restricted UID/GID. However, starting a restore container asks runc/CRIU to recreate the serialized process from the checkpoint. CRIU restores the process credentials, capability sets, no_new_privs, and seccomp state from checkpoint images; those values therefore diverge from CRI-O's destination metadata.

The upstream change set mitigates this by introducing explicit checkpoint/restore levels and defaulting container-level support to checkpoint_only, preventing archive/image restore unless an administrator intentionally opts back into checkpoint_restore:

The fixed path's RestoreContainerEnabled() check no longer classifies the archive path as a checkpoint under the secure default. Both fixed controls therefore failed closed at CreateContainer rather than restoring the serialized privileged process.

Reproduction Steps

  1. Run bundle/repro/reproduction_steps.sh from any working directory. The script reads bundle/project_cache_context.json, uses the prepared <project_cache_dir>/repo, and falls back to bundle/artifacts/cri-o only when no usable prepared cache exists.
  2. The script resolves the vulnerable checkout as f4d95dfe70c4af4afff0c5a96e1a36975c2f65f9^ and verifies that its full SHA is 6e902ee2a9f7ce535855c68c92c6838f087f578f. It verifies the vulnerable source lacks CheckpointRestoreConfig and the fixed source contains it before building.
  3. In a capability-enabled rootless Docker container, the helper builds/reuses commit-bound CRI-O binaries, pinned runc v1.3.4, and CRIU v4.1.1. Narrow compatibility patches compensate only for the worker's non-delegated cgroups and protected UTS sysctls; they do not modify checkpoint credentials, capabilities, no_new_privs, seccomp, CRI-O restore classification, or the fixed default.
  4. The helper starts a real vulnerable CRI-O service, uses crictl over its Unix gRPC endpoint to create a root/full-capability/unconfined source container, and exports a real checkpoint archive through CheckpointContainer.
  5. For two isolated vulnerable destination services, it uses RunPodSandbox, submits the checkpoint archive to CreateContainer with UID/GID 65534, drop-all, no_new_privs=true, and runtime-default seccomp, calls StartContainer, obtains the live PID through ContainerStatus, and reads /proc/<pid>/status.
  6. For two isolated final-fixed services, it submits the same archive/request. The secure checkpoint_only default rejects it before restore.
  7. Success is exit 0 plus CONFIRMED: output. The final script was executed twice consecutively; both runs returned 0.

Evidence

  • Runtime manifest: bundle/repro/runtime_manifest.json binds every immutable current-run artifact by SHA-256 and binds the source target to git:https://github.com/cri-o/cri-o.git@6e902ee2a9f7ce535855c68c92c6838f087f578f.
  • Vulnerable attempts:
    • bundle/repro/proof/current/vulnerable-1.txt
    • bundle/repro/proof/current/vulnerable-2.txt
    • bundle/repro/proof/current/vulnerable-1-process-status.txt
    • bundle/repro/proof/current/vulnerable-2-process-status.txt
  • Fixed negative controls:
    • bundle/repro/proof/current/fixed-1.txt
    • bundle/repro/proof/current/fixed-2.txt
  • Service logs: bundle/repro/proof/current/vulnerable-*-service.log and fixed-*-service.log.
  • Versions and identity: bundle/repro/proof/current/tool-versions.txt and source-identity.txt.
  • Diagnostics: bundle/logs/reproduction_steps.log and bundle/logs/repro/docker-driver.log.

Key current-run excerpts, repeated in both vulnerable attempts:

requested_run_as_user=65534
requested_no_new_privs=true
requested_drop_all=true
restore_result=accepted
restored_uid=0
restored_gid=0
restored_cap_eff=000001ffffffffff
restored_no_new_privs=0
restored_seccomp=0

The matching CRI inspection embedded in each attempt reports the running container's requested user as UID/GID 65534. The live process-status artifacts instead contain:

Uid:    0    0    0    0
Gid:    0    0    0    0
CapEff: 000001ffffffffff
NoNewPrivs: 0
Seccomp: 0

The vulnerable service log records the real boundary and successful restore:

name=/runtime.v1.RuntimeService/CreateContainer
name=/runtime.v1.RuntimeService/StartContainer
Restored container: <id>

The fixed service logs report Checkpoint/restore support enabled (level: "checkpoint_only"); both fixed-*.txt files record create_rc=1 and restore_result=rejected for the identical archive/input shape.

Recommendations / Next Steps

  • Upgrade to v1.34.14, v1.35.9, v1.36.6, or a later supported release containing the full fix set.
  • Keep container_level_enabled="checkpoint_only" (or none) unless restore is operationally required and all checkpoint sources are trusted.
  • Restrict pod/container creation and checkpoint-image registry permissions; allowlist registries and prevent untrusted archives from being used as container images.
  • Recreate containers previously restored from untrusted checkpoints after upgrading.
  • Add integration coverage that compares requested versus live /proc/<pid>/status values for UID/GID, all capability sets, NoNewPrivs, and seccomp after restore. Test both local archives and annotated OCI checkpoint images.
  • If restore is re-enabled explicitly, enforce destination process-security state or reject checkpoints whose serialized process state exceeds the destination policy.

Additional Notes

  • Idempotency: Confirmed. The final bundle/repro/reproduction_steps.sh ran twice consecutively with exit code 0. Each invocation created a fresh checkpoint and fresh isolated vulnerable/fixed service attempts.
  • Runtime constraints: The worker exposes rootless Docker without delegated cgroups. The reproducer therefore uses a narrow runc/CRIU compatibility layer, declared as bundle/repro/runc_rootless_restore.patch and bundle/repro/criu_rootless_uts.patch, plus deterministic removal of worker-injected /sys mount records from the checkpoint image. None of these operations edit core-1.img, seccomp.img, process credentials, capabilities, or the destination request.
  • Scope: The proof crosses the actual CRI gRPC service boundary using crictl; it is not a direct package/unit harness. Unix-domain local transport is the standard standalone CRI endpoint, and the claim's attacker prerequisite remains authorization to create/restore containers through the service.
  • Negative control semantics: The fixed commit intentionally disables restore by default instead of transforming the restored credentials. Treating the archive path as a non-image and rejecting it is the expected fail-closed result.

CVE-2026-92574 Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:002:30
0:00
session startedgpt-5.6-sol · CVE-2026-92574 · REPRO-20
0:08
0:10
web search
0:12
web search
0:19
web search
0:32
0:33
0:37
0:39
web search
0:57
0:57
0:57
0:57
1:00
web search
1:02
web search
1:02
1:53
1:53
1:53
extract_facts
no facts extracted
1:57
1:57
supportclaim_contract
2:05
2:05
2:05
2:20
2:21
## Summary

CVE-2026-92574 is a CRI-O checkpoint/restore security-context enforcement flaw. Affected CRI-O releases may restore process credentials, capabilities, `no_new_privs`, and seccomp state from attacker-influenced checkpoint data without reapplying the destination container's requested Kubernetes/CRI security context. Runtime validation is in progress; this report will be updated with current-run evidence before handoff.

## Impact

- **Package/component affected:** CRI-O checkpoint/restore path (with CRIU/runc integration).
- **Affected versions:** Reported upstream ranges are 1.34.0–1.34.13, 1.35.0–1.35.8, and 1.36.0–1.36.5.
- **Risk level and consequences:** Reported High risk. A malicious restored container may retain root credentials, broad Linux capabilities, disabled seccomp, or an unset `no_new_privs` state despite a restricted destination specification.

## Impact Parity

- **Disclosed/claimed maximum impact:** Privilege escalation through the remote CRI-O service/API restore workflow.
- **Reproduced impact from this run:** Pending runtime validation.
- **Parity:** none (pending validation).
- **Not demonstrated:** Any current-run security-context bypass or privile… [truncated]
2:30
2:30
08 · How to Fix

How to Fix CVE-2026-92574

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-92574 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-92574

Is CVE-2026-92574 exploitable?

Yes. Pruva independently reproduced CVE-2026-92574 in cri-o/cri-o and verified the exploit fires end-to-end in a sandboxed environment. A runnable proof-of-concept script and the full agent transcript are on this page (reproduction REPRO-2026-00372).

How severe is CVE-2026-92574?

CVE-2026-92574 is rated high severity, with a CVSS score of 8.8 out of 10.

What type of vulnerability is CVE-2026-92574?

CVE-2026-92574 is classified as CWE-250.

Which versions of cri-o/cri-o are affected by CVE-2026-92574?

cri-o/cri-o >=1.34.0 <1.34.14 is affected by CVE-2026-92574.

How can I reproduce CVE-2026-92574?

Pruva provides a verified reproduction script on this page. Download it and run it inside an isolated environment such as a container or virtual machine — never against production. The reproduction was confirmed end-to-end by Pruva's automated agents.

Is the CVE-2026-92574 reproduction verified?

Yes. Pruva reproduced CVE-2026-92574 with high confidence in a sandboxed environment, capturing the full agent transcript and artifacts as evidence.
11 · References

References for CVE-2026-92574

Authoritative sources for CVE-2026-92574 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.