¿Por qué “() {:;};”?

2

Quería entender por qué el siguiente código sirve como prueba de concepto para decirme si mi servidor es vulnerable o no. Además, ¿cómo funciona la vulnerabilidad en un nivel inferior?

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' 

Entonces, cuando ejecuto el siguiente comando

bash -c "echo test"

Puedo obtener cualquiera de los dos (lo que significa que soy vulnerable):

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

o (lo que significa que no soy vulnerable):

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'BASH_FUNC_x'
test
    
pregunta James 02.10.2014 - 14:09
fuente

1 respuesta

2

En primer lugar, el comando que ejecute sería:

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

Todo se reduce a la forma en que funciona la vulnerabilidad. Cuando bash exporta funciones, lo hace a través del entorno, con una función x almacenada en la variable x o (después del último parche) BASH_FUNC_x.

el código de bash luego detecta que el valor comienza con '() {' y se ejecuta:

x () { :;}; echo vulnerable

(que es la entrada del entorno con = reemplazado con un espacio) que es una definición de función con: en el cuerpo (un comando de no hacer nada). En una base vulnerable de CVE-2014-6271, ejecutaría la definición de la función (hasta el } ) y luego continuaría ejecutando el resto del código (el parche inicial hizo que no ejecutara el resto del código) .

    
respondido por el Ángel 02.10.2014 - 14:26
fuente

Lea otras preguntas en las etiquetas