¿Cuál es la vulnerabilidad de bash de CVE-2014-6271 (Shellshock) y cómo lo soluciono?

140

Recientemente, ha habido noticias sobre "CVE-2014-6271" (Ver USN-2362- 1 ), que es una vulnerabilidad en Bash. ¿Cómo puedo saber si me afecta esto, cómo puedo solucionarlo y por qué debería importarme?

Esto está diseñado como una respuesta canónica para esta vulnerabilidad, debido a su alcance y gravedad.

    
pregunta hexafraction 24.09.2014 - 21:48

5 respuestas

127

¿Qué es Bash?

Bash es el shell interactivo predeterminado en Ubuntu. Cuando está interactuando con el terminal (ya sea a través del emulador de terminal, sobre un tty o ssh), generalmente está escribiendo comandos que bash leerá y ejecutará. Incluso si no usa el terminal en absoluto, todavía tiene Bash.

En Ubuntu, /bin/sh no es bash (es guión). Solo bash se ve afectado por esta vulnerabilidad.

¿Cómo me afecta el exploit?

Bash y el sistema operativo realizan un seguimiento de un conjunto de variables de entorno que describen el usuario que ha iniciado sesión actualmente, dónde buscar programas en el disco duro y otras funciones similares. Al diseñar una variable de entorno con una estructura específica, un atacante podría ejecutar código la próxima vez que comience Bash.

El atacante puede configurar esa variable de entorno de varias formas:

  • Conecta de forma remota a un servicio como SSH con una configuración específica, como git over ssh. Como advierte Mitre, el uso de la opción sshd ForceCommand es un vector de ataque. Las cuentas cuyo shell no es bash no se ven afectadas.
  • Te engaña para que establezcas la variable de entorno.
  • Hacer que otro programa establezca una variable de entorno para tener ese valor creado. Por ejemplo, puede tener un servidor web y un script que necesiten establecer una variable de entorno con contenido de usuario específico. Incluso si ese script crea el suyo propio y no toca otras variables de entorno, es suficiente. Una variable de entorno única con cualquier nombre y un valor elaborado es suficiente para que el exploit tenga éxito .
  • Otras formas que no he mencionado aquí.

Una vez que establecen esta variable, la próxima vez que se abra bash para cualquier razón, se ejecutará el código de su atacante. Esto es especialmente temible con sudo -s , ya que genera bash como superusuario (una regla de usuario administrativo que tiene un control completo sobre los datos y programas de su computadora). Incluso si solo inicia bash como usuario estándar, los archivos de ese usuario se pueden eliminar.

Es importante tener en cuenta que incluso si no usa bash usted mismo, muchos programas generarán bash por sí mismos como parte de su operación. Incluso en este caso, eres vulnerable. Sin embargo, el /bin/sh de Ubuntu no es bash, por lo que solo se ven afectados los programas que invocan explícitamente bash y no el shell de scripting predeterminado.

Según Mitre:

  

vectores que involucran la función ForceCommand en OpenSSH sshd, los módulos mod_cgi y mod_cgid en el Servidor Apache HTTP, scripts ejecutados por clientes DHCP no especificados y otras situaciones en las que se establece el entorno a través de un límite de privilegio desde la ejecución de Bash.

¿Soy vulnerable?

Use dpkg para verificar la versión de su paquete instalado:

dpkg -s bash | grep Version

Esto buscará información en su paquete bash y filtrará el resultado para mostrarle solo la versión. Las versiones corregidas son 4.3-7ubuntu1.4 , 4.2-2ubuntu2.5 y 4.1-2ubuntu3.4 .

Por ejemplo, veo:

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

y puede determinar que no soy vulnerable.

¿Cómo actualizo?

El administrador de actualizaciones estándar le ofrecerá esta actualización. Este es un excelente ejemplo de cómo las actualizaciones de seguridad son importantes, independientemente del sistema operativo que utilice o de qué tan bien mantenido esté.

El Boletín de USN indica que se han lanzado nuevas versiones para Ubuntu 14.04 Trusty Tahr, 12.04 Precise Pangolin, y 10.04 Lucid Lynx. Si no está en una de estas versiones de LTS, pero tiene una versión razonablemente reciente, lo más probable es que pueda encontrar un paquete parcheado.

Primero, comprueba si

Si es vulnerable, primero debe obtener las listas de paquetes más recientes:

sudo apt-get update && sudo apt-get install bash

