release_agent exploit - Relative Paths to PIDs
Pour plus de détails, consultez l'article de blog à partir de https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Ceci n'est qu'un résumé :
La technique décrit une méthode pour exécuter du code hôte depuis un conteneur, surmontant les défis posés par les configurations du pilote de stockage qui obscurcissent le chemin du système de fichiers du conteneur sur l'hôte, comme Kata Containers ou des paramètres spécifiques de devicemapper
.
Étapes clés :
Localisation des identifiants de processus (PID) : En utilisant le lien symbolique
/proc/<pid>/root
dans le pseudo-système de fichiers Linux, n'importe quel fichier dans le conteneur peut être accédé par rapport au système de fichiers de l'hôte. Cela contourne le besoin de connaître le chemin du système de fichiers du conteneur sur l'hôte.PID Bashing : Une approche de force brute est utilisée pour rechercher à travers les PID sur l'hôte. Cela est fait en vérifiant séquentiellement la présence d'un fichier spécifique à
/proc/<pid>/root/<fichier>
. Lorsque le fichier est trouvé, cela indique que le PID correspondant appartient à un processus s'exécutant à l'intérieur du conteneur cible.Déclenchement de l'exécution : Le chemin PID deviné est écrit dans le fichier
release_agent
descgroups
. Cette action déclenche l'exécution durelease_agent
. Le succès de cette étape est confirmé en vérifiant la création d'un fichier de sortie.
Processus d'exploitation
Le processus d'exploitation implique un ensemble d'actions plus détaillées, visant à exécuter une charge utile sur l'hôte en devinant le PID correct d'un processus s'exécutant à l'intérieur du conteneur. Voici comment cela se déroule :
Initialiser l'environnement : Un script de charge utile (
payload.sh
) est préparé sur l'hôte, et un répertoire unique est créé pour la manipulation des cgroups.Préparer la charge utile : Le script de charge utile, qui contient les commandes à exécuter sur l'hôte, est écrit et rendu exécutable.
Configurer le cgroup : Le cgroup est monté et configuré. Le drapeau
notify_on_release
est défini pour garantir que la charge utile s'exécute lorsque le cgroup est libéré.Force brute PID : Une boucle itère à travers les PID potentiels, écrivant chaque PID deviné dans le fichier
release_agent
. Cela définit efficacement le script de charge utile comme lerelease_agent
.Déclencher et vérifier l'exécution : Pour chaque PID, le
cgroup.procs
du cgroup est écrit, déclenchant l'exécution durelease_agent
si le PID est correct. La boucle continue jusqu'à ce que la sortie du script de charge utile soit trouvée, indiquant une exécution réussie.
PoC de l'article de blog :
Last updated