Ghost fait trembler les systèmes Linux

L’éditeur Qualys a découvert une faille de sécurité dans la plupart des systèmes d’exploitation Linux. Cette dernière permettrait de prendre le contrôle à distance des OS concernés en se passant d’identifiants. A l’heure actuelle un patch a été développé pour la majeure partie des distributions Linux comme Debian, Ubuntu, Red Hat

Ghost : pourquoi et comment

Ghost est le nom d’une faille de sécurité se trouvant dans __nss_hostname_digits_dots() du module glibc. Ce module permet de générer des appels de bas niveau, comme par exemple pour les allocations d’espace mémoire. La faille peut être déclenchée en appelant des fonctions telles que gethostbyname ou gethostbyaddr. D’après Qualys, via un simple email envoyé sur la machine impactée par la faille, un pirate peut en prendre le contrôle.

Les systèmes Linux touchés sont ceux qui ont une version de glibc entre la 2.2 et la version 2.17 publiée le 21 mai 2013 (ou 2.18 selon les systèmes d’exploitation). Pour connaître votre version de glibc, vous pouvez exécuter la commande suivante :

$ ldd --version

Comment vérifier si ma machine est vulnérable à Ghost ?

Pour vérifier si votre système est vulnérable, Cyberciti.biz a mis sur son site un bout de code C permettant de tester la faille :

/* ghosttest.c: GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#include
#include
#include
#include
#include

#define CANARY "in_the_coal_mine"

struct {
char buffer[1024];
char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
struct hostent resbuf;
struct hostent *result;
int herrno;
int retval;

/*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
char name[sizeof(temp.buffer)];
memset(name, '0', len);
name[len] = '\0';

retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

if (strcmp(temp.canary, CANARY) != 0) {
puts("vulnerable");
exit(EXIT_SUCCESS);
}
if (retval == ERANGE) {
puts("not vulnerable");
exit(EXIT_SUCCESS);
}
puts("should not happen");
exit(EXIT_FAILURE);
}

Ce code est à compiler à l’aide de gcc (qu’il vous faudra très certainement installer), puis à exécuter.

$ gcc ghosttest.c -o ghosttest
$ ./ghosttest

L’exécutable vous retournera alors « not vulnerable » ou « vulnerable ».

Comment corriger la faille de sécurité Ghost ?

Il suffit d’appliquer le patch mis à disposition par votre distribution.

Par exemple sur une Debian ou une Ubuntu, tout simplement en exécutant :

$ sudo apt-get update
$ sudo apt-get upgrade

Ou sur une Red Hat ou une Fedora via la commande :

$ sudo yum update

Après avoir mis à jour votre distribution, il faut redémarrer tous les services utilisant le module glibc. Il est donc conseillé de redémarrer la machine en question.

$ sudo reboot

Laisser un commentaire

Votre email ne sera pas publié.