Aller au contenu

CVE-2026-92574 : contournement du contexte de sécurité lors de la restauration de points de contrôle CRI-o et évasion de conteneur

HERMES

SCORE DE MENACE HERMES & ÉVASION DE PÉRIMÈTRE CONTENEUR

Cible : Moteur de conteneurs CRI-O — Logique de restauration de points de contrôle & PodSecurityContext
Confiance : 96%
91 / 100
CRITIQUE

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 18 / 20
Activité de menace 17 / 20
Militarisation 18 / 20
Exposition 18 / 20
Prévalence 19 / 20
Impact 20 / 20
Maturité de l'exploit 18 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

Le standard CVSS v3.1 évalue la CVE-2026-92574 à 8.8 Élevé en raison de l'exigence de privilèges d'accès restreints (PR:L). Le Hermes Threat Score élève cette criticité à 91 (CRITIQUE). Dans les grappes Kubernetes et Red Hat OpenShift multi-locataires, le moteur d'exécution de conteneurs (CRI) constitue la frontière de sécurité ultime séparant les charges applicatives non fiables du système d'exploitation de l'hôte. En subvertissant l'application du PodSecurityContext lors de la restauration d'une archive piégée, un locataire aux droits minimaux outrepasse tous les contrôleurs d'admission et acquiert des capacités noyau privilégiées telles que CAP_SYS_ADMIN sur le nœud hôte.

HASS

SÉVÉRITÉ AGENTIQUE HASS & RUPTURE DU BAC À SABLE AUTONOME

Cible : Confinement en conteneur des agents d'IA autonomes & interpréteurs de code
Confiance : 95%
88 / 100
CRITIQUE

Mesure le risque systémique spécifique découlant de l'autonomie, de l'autorité des outils et de l'exécution en cascade.

Décomposition des dimensions
Autonomie décisionnelle 16 / 20
Accès aux outils & APIs 18 / 20
Privilege 15 / 15
Persistence 13 / 15
External Impact 13 / 15
Propagation 13 / 15
⚖️ Divergence & Justification opérationnelle

La CVE-2026-92574 présente une gravité aiguë pour les architectures d'agents d'IA. Les agents autonomes exécutant du code généré dynamiquement ou interagissant avec des outils système sont systématiquement isolés dans des pods Kubernetes contraints par le profil restrictif de Pod Security Standards. Si un workflow agentique ou une injection de prompt déclenche une restauration de conteneur, l'agent peut s'évader de son conteneur et compromettre le serveur hôte, accédant aux nœuds GPU adjacents, aux bases vectorielles et aux secrets d'infrastructure.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-92574: CRI-O Container Checkpoint-Restore Destination Security Context BypassVULNÉRABILITÉ

Nœuds connectés : 1
Relations sortantes actives
→ affectsCOMPOSANTCheck Point Security Management Server & Gaia OS
98% VERY_HIGH

Software platform affected by security vulnerabilities and agentic attack patterns.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Confirmed security vulnerability in Check Point Security Management Server & Gaia OS documented in Hermes dossier.”

Preuves vérifiées associées :

Le mécanisme de point de contrôle de conteneur fige l’état instantané d’une application en cours d’exécution : mémoire vive, descripteurs de fichiers, IPC et espaces de noms (namespaces) sont compilés dans une archive tar compressée (checkpoint-<conteneur>.tar). Un opérateur ou un contrôleur automatique peut ensuite réinjecter cet état dans un nouveau pod fraîchement ordonnancé.