El primer comando se asegura de que tenga la lista de paquetes más nueva que incluye la versión fija, y el segundo comando instala la versión más nueva (fija) de bash.

Mientras que el error solo parece entrar en juego cuando se genera bash, sigue siendo una buena idea reiniciar de inmediato si es factible.

    
respondido por el hexafraction 24.09.2014 - 21:48
27

Robó esto de cft en Hacker News . Si tiene problemas con sus repos como yo (Odroid-XU), entonces esto debería funcionar bien si desea parchear / compilar desde el origen.

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
sudo make install
cd ../..
rm -r $TMPDIR

Luego ejecuta:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Y si obtiene:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'x'
this is a test

¡Entonces estás bien!

ADVERTENCIA: make install instalará bash en /usr/local/bin , por lo que /bin/bash no se modifica y se puede invocar desde curl !!

    
respondido por el Bobby Saget 25.09.2014 - 02:30
9

Nota: El parche de seguridad para CVE-2014-7169 se ha publicado como una actualización de seguridad estándar. No es necesario agregar ppa adicionales para recibir este parche. Solo se necesita lo siguiente.

sudo apt-get update

sudo apt-get upgrade

Para asegurarse de que ha parcheado bash correctamente, ejecute el siguiente comando

dpkg -s bash | grep Version

Si tiene 14.04 LTS, debería ver una salida de:

Version: 4.3-7ubuntu1.4

Si tiene 12.04 LTS, su salida debería ser:

 Version: 4.2-2ubuntu2.5
    
respondido por el branch.lizard 25.09.2014 - 18:30
1

Si está en 11.04: use los pasos siguientes (me funcionó)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

si no se descarga requiere el parche, entonces instale el paquete ftp

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

Para ver si se aplicó el parche:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    
respondido por el ldrrp 25.09.2014 - 17:13
0

Estoy usando Natty 11.04, que es EOL (y he actualizado /etc/apt/sources.list para usar old-releases.ubuntu.com), así que tengo que compilar desde el código fuente. Quería construir un .deb, por lo que al menos la administración del paquete es "consciente" de que la versión de bash no es la predeterminada. No tengo el 100% de éxito, sin embargo, el paquete está registrado como "más nuevo" y el binario bash termina fijo, así que esto es lo que hice:

apt-get source bash
wget https://gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

Ahora, en el (sub) directorio bash-4.2/ , hay: un archivo bash-4.2.tar.xz , que debe desempaquetarse para llegar al origen bash ; y un subdirectorio llamado debian .

Hice los siguientes cambios para evitar dependencias en texlive : en bash-4.2/debian/control :

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

... y en bash-4.2/debian/rules :

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

Para cambiar la versión, en este directorio bash-4.2/ , hazlo:

bash-4.2$ dch --local patchCVE

... y complete las notas en el registro de cambios cuando se le pregunte. Esto asegurará que el .deb (y los metadatos relacionados) se llame (en mi caso) bash_4.2-0ubuntu3patchCVE1_i386.deb .

Luego puedes intentar construir con el comando dpkg-buildpackage -us -uc o debuild . Nota: cualquiera de estos volverá a desempaquetar el origen desde el zip, anulando así cualquier parche que haya tenido. Aún así, ejecute uno de estos una vez para que la fuente se desempaquete y construya (note debuild puede fallar al final debido a texlive, pero debería desempaquetar y compilar la fuente).

Luego, aplique los parches; tenga en cuenta que debe usar -p1 aquí, porque actualmente se encuentra en el directorio bash-4.2/ :

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

Luego, reconstruya la versión parchada ejecutando:

bash-4.2$ fakeroot debian/rules build 

Esto reconstruiría el ejecutable; para probarlo:

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

Para compilar los archivos .deb, ejecute:

bash-4.2$ fakeroot debian/rules binary

Esto guardará los archivos .deb en el directorio principal; para listar sus contenidos:

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

Para instalar .deb:

bash-4.2$ sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

Sin embargo, por alguna razón, este .deb contiene un binario sin parche (?!), así que tuve que hacer adicionalmente:

bash-4.2$ sudo cp bash-4.2/build-bash/bash /bin/

... y después de eso, la prueba comenzó a pasar correctamente para mí:

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for 'VAR'
Bash Test
    
respondido por el sdaau 28.09.2014 - 10:16

Lea otras preguntas en las etiquetas