Si alguna vez habéis trabajado con OS X o Linux, seguro que conocéis _bash_. Es la terminal por defecto de estos sistemas, donde ponemos los comandos que queremos ejecutar. Es el espacio de trabajo, el equivalente al escritorio cuando usamos el ratón.
Como podréis imaginar, _bash_ es omnipresente y no lo usamos sólo los usuarios sino también muchos programas para ejecutar algunos comandos. Por ejemplo, hay páginas web que internamente llaman a _bash_ para generar algunas páginas (CGI), servidores (y ordenadores) que usan DHCP para obtener sus direcciones IP al conectarse a Internet, y muchas más cosas. Imaginaos qué divertido sería que hubiese un fallo en _bash_. O mejor aún, no os lo imaginéis: está pasando. De hecho, hasta tiene nombre y todo: Shellshock.
El problema: ejecutando código cuando no toca
Para funcionar, los programas necesitan datos. Supongamos un servidor de Internet que llama a un _script_ de _bash_ para generar una página web. Este _script_ necesitará datos, como las _cookies_, la ruta de la página que se pide o la cadena que identifica al navegador (_user-agent_). La forma de pasar estos datos a _bash_ son las llamadas variables de entorno.
La analogía sería que tu ordenador es una habitación. Tú, el servidor, recibes una petición de un usuario y escribes algunos datos sobre esa petición en una pizarra. Luego llamas a _bash_ para que pase a la habitación y haga lo que tiene que hacer. Y una de las primeras cosas que hará será leer de la pizarra los datos que le has dejado (las variables de entorno).
Normalmente, esto funciona bien. La _shell_ (_bash_) llega, lee los datos, ejecuta sólo lo que tiene que ejecutar y listos. El problema es que a veces, con una cadena especialmente preparada, no sólo lee los datos sino que los ejecuta. Más concretamente, _bash_ ejecuta los comandos que encuentre después de la definición de una función en una variable de entorno. Algo como esto
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
debería definir una función llamada _x_ que no hace nada (el cuerpo de la función es lo que está entre llaves {}). La cuestión es que después _bash_ sigue leyendo y ya no sólo se limita a leer valores sino a ejecutar el código que viene, en este caso _echo vulnerable_, que imprime "vulnerable" por pantalla.
¿Cómo se puede explotar el fallo?

Bien, ya sabemos cuál es el fallo. Ahora bien, ¿para qué sirve? ¿Cómo se puede alguien aprovechar de ello?
Decíamos al principio que _bash_ está presente en prácticamente todos los ordenadores, y muchos lo tienen expuesto de alguna forma u otra. El ejemplo más llamativo es el de los servidores que generan páginas con _bash_. En esos casos, simplemente con crear una petición en la que el identificador de navegador (_user agent_) sea algo como _() { :; }; micomandoaquí_, podríamos ejecutar comandos arbitrarios en esos servidores. Y con comandos arbitrarios quiero decir que se puede usar la vulnerabilidad para cualquier cosa, desde tumbar todos los servidores vulnerables en un momento hasta montar una enorme _botnet_, pasando por supuesto por montar ataques de denegación de servicio haciendo que todos los vulnerables envíen tráfico a un cierto objetivo.
El fallo puede permitir a atacantes tomar fácilmente el control de servidores web que usen CGI
Ese es el principal punto de explotación del fallo, y es grave porque es muy fácil de aprovechar. Para que os hagáis una idea, en apenas unas horas y con una búsqueda automatizada muy ingenua, en Errata Sec han encontrado más de 3000 servidores vulnerables. Perfeccionando un poco esa búsqueda y con más capacidad de escaneo, un atacante se podría hacer con muchos sistemas. De hecho, esos ataques ya están en marcha.
Pero no son sólo esos servidores que ejecutan scripts de _bash_. En Redhat explican que DHCP (el protocolo para que un ordenador obtenga su dirección IP y más instrucciones para conectarse a Internet cuando entra en una red) podría ser otro punto de ataque, ya que permite que el servidor pase variables de entorno que serían interpretadas por el cliente.
En ese caso, sería posible que un servidor de DHCP vulnerable pudiese atacar además a todos los dispositivos que se conecten a su red. Imaginaos qué desastre en grandes empresas.
También es posible que otros servicios, como servidores que ofrecen _shells_ restringidas a sus usuarios (algunos servidores de Git, por ejemplo), puedan ser vulnerables: este fallo permitiría a un atacante saltarse esas restricciones y obtener acceso completo. Además, teniendo en cuenta que _bash_ está presente por todas partes y que muchos programas lo usan incluso sin darse cuenta, podríamos ver todavía más vectores de ataque.
¿Soy vulnerable? ¿Cómo puedo protegerme?

