- Présentation d’une technique d’attaque exploitant des caractères de retour chariot dans un dépôt Git
- Cette vulnérabilité ouvre la possibilité d’une exécution de code à distance (RCE)
- Des commandes malveillantes peuvent être exécutées pendant un certain processus de
git clone
- L’impact a été confirmé sur des environnements Linux et Windows
- Mise en avant des risques liés à une gestion insuffisamment sécurisée des dépôts Git
Caractères de retour chariot et vulnérabilité Git
- Il est possible de créer, à l’intérieur d’un dépôt Git, des noms de fichiers contenant des caractères de retour chariot (
\r)
- Lorsqu’un dépôt contenant de tels noms de fichiers est dupliqué avec
git clone, le processus d’interprétation des commandes peut entraîner l’exécution involontaire de commandes
Scénario d’exécution de code à distance (RCE)
- Un attaquant ajoute à un dépôt un fichier dont le nom contient un caractère de retour chariot, puis le commit
- Si un utilisateur exécute
git clone sur ce dépôt, une mauvaise interprétation par le système de fichiers et les commandes Git peut provoquer l’exécution de code non souhaitée
- En particulier, il peut être possible d’amener l’exécution automatique de scripts de hook (par exemple du code dans le dossier
.git/hooks)
Environnements affectés et réponse
- Le problème peut se produire dans Git sur divers systèmes d’exploitation, notamment Linux et Windows
- Il s’agit d’une menace de sécurité grave pour les développeurs et les entreprises qui administrent des dépôts Git ou clonent fréquemment des dépôts externes
Recommandations de sécurité
- Lors du clonage de dépôts Git externes non fiables, il est nécessaire d’utiliser la version la plus récente et de vérifier l’état de sécurité
- Il est recommandé de détecter les noms de fichiers contenant des caractères inhabituels dans le dépôt, en particulier des retours chariot, et de les examiner avant le clonage
1 commentaires
Commentaire Hacker News
Tout cela explique le phénomène suivant lors d’un clone de sous-module : la lecture se fait sous la forme
path = ..., mais l’écriture enregistre vers un autre chemin qui ne se termine pas par^MInterrogation sur la façon dont l’« exécution de code à distance » mentionnée dans l’article se produit ici, et sur la gravité réelle du problème du point de vue de la sécurité
Le PoC n’a pas encore été publié, mais il est indiqué qu’il s’agit presque d’une simple adaptation de l’exploit CVE-2024-32002, et que les tests du commit correctif donnent aussi de gros indices
Citation de l’explication de CVE-2024-32002 : en manipulant de manière malveillante un dépôt contenant un sous-module et en exploitant un bug de Git, il est possible d’écrire des fichiers dans le répertoire
.git/au lieu du worktree du sous-module. Cela permet d’écrire un hook qui sera exécuté immédiatement pendant le clone, sans même laisser à l’utilisateur l’occasion d’inspecter le code réellement exécutéEn résumé, on peut injecter un hook Git malveillant dans le dépôt ; normalement, les hooks Git ne sont pas installés lors d’un
git clone, mais cette attaque rend cela possible et ouvre la voie à l’exécution d’un hook pendant le processus de cloneDavantage d’informations sur le nouveau CVE sont disponibles ici
post-checkoutMention de cette vérité simple mais gênante : dès qu’une écriture de fichier arbitraire est possible, on finit souvent par obtenir une RCE
Mention des risques liés à l’écriture de fichiers de configuration avec un DSL ad hoc
Il n’existe souvent pas de spécification formelle de la grammaire, et la véritable référence du parsing se retrouve dispersée dans des implémentations maison de sérialisation/désérialisation
Si les deux divergent — par exemple si le parseur prend en charge une nouvelle syntaxe mais que le writer ne la reflète pas — les différences de parsing peuvent devenir explosives
La leçon : il faut un unique source of truth et une architecture où les parties qui en dépendent sont générées automatiquement à partir de celui-ci
Remarque que ce bug n’a toutefois rien à voir avec un problème de source of truth
Avis selon lequel le DSL utilisé ici (le format de fichier ini), bien qu’ad hoc, est très courant, familier et suffisamment structuré pour servir en pratique de spécification
Reproduction directe du problème, puis publication dans ce dépôt
Tentative immédiate de mise à jour vers la dernière version de Git ; ce n’est pas encore disponible sur Arch
Intention d’éviter les
pulljusqu’au nouveau correctif, avec l’inquiétude que cela pose problème sur des dépôts populaires avec despullautomatiques, ce qui pourrait ralentir fortement les mises à jourQuestion sur le fait que cette vulnérabilité ait été divulguée avant la publication du correctif
En voyant la mention d’une « simple adaptation » d’un exploit existant, interrogation sur l’absence d’usage de Landlock par Git (Landlock est une fonctionnalité de sécurité sandbox spécifique à Linux)
Suggestion qu’une opération
git clonedevrait avoir un accès en lecture seule au répertoire de configuration, des droits lecture/écriture sur le répertoire cible du clone, et une interdiction d’invoquer des sous-processusMoquerie sur ce moment profond où chaque exploit finit toujours par lancer une calculatrice
Objection : interdire les sous-processus casserait tous les hooks Git comme
post-checkoutseccomp, mais beaucoup de fonctionnalités seraient alors limitéesEt sans sous-processus, il serait aussi impossible d’utiliser Git via SSH
Question pour savoir si Homebrew est lui-même concerné, c’est-à-dire s’il effectue des clones récursifs
Une possibilité est repérée dans ce code
Réponse selon laquelle l’objectif même de Homebrew est d’exécuter le code du dépôt, donc l’absence de clone récursif serait presque plus surprenante
Souvenir ravivé en voyant la célèbre citation de Jon Postel à propos de CR+LF
git blame, le code en cause a été écrit il y a 19 ans, ce qui coïncide avec le dixième anniversaire de la rétrospective de BernsteinPas encore de mise à jour vers Git 2.50.1 dans Homebrew, il faudra donc sans doute attendre encore un peu
brew install git --HEADpour se mettre à jourPartage du fait que Homebrew et Debian Bookworm distribuent toujours des versions vulnérables
Réflexion sur ce que devrait faire un appel système qui énumère le contenu d’un répertoire lorsqu’un nom de fichier contient des caractères de contrôle ASCII (bytes) : nier l’existence de ce fichier, considérer cela comme une corruption du disque, ou faire autre chose
Mention que ces octets peuvent avoir une autre signification dans la locale courante ; comme sous Unix on ne suppose pas, contrairement à Windows, que tous les noms de fichiers sont en UTF-16, des situations inattendues peuvent survenir
Remarque simple : sur les systèmes de type Unix, les noms de fichiers (et d’autres chaînes) ne sont que des tableaux d’octets, ce qui explique ce problème