// For flags

CVE-2022-24826

Git LFS can execute a binary from the current directory on Windows

Severity Score

7.8
*CVSS v3.1

Exploit Likelihood

*EPSS

Affected Versions

*CPE

Public Exploits

0
*Multiple Sources

Exploited in Wild

-
*KEV

Decision

-
*SSVC
Descriptions

On Windows, if Git LFS operates on a malicious repository with a `..exe` file as well as a file named `git.exe`, and `git.exe` is not found in `PATH`, the `..exe` program will be executed, permitting the attacker to execute arbitrary code. This does not affect Unix systems. Similarly, if the malicious repository contains files named `..exe` and `cygpath.exe`, and `cygpath.exe` is not found in `PATH`, the `..exe` program will be executed when certain Git LFS commands are run. More generally, if the current working directory contains any file with a base name of `.` and a file extension from `PATHEXT` (except `.bat` and `.cmd`), and also contains another file with the same base name as a program Git LFS intends to execute (such as `git`, `cygpath`, or `uname`) and any file extension from `PATHEXT` (including `.bat` and `.cmd`), then, on Windows, when Git LFS attempts to execute the intended program the `..exe`, `..com`, etc., file will be executed instead, but only if the intended program is not found in any directory listed in `PATH`. The vulnerability occurs because when Git LFS detects that the program it intends to run does not exist in any directory listed in `PATH` then Git LFS passes an empty string as the executable file path to the Go `os/exec` package, which contains a bug such that, on Windows, it prepends the name of the current working directory (i.e., `.`) to the empty string without adding a path separator, and as a result searches in that directory for a file with the base name `.` combined with any file extension from `PATHEXT`, executing the first one it finds. (The reason `..bat` and `..cmd` files are not executed in the same manner is that, although the Go `os/exec` package tries to execute them just as it does a `..exe` file, the Microsoft Win32 API `CreateProcess()` family of functions have an undocumented feature in that they apparently recognize when a caller is attempting to execute a batch script file and instead run the `cmd.exe` command interpreter, passing the full set of command line arguments as parameters. These are unchanged from the command line arguments set by Git LFS, and as such, the intended program's name is the first, resulting in a command line like `cmd.exe /c git`, which then fails.) Git LFS has resolved this vulnerability by always reporting an error when a program is not found in any directory listed in `PATH` rather than passing an empty string to the Go `os/exec` package in this case. The bug in the Go `os/exec` package has been reported to the Go project and is expected to be patched after this security advisory is published. The problem was introduced in version 2.12.1 and is patched in version 3.1.3. Users of affected versions should upgrade to version 3.1.3. There are currently no known workarounds at this time.

En Windows, si Git LFS opera en un repositorio malicioso con un archivo "..exe" así como un archivo llamado "git.exe", y "git.exe" no se encuentra en "PATH", el programa "..exe" se ejecutará, permitiendo al atacante ejecutar código arbitrario. Esto no afecta a los sistemas Unix. Del mismo modo, si el repositorio malicioso contiene archivos llamados "..exe" y "cygpath.exe", y "cygpath.exe" no es encontrado en el "PATH", el programa "..exe" será ejecutado cuando sean ejecutados determinados comandos Git LFS. Más generalmente, si el directorio de trabajo actual contiene cualquier archivo con un nombre base de "." y una extensión de archivo de "PATHEXT" (excepto ".bat" y ". cmd"), y también contiene otro archivo con el mismo nombre base que un programa que Git LFS pretende ejecutar (como "git", "cygpath", o "uname") y cualquier extensión de archivo de "PATHEXT" (incluyendo ".bat" y ".cmd"), entonces, en Windows, cuando Git LFS intente ejecutar el programa previsto el archivo "..exe", "..com", etc., será ejecutado en su lugar, pero sólo si el programa deseado no es encontrado en ningún directorio de la lista "PATH". La vulnerabilidad ocurre porque cuando Git LFS detecta que el programa que pretende ejecutar no se presenta en ningún directorio listado en "PATH" entonces Git LFS pasa una cadena vacía como la ruta del archivo ejecutable al paquete Go "os/exec", que contiene un error tal que, en Windows, antepone el nombre del directorio de trabajo actual (es decir, ".") a la cadena vacía sin añadir un separador de ruta, y como resultado busca en ese directorio un archivo con el nombre base "." combinado con cualquier extensión de archivo de "PATHEXT", ejecutando el primero que encuentre. (La razón por la que los archivos "..bat" y "..cmd" no son ejecutados de la misma manera es que, aunque el paquete Go "os/exec" intenta ejecutarlos igual que un archivo "..exe", la familia de funciones "CreateProcess()" de la API de Microsoft Win32 presenta una característica no documentada en la que aparentemente reconocen cuando quien llama está intentando ejecutar un archivo de script por lotes y en su lugar ejecutan el intérprete de comandos "cmd.exe", pasando el conjunto completo de argumentos de la línea de comandos como parámetros. Estos no son modificados con respecto a los argumentos de línea de comandos establecidos por Git LFS, y como tal, el nombre del programa previsto es el primero, resultando en una línea de comandos como "cmd.exe /c git", que entonces falla). Git LFS ha resuelto esta vulnerabilidad informando siempre de un error cuando un programa no es encontrado en ningún directorio listado en "PATH" en lugar de pasar una cadena vacía al paquete Go "os/exec" en este caso. El bug en el paquete Go "os/exec" ha sido reportado al proyecto Go y es esperado que sea parcheado después de la publicación de este aviso de seguridad. El problema fue introducido en versión 2.12.1 y está parcheado en la versión 3.1.3. Los usuarios de las versiones afectadas deben actualizar a la versión 3.1.3. Actualmente no se presentan medidas de mitigación a este problema

*Credits: N/A
CVSS Scores
Attack Vector
Local
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High
Attack Vector
Local
Attack Complexity
Medium
Authentication
None
Confidentiality
Partial
Integrity
Partial
Availability
Partial
* Common Vulnerability Scoring System
SSVC
  • Decision:-
Exploitation
-
Automatable
-
Tech. Impact
-
* Organization's Worst-case Scenario
Timeline
  • 2022-02-10 CVE Reserved
  • 2022-04-19 CVE Published
  • 2023-11-10 EPSS Updated
  • 2024-08-03 CVE Updated
  • ---------- Exploited in Wild
  • ---------- KEV Due Date
  • ---------- First Exploit
CWE
  • CWE-426: Untrusted Search Path
CAPEC
Affected Vendors, Products, and Versions
Vendor Product Version Other Status
Vendor Product Version Other Status <-- --> Vendor Product Version Other Status
Git Large File Storage Project
Search vendor "Git Large File Storage Project"
Git Large File Storage
Search vendor "Git Large File Storage Project" for product "Git Large File Storage"
>= 2.12.1 < 3.1.3
Search vendor "Git Large File Storage Project" for product "Git Large File Storage" and version " >= 2.12.1 < 3.1.3"
-
Affected