Un fallo de autentificación en MySQL

En MySQL o cómo es posible dar por válida una contraseña incorrecta una entrada de esas que nos gustan por aquí donde se muestra como una codificación poco cuidadosa combinada con el uso de los tipos de datos (0 y ‘no 0’, u otros valores) nos llevan a un problema de seguridad.

De la documentación en sql/password.c:
RETURN VALUE
0 password is correct
!0 password is invalid

El problema es que “memcmp” no va a devolver ‘0’ o no ‘0’, sino un valor entero (int). Dicho entero es convertido al valor que retorna “check_scramble” que es del tipo “my_bool”

La solución en este caso pasa por asegurarse de que, efectivamente, se
devuelve el valor esperado:

return test(memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE));

La diferencia es la aplicación de “test” sobre el resultado devuelto por “memcmp”. Dicha macro está definida en include/my_global.h:

#define test(a) ((a) ? 1 : 0)

En Security vulnerability in MySQL/MariaDB sql/password.c está el aviso del fallo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s