Comment nous avons obtenu les privilèges root sur Copilot
(research.eye.security)- En avril 2025, Copilot Enterprise a été mis à jour avec un sandbox Python en temps réel (basé sur Jupyter Notebook), rendant possible l’exécution de code côté back-end
- Grâce à la syntaxe %command de Jupyter Notebook, il était facile d’exécuter du code arbitraire sur le système sous-jacent, et les commandes Linux pouvaient aussi être lancées en tant qu’utilisateur ubuntu (environnement miniconda)
- Une faille de sécurité existait, car le chemin /app/miniconda/bin était accessible en écriture par l’utilisateur ubuntu et avait aussi la priorité dans le $PATH de root, ce qui permettait d’écraser des commandes clés comme pgrep
- Cette faille a été exploitée pour obtenir les privilèges root, mais l’intérieur du conteneur était fortement isolé, rendant toute évasion du conteneur impossible, sans fuite d’informations supplémentaire
- Après un signalement en avril, la faille a été corrigée en juillet avec un niveau de risque modéré, et le chercheur a seulement été ajouté à la liste des remerciements, sans récompense
Analyse de la vulnérabilité du sandbox Jupyter de Microsoft Copilot Enterprise
Vue d’ensemble de l’environnement Jupyter de Copilot Enterprise
- Depuis avril 2025, un sandbox Python basé sur Jupyter Notebook a été introduit dans Copilot Enterprise
- Les utilisateurs peuvent exécuter des commandes système Linux via la syntaxe %command de Jupyter
- L’environnement s’exécute avec les privilèges de l’utilisateur ubuntu sur une base miniconda, sans binaire sudo
- Il est possible d’explorer de nombreux éléments comme les variables d’environnement, le réseau, le système de fichiers et les informations sur les processus
Fonctionnement interne et structure du conteneur
- Copilot est similaire au sandbox de ChatGPT, mais utilise un noyau plus récent et Python 3.12
- Processus principaux : Jupyter Notebook, goclientapp écrit en Go (exécuté sur le port 6000), httpproxy, etc.
- Le réseau n’active que le loopback et des interfaces link-local limitées
- Le système de fichiers repose sur OverlayFS avec le chemin /legion comme base, et des scripts personnalisés sont présents dans /app
Téléchargement et manipulation de fichiers
- Les fichiers texte et les sorties de commandes peuvent être téléchargés normalement, mais les fichiers binaires risquent d’être corrompus, ce qui nécessite un encodage base64
- Les fichiers se trouvent dans /mnt/data et un lien de téléchargement externe est généré sous forme d’URL blob
Structure de goclientapp/httpproxy
- goclientapp : exécute dans l’environnement Jupyter le code (au format JSON) reçu de l’extérieur via l’endpoint /execute, puis renvoie le résultat
- httpproxy : sert de proxy pour le trafic HTTP sortant depuis Jupyter (désactivé avec ENABLE_EGRESS=false)
Vulnérabilité du script entrypoint.sh
- Dans entrypoint.sh, le script de point d’entrée du conteneur, plusieurs services (goclientapp, httpproxyapp) s’exécutent avec les privilèges de l’utilisateur ubuntu
- Seul keepAliveJupyterSvc.sh continue à s’exécuter en root
- À la ligne 28, la commande
pgrep -f "jupyter notebook --ip=0.0.0.0 --port=8888"s’exécute selon la priorité des répertoires présents dans le $PATH /app/miniconda/binapparaît avant/usr/bindans le PATH à la fois pour root et pour l’utilisateur ubuntu → il est donc possible de remplacer arbitrairement des commandes comme pgrep
Processus d’obtention des privilèges root et limites
- L’attaquant a créé un script pgrep malveillant dans
/app/miniconda/bin, ce qui amenait entrypoint.sh à exécuter périodiquement ce fichier avec les privilèges root - Ce script lisait le fichier /mnt/data/in, l’exécutait comme commande shell, puis enregistrait le résultat dans /mnt/data/out
- Cette méthode a permis d’obtenir les privilèges root dans le conteneur, mais l’accès à des informations sensibles comme les fichiers de /root ou les logs restait impossible, et aucune évasion du conteneur n’était possible
- Le conteneur avait déjà été corrigé contre divers scénarios de breakout
Réponse de Microsoft et résultat
- 18 avril 2025 : Eye Security a transmis un rapport de vulnérabilité au MSRC
- 25 juillet 2025 : Microsoft a classé la faille avec une sévérité modérée (moderate severity), a corrigé le problème, clos le dossier et ajouté le chercheur à la liste des remerciements (sans bug bounty)
Références et annexe
-
Eye Security est une entreprise européenne de cybersécurité proposant surveillance des menaces 24/7, réponse aux incidents et cyberassurance
-
Les cas d’intrusion dans des services internes de Microsoft, y compris cette faille (Entra OAuth, etc.), doivent être présentés à BlackHat USA 2025
-
Chronologie
- 18 avril 2025 – Signalement au MSRC
- 25 juillet 2025 – Correctif, clôture du dossier et publication du blog
1 commentaires
Commentaires sur Hacker News
sudoencodé en base64 puis en l’utilisant