Bash tiene una característica por la cual interpreta algunas variables de entorno como definiciones de funciones. Por ejemplo, con la variable de entorno HTTP_COOKIE
establecida en () { echo hello; }
, bash analiza el valor de la variable como una definición de función, como si el script hubiera comenzado con HTTP_COOKIE () { echo hello; }
. El cuerpo de la función no se ejecuta, a menos que el script llame a HTTP_COOKIE
como un comando: es la función definición que se ejecuta.
La vulnerabilidad de Shellshock se debe a la interpretación de las variables como más que definiciones de funciones. Por ejemplo, si HTTP_COOKIE
se establece en () { echo hello; }; echo pwned
, bash analiza y ejecuta la definición de la función cuando se inicia, y felizmente ejecuta el resto del contenido de la variable, por lo que ejecuta la instrucción echo pwned
.
Con el parche Shellshock, solo se aceptan definiciones de funciones bien formadas. Un valor como () { echo hello; }; echo pwned
se rechaza porque contiene un código final después de la definición de la función.
El script debe escribirse con cuidado y no usar HTTP_COOKIE
(o cualquier variable que tenga contenido que pueda ser elegido por un adversario) como un nombre de comando. Solo los nombres de variables que el script utiliza como comandos pueden llevar a la inyección de código: los nombres de variable que se usan como variables o no se usan en el script no son un problema.
Una variable de entorno definida en un script CGI no tiene influencia alguna en un shell iniciado en un terminal. Las variables de entorno afectan a los procesos y son heredadas por los subprocesos, no saltan de forma mágica a otros procesos que se ejecutan en la misma aplicación.