Kubernetes est un environnement IT comme les autres et est donc soumis à de nombreuses failles. Depuis un an, l'orchestrateur de cluster de containers en a connu deux particulièrement graves. Tout d'abord l'été dernier dans les fichiers configuration YAML des clusters Kubernetes accordant des privilèges systèmes sur les hôtes Windows. Et puis plus récemment en novembre une autre méritant une attention particulière, cette fois relative à de l'injection de commandes via des volumes locaux de l'orchestrateur de containers.

Découverte et partagée ce 13 mars par le chercheur en sécurité d'Akamai Tomer Peled, celle-ci a été répertoriée en tant que CVE-2023-5528 et corrigée dans les versions 1.28.4, 1.27.8, 1.26.11 et 1.25.16 de Kubernetes publiées en novembre 2023. La faille est similaire à la précédente CVE-2023-3676 mais au lieu de cibler la fonction de volume subPath, elle provient de la fonction de volumes locaux. Ceux-ci sont un type de volumes pris en charge dans l'orchestrateur grâce auxquels les utilisateurs montent des partitions de disque à l'intérieur d'un pod. Ils se différencient des volumes hostPath leur donnant la possibilité de monter des répertoires spécifiques. Un administrateur de clusters peut provisionner l'espace de stockage à l'avance en créant un persistentVolume, puis les utilisateurs peuvent utiliser YAML lors de la configuration d'un pod pour faire un persistentVolumeClaim afin de réclamer une partie de cet espace de stockage.

Une faille corrigée, une mise à jour à effectuer

Problème : lors de l'analyse de ces demandes à partir d'un fichier YAML, le service kubelet s'appuyait sur une fonction qui utilisait exec.command pour exécuter une commande sur le système afin de créer un lien symbolique entre le volume et l'emplacement à l'intérieur du pod. Le terminal de ligne de commande Windows accepte la concaténation de commandes - l'exécution de plusieurs commandes sur une seule ligne - en plaçant les caractères && entre les commandes.

Tomer Peled - encore lui - a découvert qu'un attaquant pouvait placer des commandes dans la définition Path du persistentVolumeClaim dans YAML et les entourer avec les caractères && avant que celles-ci soient potentiellement exécutées sur le système hôte lorsque la réclamation est traitée par le service kubelet qui s'exécute avec les privilèges SYSTEM. L'équipe Kubernetes a corrigé la vulnérabilité d'injection de commande en remplaçant l'appel cmd effectué par le service kubelet par une fonction dans GO appelée "os.Symlink()" qui effectuera la même opération de création de liens symboliques mais d'une manière sûre. Si ce n'était pas encore le cas, il convient bien entendu d'appliquer d'installer les dernières versions disponibles pour éviter tout souci lié à cette dangereuse CVE.