Une nouvelle faille de sécurité importante vient d’être annoncé et concerne la plupart des distributions Linux. Cette faille répond au nom de « Ghost » qui est la contraction de gethostbyname une fonction de libc.


Ghost permet de prendre le contrôle d’un système à distance, sans même connaître ses identifiants administrateur par le simple envoi d’un email. Il est bon de savoir que si vous utilisez une distribution stable avec un support long terme cette faille est risque d’être toujours présente. Ce qui est le cas par exemple des Debian 7 Wheezy, Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7, Ubuntu 12.04. Heureusement cette faille, qui existe depuis la version 2.2 de glibc datant de novembre 2000, a été corrigé le 21 mai 2013 avec la sortie de la version 2.21.

Moins bon tous les systèmes informatiques exploitant une base Linux et une connexion réseau peuvent potentiellement être touchés par Ghost s’ils n’intègrent pas la dernière version de glibc. Donc attendons nous à recevoir une série de firmware corrigeant cette faille pour nos NAS par exemple ….

Tester et corriger la faille de sécurité Ghost

Pour savoir si votre installation d’Ubuntu 12.04 (et certainement 12.10 / 13.04 / 13.10) est concernée par cette faille, deux moyens. La première est une simple commande permettant de connaître la version de glibc :

ldd --version

Vous devriez obtenir ceci en retour :

ldd (Ubuntu EGLIBC 2.15-0ubuntu10.10) 2.15
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper

Vous pouvez également créer le fichier ghost.c :

gedit GHOST.c

Collez-y le code suivant :

#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] = ‘