GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué significa Env X=() { ::}; Command' Bash Do y por qué es inseguro?

Aparentemente hay una vulnerabilidad (CVE-2014-6271) en bash:ataque de inyección de código de variables de entorno especialmente diseñado para Bash

Estoy tratando de averiguar qué está pasando, pero no estoy completamente seguro de entenderlo. ¿Cómo puede el echo ejecutarse tal como está entre comillas simples?

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

EDITAR 1 :Un sistema parcheado se ve así:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

EDITAR 2 :Hay una vulnerabilidad/parche relacionado:CVE-2014-7169 que usa una prueba ligeramente diferente:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

salida sin parche :

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

salida parcheada parcialmente (versión anterior) :

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test

salida parcheada hasta e incluyendo CVE-2014-7169:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

EDITAR 3 :la historia continúa con:

  • CVE-2014-7186
  • CVE-2014-7187
  • CVE-2014-6277

Respuesta aceptada:

bash almacena las definiciones de funciones exportadas como variables de entorno. Las funciones exportadas se ven así:

$ foo() { bar; }
$ export -f foo
$ env | grep -A1 foo
foo=() {  bar
}

Es decir, la variable de entorno foo tiene el contenido literal:

() {  bar
}

Cuando se inicia una nueva instancia de bash, busca estas variables de entorno especialmente diseñadas y las interpreta como definiciones de funciones. Incluso puedes escribir uno tú mismo y ver que todavía funciona:

$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function

Desafortunadamente, el análisis de definiciones de funciones a partir de cadenas (las variables de entorno) puede tener efectos más amplios de lo previsto. En versiones sin parches, también interpreta comandos arbitrarios que ocurren después de la finalización de la definición de la función. Esto se debe a restricciones insuficientes en la determinación de cadenas similares a funciones aceptables en el entorno. Por ejemplo:

$ export foo='() { echo "Inside function" ; }; echo "Executed echo"'
$ bash -c 'foo'
Executed echo
Inside function

Tenga en cuenta que el eco fuera de la definición de la función se ha ejecutado inesperadamente durante el inicio de bash. La definición de la función es solo un paso para que la evaluación y el exploit sucedan, la definición de la función en sí misma y la variable de entorno utilizada son arbitrarios. El shell mira las variables de entorno, ve foo , que parece que cumple con las restricciones que conoce sobre cómo se ve una definición de función, y evalúa la línea, sin querer, también ejecuta el eco (que podría ser cualquier comando, malicioso o no).

Relacionado:Dd:¿archivos de entrada múltiples?

Esto se considera inseguro porque normalmente no se permite ni se espera que las variables, por sí mismas, provoquen directamente la invocación del código arbitrario contenido en ellas. Quizás su programa establece variables de entorno a partir de la entrada de un usuario que no es de confianza. Sería muy inesperado que esas variables de entorno pudieran manipularse de tal manera que el usuario pudiera ejecutar comandos arbitrarios sin su intención explícita de hacerlo usando esa variable de entorno por tal razón declarada en el código.

Aquí hay un ejemplo de un ataque viable. Ejecuta un servidor web que ejecuta un shell vulnerable, en algún lugar, como parte de su vida útil. Este servidor web pasa las variables de entorno a un script bash, por ejemplo, si está utilizando CGI, la información sobre la solicitud HTTP a menudo se incluye como variables de entorno del servidor web. Por ejemplo, HTTP_USER_AGENT podría establecerse en el contenido de su agente de usuario. Esto significa que si falsifica su agente de usuario para que sea algo así como '() {:; }; echo foo’, cuando se ejecuta ese script de shell, echo foo será ejecutado. De nuevo, echo foo podría ser cualquier cosa, maliciosa o no.


Linux
  1. ¿Qué es un servidor web y cómo funciona un servidor web?

  2. ¿Qué hace 'exec {fd}/watchdog' en Bash?

  3. ¿Por qué [a-z] coincide con letras minúsculas en Bash?

  4. ¿Qué significa -s y [[]] en una condición If en Bash?

  5. El Punto De Uniq -u Y Que Hace??

¿Qué es un Makefile y cómo funciona?

¿Qué es un servidor Linux y por qué su negocio necesita uno?

¿Qué es una máquina virtual y por qué usarla?

¿Qué es el comando Grep en Linux? ¿Por qué se usa y cómo funciona?

¿Qué es `S_ISREG()` y qué hace?

Explicación de la manipulación de la función Bash