
CVE-2025-31133 PoC
Ce document explique le fonctionnement du script Proof-of-Concept (PoC) fourni pour la vulnérabilité runc CVE-2025-31133.
maskedPaths de runc.maskedPaths, ce qui lui permet d'écrire dans des fichiers sensibles du système hôte. Cela constitue une évasion de conteneur./proc/sys/kernel/core_pattern de l'hôte depuis un conteneur."pwned" dans le fichier cible et n'exécute pas de code arbitraire sur l'hôte. Il fournit également des instructions pour restaurer la valeur d'origine.La fonctionnalité maskedPaths de la spécification OCI d'un conteneur (config.json) est un mécanisme de sécurité conçu pour empêcher les conteneurs d'accéder à des fichiers système sensibles. Elle fonctionne en montant par liaison (bind mount) /dev/null (un fichier de périphérique vide) sur ces chemins sensibles à l'intérieur du conteneur, les rendant ainsi non lisibles et non inscriptibles.
La vulnérabilité (CVE-2025-31133) est une condition de course Time-of-Check to Time-of-Use (TOCTOU). L'exploit fonctionne comme suit :
runc configure le conteneur, il prépare l'utilisation du fichier dev/null du rootfs du conteneur comme source pour le montage par liaison qui masquera le chemin sensible (par exemple /proc/sys/kernel/core_pattern).runc résout le chemin vers rootfs/dev/null et le moment où il effectue réellement l'opération de montage.rootfs/dev/null entre un nœud de périphérique légitime et un lien symbolique pointant vers le fichier cible sur l'hôte (/proc/sys/kernel/core_pattern).runc effectuera son opération de montage au moment exact où rootfs/dev/null est un lien symbolique. Cela amène le noyau à suivre le lien symbolique, et l'opération de masquage prévue échoue pour /proc/sys/kernel/core_pattern./proc/sys/kernel/core_pattern, ce qui modifie directement le fichier de l'hôte, réalisant ainsi une évasion de conteneur.Ce PoC utilise cette technique pour écrire dans /proc/sys/kernel/core_pattern, une cible courante pour ce type d'exploit car sa modification peut conduire à l'exécution de code arbitraire sur l'hôte lorsqu'un processus plante. Cependant, ce PoC écrit uniquement une chaîne inoffensive pour prouver l'existence de la primitive d'écriture.
Le script poc.sh automatise l'ensemble du processus décrit ci-dessus.
Configuration et nettoyage :
runc, le nom du conteneur et le chemin du rootfs.cleanup robuste qui garantit la suppression de tous les conteneurs ou fichiers créés précédemment par le script. Cette fonction est automatiquement appelée à la sortie, sur interruption ou sur terminaison.Préparation :
/proc/sys/kernel/core_pattern de l'hôte dans un fichier temporaire. Ceci est utilisé ensuite pour vérifier si l'exploit a réussi et pour aider l'utilisateur à restaurer le système../rootfs) et un fichier config.json.config.json liste explicitement /proc/sys/kernel/core_pattern sous maskedPaths — précisément la fonctionnalité que l'exploit vise à contourner.La fonction de course (symlink_race)
rootfs/dev/null.rootfs/dev/null vers le fichier cible de l'hôte (/proc/sys/kernel/core_pattern).rootfs/dev/null comme un périphérique de caractères (mknod) approprié.Exécution :
symlink_race est démarrée comme processus en arrière-plan.runc run ... pour créer et démarrer le conteneur. C'est le moment où runc tente d'appliquer les maskedPaths.runc exec pour exécuter une commande à l'intérieur du conteneur : echo 'pwned' > /proc/sys/kernel/core_pattern.Vérification :
/proc/sys/kernel/core_pattern de l'hôte."pwned" et la valeur d'origine.[+] EXPLOIT SUCCEEDED! ou [-] Exploit did not succeed.Prérequis :
runc.busybox-static installé (pour le shell du conteneur).sudo) pour exécuter runc et modifier /proc.Étapes :
poc.sh.chmod +x poc.sh.sudo ./poc.sh.[+] EXPLOIT SUCCEEDED!, cela signifie que la condition de course a été gagnée. Le /proc/sys/kernel/core_pattern de l'hôte a été modifié avec succès depuis le conteneur, confirmant la vulnérabilité.[-] Exploit did not succeed., la course n'a pas été gagnée lors de cette tentative. Les conditions de course sont probabilistes et dépendent fortement du timing et de la charge du système. Essayez d'exécuter le script plusieurs fois.Le PoC modifie un fichier système. Pour le restaurer dans son état d'origine, exécutez la commande suggérée par le script :
# The 'ORIGINAL_PATTERN' will be the actual value from your system
echo 'original_core_pattern_value' | sudo tee /proc/sys/kernel/core_pattern