Bash: solucionar vulnerabilidad CVE-2014-6271 y CVE-2014-7169

Como todos ya sabréis, hace un par de días se publicó una vulnerabilidad en la shell BASH (CVE-2014-6271). El problema tiene origen en el modo que Bash evalúa las variables de entorno. El resultado es que el atacante puede usar esta vulnerabilidad para saltarse las restricciones del entorno y ejecutar comandos de shell desde bash de forma indiscriminada. Además, poco después apareció una nueva vulnerabilidad relacionada: CVE-2014-7169, conocida como «Shellshock«.

El mayor problema de esto es que ciertos servicios y aplicaciones conceden acceso a estas variables de entorno y por consiguiente permiten explotar la vulnerabilidad desde dichas aplicaciones y servicios. Vamos, que no es necesario disponer de acceso directo a la línea de comandos, terminal o SSH para explotar la vulnerabilidad.

Así pues, es crítico actualizar la versión de bash lo antes posible por la que contenga el parche que solucione el bug lo antes posible. Es tan sencillo como ejecutar los siguientes updates a través de yum o apt según el sistema:

Solucionar CVE-2014-6271 y CVE-2014-7169 en Debian y Ubuntu

$ sudo apt-get update
$ sudo apt-get --only-upgrade install bash

Solucionar CVE-2014-6271 y CVE-2014-7169 en CentOS, RHEL, Fedora, Scientific Linux

# yum update bash

Cómo verificar que la vulnerabilidad CVE-2014-6271 ha sido corregida

Para verificar que ya no somos vulnerables a ataques y que las vulnerabilidades CVE-2014-6271 ha sido solucionada, ejecutamos el siguiente comando desde la shell bash:

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

Si el resultado de la ejecución del comando muestra únicamente una línea que dice «vulnerable», la vulnerabilidad sigue latente en nuestra versión de bash.

Dependiendo de la versión, aparecerán varios warning. El siguiente ejemplo muestra un sistema vulnerable a CVE-2014-6271:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
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

Un sistema parcheado, pero sólo de la primera vulnerabilidad CVE-2014-6271 mostrará el siguiente output:

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

Cómo verificar que la vulnerabilidad CVE-2014-7169 ha sido corregida

 

Para verificar si el sistema es vulnerable al segundo bug (CVE-2014-7169):

$ cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo
bash: x: line 1: syntax error near unexpected token `='
bash: x: line 1: `'
bash: error importing function definition for `x'
Fri Sep 26 11:49:58 GMT 2014

Si el sistema sigue siendo vulneerable, la fecha y hora del sistema aparecerá en la salida del comando y un archivo llamado «/tmp/echo» será creado.

En cambio, si el sistema no es vulnerable el archivo /tmp/echo no se creará y no se ejecutará el comando date:

$ cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo
bash: x: line 1: syntax error near unexpected token `='
bash: x: line 1: `'
bash: error importing function definition for `x'
date
cat: /tmp/echo: No such file or directory