// For flags

CVE-2021-43809

Local Code Execution through Argument Injection via dash leading git url parameter in Gemfile

Severity Score

7.3
*CVSS v3.1

Exploit Likelihood

*EPSS

Affected Versions

*CPE

Public Exploits

2
*Multiple Sources

Exploited in Wild

-
*KEV

Decision

-
*SSVC
Descriptions

`Bundler` is a package for managing application dependencies in Ruby. In `bundler` versions before 2.2.33, when working with untrusted and apparently harmless `Gemfile`'s, it is not expected that they lead to execution of external code, unless that's explicit in the ruby code inside the `Gemfile` itself. However, if the `Gemfile` includes `gem` entries that use the `git` option with invalid, but seemingly harmless, values with a leading dash, this can be false. To handle dependencies that come from a Git repository instead of a registry, Bundler uses various commands, such as `git clone`. These commands are being constructed using user input (e.g. the repository URL). When building the commands, Bundler versions before 2.2.33 correctly avoid Command Injection vulnerabilities by passing an array of arguments instead of a command string. However, there is the possibility that a user input starts with a dash (`-`) and is therefore treated as an optional argument instead of a positional one. This can lead to Code Execution because some of the commands have options that can be leveraged to run arbitrary executables. Since this value comes from the `Gemfile` file, it can contain any character, including a leading dash.

To exploit this vulnerability, an attacker has to craft a directory containing a `Gemfile` file that declares a dependency that is located in a Git repository. This dependency has to have a Git URL in the form of `-u./payload`. This URL will be used to construct a Git clone command but will be interpreted as the upload-pack argument. Then this directory needs to be shared with the victim, who then needs to run a command that evaluates the Gemfile, such as `bundle lock`, inside.

This vulnerability can lead to Arbitrary Code Execution, which could potentially lead to the takeover of the system. However, the exploitability is very low, because it requires a lot of user interaction. Bundler 2.2.33 has patched this problem by inserting `--` as an argument before any positional arguments to those Git commands that were affected by this issue. Regardless of whether users can upgrade or not, they should review any untrustred `Gemfile`'s before running any `bundler` commands that may read them, since they can contain arbitrary ruby code.

"Bundler" es un paquete para administrar las dependencias de las aplicaciones en Ruby. En "bundler" versiones anteriores a 2.2.33, cuando se trabaja con "Gemfile" no confiables y aparentemente inofensivos, no se espera que conlleven a una ejecución de código externo, a menos que esté explícito en el código ruby dentro del propio "Gemfile". Sin embargo, si el "Gemfile" incluye entradas "gem" que usan la opción "git" con valores inválidos, pero aparentemente inofensivos, con un guion inicial, esto puede ser falso. Para manejar las dependencias que provienen de un repositorio Git en lugar de un registro, Bundler usa varios comandos, como "git clone". Estos comandos son construidos usando la entrada del usuario (por ejemplo, la URL del repositorio). Cuando son construidos los comandos, las versiones de Bundler anteriores a la 2.2.33, evitan correctamente las vulnerabilidades de inyección de comandos pasando una matriz de argumentos en lugar de una cadena de comandos. Sin embargo, se presenta la posibilidad de que una entrada del usuario comience con un guion ("-") y por lo tanto sea tratada como un argumento opcional en lugar de posicional. Esto puede conllevar a una ejecución de código porque algunos de los comandos presentan opciones que pueden ser aprovechadas para ejecutar ejecutables arbitrarios. Como este valor proviene del archivo "Gemfile", puede contener cualquier carácter, incluyendo un guion inicial. Para explotar esta vulnerabilidad, un atacante tiene que diseñar un directorio que contenga un archivo "Gemfile" que declare una dependencia que sea encontrada en un repositorio Git. Esta dependencia tiene que tener una URL Git en forma de "-u./payload". Esta URL será usada para construir un comando de clonación de Git pero será interpretada como el argumento de upload-pack. Entonces este directorio necesita ser compartido con la víctima, que entonces necesita ejecutar un comando que evalúe el Gemfile, como "bundle lock", dentro. Esta vulnerabilidad puede conllevar a una ejecución de código arbitrario, que potencialmente podría llevar a una toma de control del sistema. Sin embargo, la explotabilidad es muy baja, porque requiere mucha interacción del usuario. Bundler versión 2.2.33 ha parcheado este problema insertando "--" como argumento antes de cualquier argumento posicional a aquellos comandos Git que estaban afectados por este problema. Independientemente de si los usuarios pueden actualizar o no, deberían revisar cualquier "Gemfile" no confiable antes de ejecutar cualquier comando "bundler" que pueda leerlo, ya que puede contener código ruby arbitrario

*Credits: N/A
CVSS Scores
Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High
Attack Vector
Local
Attack Complexity
High
Privileges Required
Low
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High
Attack Vector
Network
Attack Complexity
Medium
Authentication
None
Confidentiality
Complete
Integrity
Complete
Availability
Complete
* Common Vulnerability Scoring System
SSVC
  • Decision:-
Exploitation
-
Automatable
-
Tech. Impact
-
* Organization's Worst-case Scenario
Timeline
  • 2021-11-16 CVE Reserved
  • 2021-12-08 CVE Published
  • 2024-03-01 EPSS Updated
  • 2024-08-04 CVE Updated
  • 2024-08-04 First Exploit
  • ---------- Exploited in Wild
  • ---------- KEV Due Date
CWE
  • CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')
CAPEC
Affected Vendors, Products, and Versions
Vendor Product Version Other Status
Vendor Product Version Other Status <-- --> Vendor Product Version Other Status
Bundler
Search vendor "Bundler"
Bundler
Search vendor "Bundler" for product "Bundler"
< 2.2.33
Search vendor "Bundler" for product "Bundler" and version " < 2.2.33"
ruby
Affected