12 junio 2012

Vulnerabilidad grave en MySQL/MariaDB - CVE-2012-2122

No es el día de los Santos Inocentes, ni de aquí (28 de Diciembre) ni internacional (April's Fool). El sábado 9 de Junio  Sergei Golubchik, coordinador de seguridad de MariaDB publicaba un post en la lista OSS-SEC sobre una grave vulnerabilidad que afectaba a diferentes versiones de MySQL y MariaDB.

Se evidencia la posibilidad de autenticarse como usuario con máximos privilegios (root) únicamente realizando conexiones simultáneas, con CUALQUIER contraseña introducida como parámetro y contra un servidor vulnerable. Al cabo de un número indeterminado de intentos fallidos, el servidor aceptará la conexión y se realizará la autenticación de forma satisfactoria. Sin más. Sin shellcodes raras, sin casuísticas extrañas: únicamente tenemos que tener delante un servidor vulnerable, que cumpla con las siguientes versiones:

  • Son vulnerables todas las versiones de MariaDB y MySQL hasta la 5.1.61, 5.2.11, 5.3.5 y 5.5.22
  • NO SON vulnerables las versiones de MySQL 5.1.63, 5.5.24 y 5.6.6
  • NO SON vulnerables las versiones de MariaDB 5.1.62, 5.2.12, 5.3.6 y 5.5.23
Con la siguiente línea en shell script, teniendo instalada una base de datos vulnerable en el sistema local, y contando con el cliente 'mysql', se podría realizar una autenticación como usuario root sin conocer la contraseña:

for i in `seq 1 1000`; do mysql -u root --password=blablabla -h 127.0.0.1 2>/dev/null; done

Básicamente, se ejecutará la sentencia de autenticación mediante cliente por consola (comando mysql) como usuario root (-u root) y cualquier contraseña (--password=blablabla) contra el servidor vulnerable  presente en el mismo sistema donde se ejecuta este script (-h 127.0.0.1), sin mostrar ningún mensaje de error por pantalla (2>/dev/null).

Vamos a ver el ejemplo real. Las siguientes pruebas se han realizado sobre una Fedora Core 16, con MySQL versión 5.5.21:


En primer lugar, y para este ejemplo, cambiaremos la contraseña original de MySQL para el usuario root, que antes la teníamos establecida a 'password', para que ahora sea 'SuperPassWordDeLaMuerte':


Seguidamente, salimos de la sesión de root, y nos quedamos como usuario sin privilegios, y ejecutamos la secuencia anterior, que realizará conexiones como usuario root y cualquier contraseña, programando un total de 1000 intentos. A continuación se ejecutará la consola de mysql satisfactoriamente:



Comprobamos el usuario con el que estamos autenticados mediante la sentencia select current_user(), obteniendo como resultado 'root@localhost'


Obviamente, este "ataque" ya se encuentra integrado como exploit de Metasploit Framework, permitiendo además el volcado de hashes de todos los usuarios, todo ello con el módulo mysql_authbypass_hashdump:



Enhorabuena desde SecurityByDefault a los descubridores de este bug, verlo para creerlo...De momento, ¡una de las vulnerabilidades descubiertas favoritas para este año 2012!



14 comments :

Anónimo dijo...

En r/netsec/ encontré la explicación de este bug:

The source of the problem was on this line of code, and looked like this:typedef char my_bool;

my_bool
check_scramble(...

return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE);
}
The my_bool return value is typedef'd from a char (range: -128 → 127), but memcmp() returns an int and can return negative and positive values over an undefined range when the two memory regions don't match. This is allowed by the C standard (but most implementations will clamp to -1, 0 and +1). The implicit cast on return means whenever the return value from memcmp mod 128 = 0, you get a false positive.LINK: http://www.reddit.com/r/netsec/comments/uvfg6/security_vulnerability_in_mysqlmariadb/c4z1mm7

Yo dijo...

 Si he entendido bien el reporte de oss-sec hay muchas builds que a pesar de ser de las versiones afectadas no serían vulnerables.

"Whether a particular build of MySQL or MariaDB is vulnerable, depends on
how and where it was built. A prerequisite is a memcmp() that can returnan arbitrary integer (outside of -128..127 range). To my knowledge gccbuiltin memcmp is safe, BSD libc memcmp is safe. Linux glibcsse-optimized memcmp is not safe, but gcc usually uses the inlinedbuiltin version.As far as I know, official vendor MySQL and MariaDB binaries are notvulnerable."

Víctor J. Chamorro dijo...

En ningunas de mis Debian he conseguido hacer funcionar el exploit... y eso que las versiones son la 5.0.51a y la  5.1.61

Juan Pablo Jaramillo Pineda dijo...

 Yo la probé en Debian testing con la versión 5.1.61 precisamente y funciona!!

Pendejo dijo...

Probado en Debian 6 squeeze con mysql 5.1.49 y no ha funcionado, con Wheezy/sid y mysql 5.1.61 tampoco...

Jose Ernesto dijo...

Yo lo he probado en 4 maquinas distinas con las versiones 5.0.32,5.0.51a y 5.1.49 y en ninguna de ellas ha funcionado.Todas estas maquinas corren Debian.

Security By Default dijo...

En el post de rapid7 "
CVE-2012-2122: A Tragically Comedic Security Flaw in MySQ " se especifica mucho más las plataformas vulnerables y no vulnerables, atendiendo sobretodo a sistema operativo.

En caso de que las pruebas las realicéis sobre un sistema que aparezca como vulnerable, intentad varias veces el comando, ya que en una de las pruebas realizadas para este post sobre la Fedora, se tuvo que ejecutar dos veces hasta que salió la consola finalmente.

Saludos,

Babblo dijo...

Probado en distintos servidores con las siguientes versiones:

MySQL 5.1.54: Negativo
Percona-Server-5.5.20-rel24.1: Negativo
Percona-Server-5.5.20-rel24.1: Negativo 
MySQL 5.5.21: Negativo 

Todas compiladas in-house.

No funciona la prueba o el bug está inyectado en las versiones binarias? 

Security By Default dijo...

El bug se encuentra en el fichero sql/password.c, y repetimos, que la vulnerabilidad se da en el producto dependiendo de si se encuentra instalado en uno u otro sistema operativo. Un listado detallado de dónde es vulnerable en este enlace:

https://community.rapid7.com/community/metasploit/blog/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql 

cro dijo...

Seguro que no es el día de los santos inocentes? El fallo de F5 también es muy divertido: http://www.exploit-db.com/exploits/19091/

Francesc dijo...

Confirmado,
en MySQL 5.1.41-3ubuntu12.10 tampoco funciona.

Jonatan Menendez dijo...

Probado en una ubuntu server 10.04.3  y funciono. No puedo poner la versión porque en cuanto vi el fallo actualize.

El Boletaire dijo...

Pues yo tengo la versión 5.5.22 y no hay manera de acceder como root con ese "trapi".

Rick dijo...

3 Distros - 3 configuraciones con las versiones cuestionadas y nada. Casi a un mes no hay rastros de la vulnerabilidad en los releases disponibles.