Une importante faille découverte sur l’authentification de MySQL et MariaDB

Si vous êtes un peu familier de l’informatique, vous devez sûrement connaître le SGBD (Système de Gestion de Bases de Données) MySQL. En effet, c’est l’un des plus utilisés de ceux-ci, aux côtés d’Oracle ou SQL Server. Ceci pour une raison plutôt simple : il est très souvent associé à Apache et PHP pour former une pile {L|W|M|X}AMP (Apache+MySQL+PHP).

Dernièrement racheté par Sun (en 2008) puis par Oracle (indirectement, suite au rachat de Sun par ce dernier en 2009), il a subi un fork par son créateur Michael Widenius, pour créer MariaDB, entièrement libre.

Une faille a été découverte le weekend dernier et permet de réaliser une « authentication bypass« , autrement dit le contournement de l’authentification. Cette technique permet donc d’accéder à un compte sur le serveur MySQL sans connaître le mot de passe associé à un compte utilisateur. On peut donc accéder sans mal au compte root du serveur.

Mais comment fonctionne donc cet exploit ? Il faut pour cela s’intéresser au module d’authentification de MySQL. Celui-ci repose sur une bibliothèque de hashage et de comparaison écrite en C. L’authentification fonctionne de la manière suivante : on calcule un token, qui est un hash SHA du mot de passe entré ainsi que d’une chaîne de caractères aléatoire. Ce token est comparé avec la valeur attendue. Cependant, il peut arriver que la fonction memcmp qui réalise la comparaison des deux tombe sur une collision, c’est à dire qu’elle considère deux mots de passe égaux alors qu’ils sont différents. Cette probabilité serait de 1 sur 256.

Donc, si on connaît un login utilisateur sur la base (typiquement, root), et que l’on essaye de se connecter un grand nombre de fois sur la base MySQL (au moins 300 fois environ) on devrait finir par tomber sur cette faille et obtenir un accès.

Cette faille semble concerner toutes les versions de MySQL et MariaDB depuis les versions 5.1.61, 5.2.11, 5.3.5 et 5.5.22. La faille serait présente sur toutes les Ubuntu 64bits depuis la 10.04 ainsi que MySQL 5.5.23 de Fedora et OpenSUSE12.1 64bits. Cependant, les versions présentes sur les systèmes Debian, Red Hat Enterprise 4, 5, 6 et Gentoo 64 bits, et BSD seraient épargnées.

Pour tester la sécurité de votre serveur (et pas pour tenter d’accéder à un serveur qui ne vous appartient pas!!), vous pouvez tenter ce petit script :

[sourcecode language= »bash »]
$ less getRootAccessMySQL.sh <adresse_IP_serveur>
for i in `seq 1 1000`;
do mysql -u root –password=bad -h $1 2 > /dev/null;
done
[/sourcecode]

Des fixs sont en cours d’écriture par les équipes des différentes distributions et mainteneurs des versions de mySQL et MariaDB encore maintenues, mais en attendant, vous pouvez pour limiter les dégâts n’autoriser la connexion à votre serveur que depuis le localhost.

Pour cela, ouvrez le fichier de configuration du serveur (fichier my.cnf, présent normalement au chemin /etc/mysql/my.cnf). Cherchez la section mysqld, et la valeur du champ bind-adress doit être 127.0.0.1. Ainsi, MySQL n’acceptera que les connexions qui proviennent de cette adresse, soit la machine sur laquelle le serveur est installé.

Relancez ensuite MySQL par un : service mysql restart

Cette faille a été détectée et signalée par Sergei Golubchik, et a depuis été corrigé sur plusieurs distributions (sur Ubuntu ici).

J’espère que vos serveurs sont suffisants protégés, ou qu’ils tiendront jusqu’à la publication du correctif adéquat! ;-)

  • http://twitter.com/nmartin34 Nicolas Martin

    je crois qd même que par défaut les bd mysql ou maria DB ne sont accessibles qu’en localhost.
    Apres tu peux autoriser certaines IP à se connecter avec tel ou tel login.

    • http://www.blog-nouvelles-technologies.fr Yohann Poiron

      J’en connais beaucoup qui change ce paramétrage … moi en premier pour certains besoins !

      • http://twitter.com/nmartin34 Nicolas Martin

        certes, mais tu connais les ip qui devront s’y connecter non ?
        enfin ça n’empêche qu’en effet faille est bééééé-ante :D

  • Thomas Despoix

    Je viens de tester 10k fois sur mon mac avec une version 5.5.10 MySQL Community Server (GPL), et je ne suis pas parvenu à rentrer !