Parche para corregir shellshock en bash

Es por todos conocido -o, al menos, eso quisiera creer- el bug Shellshock [EN] que afecta las versiones de bash… bueno, básicamente, todas las versiones de bash hasta la 4.3.25.

Ahora, ¿En qué consiste la falla? Pues, que se pueden bypassear variables y ejecutar código arbitrariamente. Es decir, que cualquiera podría inyectar código en tu shell y hacer cosas muy, muy malas.

Un ejemplo del bug corriendo.

root@orchid:/home/manuel# env x='() { :;}; echo ola qe ase' bash -c "echo shellshock o qe ase"
ola qe ase
shellshock o qe ase

Este ejemplo inocente y sencillo constituye una prueba de concepto. Es decir, en ese momento mi versión de bash era vulnerable.

Es innecesario mencionar lo peligroso de este bug, y de las terribles implicaciones de éste. Me atrevería a decir que es más relevante y peligroso que Heartbleed [EN], aquel conocido bug de OpenSSL que hizo correr a más de un sysadmin.

Pues bien… revisando posibles arreglos a la situación, doy con este hilo de superuser [EN] donde proponen una solución. Puedo decir que a mí me funcionó en ElementaryOS (basado en ubuntu 12).

Y, para llevarlo al punto de la ironía, lo haremos con un bash script:

#!/bin/bash
mkdir src
cd src
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget http://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 --prefix=/ && make && make install cd .. cd .. rm -r src

¿Qué hace este script? Descarga la versión 4.3 de bash, aplica parches y actualiza la versión. Nada realmente complicado.

Una vez aplicado el parche, volvemos a intentar ejecutar el código de prueba

root@orchid:/home/manuel# env x='() { :;}; echo ola qe ase' bash -c "echo shellshock o qe ase"
bash: aviso: x: ignoring function definition attempt
bash: error al importar la definición de la función para `x'
shellshock o qe ase

¿Y eso qué quiere decir? Pues, esas dos primeras líneas de la salida significan que no se puede importar una variable. Como lo otro es un simple echo, éste se muestra sin problemas.

Happy patching and hacking.

Usando SSH para actualizar WordPress

En estos días me ha tocado atender un nuevo cliente, la gente de 4lochas.com, un portal de música y variedades que tiene rato hosteado con nosotros, pero que cambió recientemente de administración. Luego de una buena cantidad de setbacks (menores y mayores), pusimos a andar el sitio. Y, si bien es cierto que hay un par de caídas de vez en cuando, el sitio está operativo la mayor parte del tiempo. Esas cosas se van a ir corrigiendo a medida que se van afinando los detalles.

Entre las cosas que me solicitaba, estaban las de actualizar plugins y temas y esas cosas. Obviamente, lo primero que se hace con un cliente nuevo es darle sus credenciales de usuario. Pero, en el caso de mis servidores, hay una configuración estándar de ssh, en la que PasswordAuthentication está desactivado, y sólo puedes loguearte si tu llave pública está añadida en el authorized_keys correspondiente. Por lo que el cliente debe generar llaves ssh para poder añadirlas a su archivos de llaves autorizadas. Desafortunadamente, putty no es particularmente sencillo en su uso de llaves. Al menos, no para mí que sólo lo he usado un par de ocasiones, y nunca desde mis equipos.

En fin, revisando por el internés alguna forma de automatizar el proceso de autenticación vía llaves ssh en wordpress, conseguí este artículo en el que explican paso a paso lo que debe hacerse. La cosa es que está hecho para distribuciones basadas en RedHat.

No voy a ahondar mucho en cómo se instala ssh, cómo creas llaves públicas, cómo accedes a ellas y cómo las llevas al servidor. De esos hay muchísimos artículos por toda la internet que está a un googleo de distancia. Lo que sí voy a decirles es qué necesitan desde ese punto en adelante para tener el wordpress andando en [una distro basada en] debian.

Lo primero, instalar libssh2-php

apt-get install libssh2-php

Luego, añadir esto en su wp-config.php. Les sugiero que las añadan luego de los salt strings.


define('FTP_PUBKEY','/home/tu_usuario/.ssh/id_rsa.pub');
define('FTP_PRIKEY','/home/tu_usuario/.ssh/id_rsa');
define('FTP_USER','tu_usuario');
define('FTP_PASS','hackme');
define('FTP_HOST','127.0.0.1:22');

Donde:
FTP_PUBKEY: Es la llave pública. Usualmente se aloja en ~/.ssh
FTP_PRIVKEY: Es la llave privada. Usualmente se aloja en ~/.ssh
FTP_USER: Obviamente, tu usuario
FTP_PASS: El password.
FTP_HOST: En este caso, 127.0.0.1, porque se supone que estás descargando local en tu servidor. Puedes usar un TLD o incluso un subdominio.

Ya con eso no deberías requerir configurar nada más para actualizar o instalar cualquier cosa en WordPress. De hecho, lo probé actualizando a WP4, añadiendo un nuevo tema e instalando plugins y actualizaciones requeridas sin ningún inconveniente.