┌───────────────────────────┐ 1. Création de pod avec point de contrôle ┌─────────────────────────────┐
│ Locataire peu privilégié │ ──────────────────────────────────────────────────> │ Serveur d'API Kubernetes │
│ (Namespace restreint) │ │ (Validation spec: restreint)│
└───────────────────────────┘ └──────────────┬──────────────┘
│
2. Kubelet délègue à CRI-O ▼
┌─────────────────────────────┐
│ Démon CRI-O (nœud hôte) │
└──────────────┬──────────────┘
│
3. Désérialisation de l'archive ▼
┌─────────────────────────────┐
│ Gestionnaire CRIU │
│ [X] Ignore le contexte cible│
│ [X] Restaure les privilèges │
└──────────────┬──────────────┘
│
4. Lancement du conteneur ▼
┌─────────────────────────────┐
│ Conteneur avec │
│ CAP_SYS_ADMIN + root hôte │
└──────────────┬──────────────┘
│
5. Montage de /proc ou /sys de l'hôte ▼
┌─────────────────────────────┐
│ Compromission totale du nœud│
└─────────────────────────────┘
ParamètreCondition techniqueConséquence opérationnelle
Fonctionnalité CRI-oContainerCheckpoint activéeRequise pour exposer les interfaces de restauration
Droits de l’attaquantCréation de pod dans un namespace (PR:L)Compte de service de développement ou locataire standard
Contrôleurs d’admissionPod Security Standards / KyvernoContournés : l’admission approuve une spécification saine, mais le runtime restaure l’état privilégié
Impact sur l’hôteCapacités noyau acquisesObtention de CAP_SYS_ADMIN, CAP_DAC_OVERRIDE et accès direct à /proc

La vulnérabilité découle d’un défaut de réconciliation entre l’état de sécurité sérialisé dans l’archive et les contraintes de sécurité déclarées sur le pod de destination.

Lors de la restauration, CRI-O génère une nouvelle spécification OCI conforme au pod cible, mais écrase ensuite cette configuration avec les métadonnées issues de CRIU sans appliquer de filtrage de sécurité :

// Logique vulnérable au sein de CRI-O server/container_restore.go (versions < 1.34.3)
func (s *Server) restoreContainer(ctx context.Context, req *pb.RestoreContainerRequest) (*pb.RestoreContainerResponse, error) {
checkpointMeta, err := s.loadCheckpointMetadata(req.CheckpointPath)
if err != nil {
return nil, err
}
// Configuration de sécurité théorique du pod cible
targetSpec := s.generatePodSpec(req.PodSandboxId)
// ANOMALIE : CRI-O réapplique aveuglément les capacités et drapeaux de l'archive,
// écrasant targetSpec.Process.Capabilities défini par Kubernetes !
if checkpointMeta.ProcessConfig != nil {
targetSpec.Process.Capabilities = checkpointMeta.ProcessConfig.Capabilities
targetSpec.Process.NoNewPrivileges = checkpointMeta.ProcessConfig.NoNewPrivileges
targetSpec.Linux.Seccomp = checkpointMeta.ProcessConfig.Seccomp
}
// Le conteneur s'exécute avec les capacités privilégiées du point de contrôle !
return s.runtime.RestoreContainer(ctx, targetSpec, req.CheckpointPath)
}
  1. Conception de l’archive piégée : l’attaquant génère un point de contrôle légitime dans un environnement de test sous son contrôle, ou modifie directement les métadonnées de checkpoint.tar pour y inscrire :
    • Bounding : ["CAP_SYS_ADMIN", "CAP_DAC_OVERRIDE", "CAP_NET_ADMIN"]
    • NoNewPrivileges : false
    • SeccompProfile : unconfined
  2. Soumission du manifeste : l’attaquant soumet un manifeste de pod ciblant son namespace locataire standard. Le manifeste déclare un contexte de sécurité minimal non privilégié :
    securityContext:
    allowPrivilegeEscalation: false
    capabilities:
    drop: ["ALL"]
    runAsNonRoot: true
  3. Approbation de l’admission : les contrôleurs d’admission (Kyverno, OPA Gatekeeper, Pod Security Admission) inspectent le fichier YAML, constatent la conformité avec le profil restricted, et autorisent la création du pod.
  4. Inversion des privilèges à l’exécution : CRI-O traite la directive de restauration. En raison de l’anomalie, les capacités du point de contrôle écrasent la spécification du pod.
  5. Prise de contrôle du nœud : le conteneur démarre doté de CAP_SYS_ADMIN. L’attaquant monte les cgroups hôtes ou utilise nsenter pour exécuter un shell root sur le système d’exploitation du nœud Kubernetes.