Empecemos diciendo que si no gestionas ningún servidor expuesto a Internet no deberías preocuparte, probablemente. Los sistemas afectados son los que tienen _bash_, así que estamos hablando de sistemas Linux, OS X y demás derivados UNIX (BSD, Solaris...).
El parche final todavía no está listo
La mayoría de distribuciones Linux ya han distribuido un primer parche, aunque está incompleto y no acaba de corregir del todo la vulnerabilidad. Imaginamos que en cuanto los desarrolladores de _bash_ saquen el parche definitivo lo distribuirán a todos los usuarios. Mientras, una opción puede ser desactivar _bash_ y usar otra _shell_ hasta que esté cien por cien parcheado (nota: hacedlo sólo si sabéis lo que estáis haciendo).
Los que están un poco más expuestos son los usuarios de Apple. Los de Cupertino, con su rapidez habitual en temas de seguridad, todavía no han dado ninguna respuesta. Por suerte, estos ordenadores suelen estar menos abiertos a Internet, y en última instancia ya hay instrucciones para parchear su instalación.
Si queréis comprobar si vuestro sistema está afectado, podéis ejecutar estos dos comandos (el primero para el fallo original, el segundo para el parche incompleto). En el primer caso, si imprime "vulnerable", todavía no estáis parcheados. El segundo test creará un archivo llamado "echo" si no estáis parcheados.
env x='() { :;}; echo vulnerable' bash -c "echo Fallo 1 parcheado"
env X='() { (a)=>\' sh -c "echo date"; cat echo
Más información | CVE 2014-6271 - CVE 2014-7169 (vulnerabilidad 2) | Lcamtuf
Ver 66 comentarios
66 comentarios
superbuker
En Arch Linux ya está parcheado:
[buker@renaissance-ii ~]$ env x='() { :;}; echo vulnerable' bash -c "echo Fallo 1 parcheado"
bash: aviso: x: ignoring function definition attempt
bash: error al importar la definición de la función para `x'
Fallo 1 parcheado
[buker@renaissance-ii ~]$ env X='() { (a)=>\' sh -c "echo vulnerable"; bash -c "echo Fallo 2 parcheado"
sh: X: línea 1: error sintáctico cerca del elemento inesperado `='
sh: X: línea 1: `'
sh: error al importar la definición de la función para `X'
sh: vulnerable: no se encontró la orden
Fallo 2 parcheado
espabilao
Precisamente por ser Linux el fallo, es noticia, si fuese Windows...... Lo normal.
dacotinho
Lo cual viene a demostrar una vez mas que no hay sistema operativo perfecto
snapux
>>En linux se soluciona en segundos a veces ni os dais cuenta de la cantidad de vulnerabilidades porque lo bueno que tiene el código abierto es que somos muchos los que trabajamos en él. Los oportunistas enseguida quieren sacarle el cuero a sistemas de código abierto ofreciendo noticias de este tipo con gran asombro o peor aun al lastre que llevamos encima con "Mac OsX"... y sus "super maquinas" que enseguida pican nuestros códigos para solventar sus problemas y ellos tan felices y todo parece perfecto. Los de windows ni hablemos es otro cantar. Esto va para todos los i-zombies
atoi
Que bash siga leyendo y ejecute lo que sigue después de la definición de una variable de entorno es perfectamente normal, y deseable. De hecho todas las shells unix lo hacen. Lo que no es normal es que el snippet de código sobrante sea ejecutado por el nuevo proceso shell cuando este lee las variables de entorno. Bien no debería ser parte del nuevo entorno, o bien ser ignorado por la nueva instancia de bash.
Por otro lado, debo decir que me parece exagerado pensar que este fallo es un problema para todo internet. Dado que por el momento sólo se demostró que afecta a servidores CGI, incluso si un atacante se armara una botnets con todos los equipos vulnerables, no sería la gran noticia pues esos servers suelen ser pequeños.
mikone117
Una pregunta, ¿como se pone así el prompt?
Un saludo
martin.scun
El título es un poco amarillista. Pero va a tono con lo que este redactor publica. Sólo hay que ver como en sus artículos golpea a Linux y Mac, y se deshace en elogios con Windows.
Usuario desactivado
pese a que efectivamente parece un fallo grave es bastante raro encontrar sistemas que metan datos del usuario en variables de entorno así a pelo, sin ningún tipo de control. incluso suponiendo que bash fuese 100% seguro meter un user agent como variable de entorno sin siquiera validarlo mínimamente me parece una temeridad, así de entrada...
Cheli Pineda Ferrer
No entiendo porque todos decías que en Gnu / Linux el error está solucionado y en Mac no, entiendo que si se ha solucionado el error en bash estará para todos los Unix donde se utilice, otra cosa es que una distro u otra o un Unix cualquiera haya corrido más en aplicarlo y distribuirlo. Creo que es mejor esperar a ver cuanto tardan el resto de Unix libres y comerciales en aplicar y distribuir la corrección para poder comentar.
Un saludo.
jcarlesvilaseca
O me pierdo algo o no lo entiendo. Esta "vulnerabilidad" es muy parecida a la inyección de código en SQL, y la solución no es modificar el motor SQL (MySQL, o lo que sea) sino revisar qué usas para montar la sentencia SQL. Con bash veo lo mismo, deberías parsear lo que estás componiendo para ser usado en una sentencia bash, digo yo ¿no? El problema es del programador, no del propio bash. Todo esto si la documentación indica que eso es así, claro.
juliens
Los de ubuntu han lanzando el parche para la primera vulnerabilidad, espero que pronto salga el parche para la segunda vulnerabilidad.
Saludos y gracias por la noticia
eudesjaviercontreras
Hola, para el segundo comando dice:
vulnerable
Fallo 2 sin parchear
Uso Linux Mint (Ubuntu) con KDE, si en Kuser cambio el interprete de ordenes de /bin/bash a /bin/dash (el de Debian) ¿eso podría causarme problemas en cuestiones como el uso de la paquetería? ¿seguiría siendo vulnerable mi SO? ¿cuál es más recomendable dash o directamente sh?
eudesjaviercontreras
Faltó agregar: ¿cómo agrego el parche manualmente?
exit0
Your second test is wrong. It test nothing! Please take an "official" one.
This prohibits spreading unnecessary FUD ;-)
mamigove
Buenas, eso viene sucediendo desde la prehistoria de los tiempos, pero no es ningún problema sin elevación de usuario, y como comprenderán este comando que se ejecuta en la shell esta a nivel del usuario que tiene acceso, por tanto debería ser un usuario web, con lo cual no pasa nada importante. Ahora si logran elevar el usuario a root, cosa que con este problema unicamente, no es posible si no tienes otra puerta abierta, (como por ejemplo ejecutar como root los scripts de la shell y por tanto te lo tienes merecido) si logran elevar a root entonces estas perdido exista o no el problema, cosa que por mi parte vengo usando desde hace mucho tiempo, recuerdo como hace muchos años un hacker se me coló, se elevo a root (en mi viejo Suse) y me ejecuto una bomba lógica en bash (algo similar a lo que se comenta) que me consumió todo el espacio de disco, se ve que estaba aburrido.