- Presentación de una técnica de ataque que aprovecha caracteres de retorno de carro dentro de un repositorio Git
- Esta vulnerabilidad genera la posibilidad de ejecución remota de código (RCE)
- Durante ciertos procesos de
git clone se ejecutan comandos maliciosos
- Se confirmó el impacto en entornos Linux y Windows
- Se enfatiza el riesgo de una gestión insegura de repositorios Git
Caracteres de retorno de carro y vulnerabilidad en Git
- Dentro de un repositorio Git se pueden crear nombres de archivo que incluyan caracteres de retorno de carro (
\r)
- Al clonar con
git clone un repositorio que contiene esos nombres de archivo, durante el proceso de interpretación de comandos puede producirse la ejecución no intencional de comandos
Escenario de ejecución remota de código (RCE)
- Un atacante agrega al repositorio y hace commit de un archivo con un carácter de retorno de carro insertado
- Si un usuario hace
git clone de ese repositorio, una interpretación incorrecta del sistema de archivos y de los comandos de git puede provocar el riesgo de ejecutar código no deseado
- En particular, es posible inducir la ejecución automática de scripts de hooks (por ejemplo, código dentro de la carpeta
.git/hooks)
Entornos afectados y respuesta
- Puede ocurrir en git sobre varios sistemas operativos, incluidos Linux y Windows
- Representa una grave amenaza de seguridad para desarrolladores y empresas que administran repositorios git o clonan con frecuencia repositorios externos
Recomendaciones de seguridad
- Al clonar repositorios Git externos no confiables, es necesario usar la versión más reciente y verificar el estado de seguridad
- Es necesario detectar y revisar antes de clonar los nombres de archivo que incluyan caracteres inusuales dentro del repositorio, especialmente retorno de carro y similares
1 comentarios
Opinión de Hacker News
Todo esto termina causando un fenómeno al hacer un clone de submódulos: al leer se usa
path = ..., pero al escribir se registra en otra ruta distinta que no termina en^MSe plantea la duda de cómo ocurre aquí exactamente la "ejecución remota de código" que menciona el artículo y qué tan grave es desde el punto de vista de seguridad
Aunque todavía no publicaron un PoC, mencionan que es casi una variación directa del exploit de CVE-2024-32002, y que las pruebas del commit que lo corrigió también dan pistas importantes
Citan la explicación de CVE-2024-32002: al manipular maliciosamente un repositorio con submódulos y aprovechar un bug de Git, se pueden escribir archivos en el directorio
.git/en vez del worktree del submódulo. Gracias a eso, es posible escribir hooks que se ejecutan inmediatamente durante el clone, sin que el usuario siquiera tenga oportunidad de inspeccionar el código que realmente va a ejecutarseEn resumen, se puede meter un hook malicioso de git en el repositorio, y aunque normalmente los hooks de git no se instalan con
git clone, este ataque sí lo hace posible, abriendo la puerta a la ejecución de hooks durante el proceso de clonaciónSe indica que hay más información sobre el nuevo CVE aquí
post-checkoutMencionan esa verdad simple pero incómoda: si es posible escribir archivos arbitrarios, la mayoría de las veces eso termina convirtiéndose en RCE
Se menciona el riesgo de escribir archivos de configuración con un DSL ad-hoc
Muchas veces no existe una especificación formal de la sintaxis, y el criterio real de parseo queda repartido entre implementaciones caseras de serialización y deserialización
Si ambas se desalinean —por ejemplo, si se agrega nueva sintaxis al parser pero el writer no la refleja—, esa diferencia de parseo puede volverse una bomba
La lección sería: hace falta tener una sola source of truth y generar automáticamente a partir de ella las partes que dependan de eso
Señalan que este bug es independiente del problema de source of truth
Opinan que el DSL usado aquí (formato de archivo ini), aunque sea ad-hoc, es muy común, familiar y bastante ordenado como para servir en la práctica como especificación suficiente
Alguien reprodujo el problema directamente y lo subió a este repositorio
Intentó actualizar de inmediato a la versión más reciente de git, pero todavía no está disponible en Arch
Dice que va a evitar hacer pull hasta que salga un nuevo parche, y le preocupa que esto pueda afectar repositorios populares con pull automático, por lo que la actualización podría tardar bastante
Se preguntan si esta vulnerabilidad se hizo pública antes de que existiera parche
Al ver que se decía que solo se hizo una "variación simple" del exploit existente, se preguntan por qué Git no usa Landlock (una función de seguridad de sandbox exclusiva de Linux)
Plantean que una operación de
git clonedebería tener acceso de solo lectura al directorio de config, lectura/escritura al directorio destino del clone y prohibición de invocar subprocesosSe burlan un poco de ese momento trillado donde todos los exploits siempre terminan abriendo la calculadora
Señalan el problema de que, si se prohíben los subprocesos, entonces se rompen todos los hooks de git como
post-checkoutseccomp, pero muchas funciones quedarían limitadasY además, sin subprocesos tampoco se podría usar git por
sshPreguntan si Homebrew en sí mismo es el problema, es decir, si hace recursive clone
Encuentran una posible pista en este código
Opinan que el objetivo mismo de Homebrew es ejecutar código del repositorio, así que sería casi raro que no hiciera recursive clone
Al ver una cita famosa de Jon Postel sobre CR+LF, recuerdan viejos tiempos
parsing/quoting)git blame, el código problemático fue escrito hace 19 años, casi coincidiendo con el aniversario número 10 de la retrospectiva de BernsteinParece que todavía no estaba disponible la actualización a git 2.50.1 en Homebrew, así que tocaría esperar un poco más
brew install git --HEADComparten que tanto Homebrew como Debian Bookworm seguían ofreciendo versiones vulnerables
Se preguntan si una syscall que lista directorios, al encontrarse con nombres de archivo que contienen caracteres de control ASCII (bytes), debería negar la existencia de esos archivos, tratarlos como corrupción de disco o hacer otra cosa
Mencionan que esos bytes podrían tener otro significado según la locale actual, y que como no se asume que todos los nombres de archivo estén en UTF-16 como en Windows, pueden aparecer situaciones inesperadas
Responden brevemente que este problema existe porque, en sistemas tipo Unix, los nombres de archivo (y otras cadenas) son simplemente arreglos de bytes