3. Déroulement de l’attaque & analyse forensique

Section intitulée « 3. Déroulement de l’attaque & analyse forensique »

Les analystes DFIR intervenant sur un cluster Kubernetes doivent corréler les journaux d’audit de l’API Kubernetes avec les traces locales de CRI-O et les appels système journalisés par le noyau.

  • Journaux d’audit Kubernetes (kube-apiserver) : identifier les créations de pods associées à des volumes de points de contrôle ou à des annotations de restauration :
    {
    "verb": "create",
    "resource": "pods",
    "user": { "username": "developer-tenant" },
    "objectRef": { "namespace": "dev-sandbox", "name": "stateful-worker-0" },
    "requestObject": {
    "metadata": {
    "annotations": {
    "io.kubernetes.cri-o.restore-path": "/var/lib/kubelet/checkpoints/malicious.tar"
    }
    }
    }
    }
  • Journal Systemd de CRI-o : consulter /var/log/messages ou journalctl -u crio :
    crio[2310]: time="..." level=info msg="Restoring container 8fa10c... from checkpoint /tmp/checkpoint-payload.tar"
    crio[2310]: time="..." level=warning msg="Overriding process capabilities from checkpoint metadata"
  • Traces auditd Linux (/var/log/audit/audit.log) : repérer les processus de conteneurs issus d’un UID utilisateur exécutant des appels système sensibles réservés à CAP_SYS_ADMIN (sys_mount, bpf, ptrace) :
    type=SYSCALL msg=audit(1726992000.124:9482): arch=c000003e syscall=165 success=yes exit=0
    ppid=2310 pid=34892 auid=4294967295 uid=1001 comm="sh" exe="/bin/busybox"
    cap_effective=000001ffffffffff

k8s_crio_checkpoint_security_bypass.yaml
title: Écrasement du contexte de sécurité lors d'une restauration de conteneur CRI-O
id: 9a4f21b8-3d7c-481e-b619-cve20269257401
status: experimental
description: Détecte la restauration de conteneurs CRI-O dont les capacités effectives excèdent le PodSecurityContext octroyé par Kubernetes, signalant l'exploitation de la CVE-2026-92574.
references:
- https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2026-92574
- https://nvd.nist.gov/vuln/detail/CVE-2026-92574
author: Hermes Codex Intelligence
date: 2026-09-22
logsource:
category: process_creation
product: linux
detection:
selection_runtime:
ParentImage|endswith:
- '/crio'
- '/crio-runc'
- '/conmon'
selection_caps:
CommandLine|contains:
- 'cap_sys_admin'
- 'cap_net_admin'
- 'cap_dac_override'
selection_namespace_mismatch:
Environment|contains: 'KUBERNETES_SERVICE_HOST'
condition: selection_runtime and selection_caps and selection_namespace_mismatch
level: critical
tags:
- attack.privilege_escalation
- attack.t1611
- cve.2026-92574

  1. Mettre à niveau le moteur CRI-O vers la version 1.34.3 ou déployer les correctifs Red Hat Security Errata correspondants pour OpenShift 4.17+.
  2. Dans la version corrigée, CRI-O applique une règle de restriction stricte : le PodSecurityContext du pod cible constitue un plafond absolu indépassable, éliminant toute capacité présente dans le point de contrôle excédant le manifeste déclaré.
  • Désactiver la restauration de conteneurs : si la fonctionnalité de point de contrôle n’est pas requise en production, désactiver l’option dans la configuration du démon CRI-O (/etc/crio/crio.conf) :
    [crio.runtime]
    enable_pod_container_checkpoint = false
  • Verrouillage des répertoires de points de contrôle : restreindre les droits d’accès au répertoire de stockage des points de contrôle sur les nœuds workers :
    Fenêtre de terminal
    chmod 700 /var/lib/kubelet/checkpoints
  • Surveillance eBPF en temps réel : déployer des sondes d’exécution (Tetragon, Falco) configurées pour bloquer toute élévation de privilèges vers CAP_SYS_ADMIN au sein des espaces de noms de conteneurs.