Menace de sécurité GHOST

User red
User red

Découvert le 27/01/2015, GHOST est le nom donné à une nouvelle faille de sécurité qui s'applique uniquement aux systèmes d'exploitation utilisant une bibliothèque GLIBC version 2.2 à 2.17.

Autrement, dit, un très grand nombre de distribution Linux et autres produits intégrants le noyau Linux (comme VMWare ESX par exemple).

Par ailleurs, une polémique enfle sur les listes d'administrateurs en sécurité car Google aurait corrigé ce bug il y a un an déjà sans avertir la communauté alors qu'en utilisant les composants de la communauté opensource, toute amélioration doit obligatoirement être partagée avec tout le monde. Un manquement de la part de Google qui a fortement déplu.

L'exploitation de cette faille consiste à détourner le résultat d'un processus de vérification de machine réseau (gethostbyname) commun à des logiciels opensource pour causer un dysfonctionnement voir même prendre le contrôle à distance.

Une nouvelle version de GLIBC-2x incluant un patch pour corriger cette faille existe déjà pour la plupart des grandes distributions.

Il est possible de tester la vulnérabilité d'un système en compilant le fichier suivant :

1/ Créer un fichier GHOST.c source

cat > GHOST.c << EOF
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#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);
}
EOF

2/ Puis compiler ce fichier :

gcc GHOST.c -o GHOST

3/ Puis tester la vulnérabilité :

Exemple sur Fedora 19 (glibc-2.17) :
[Prompt~]$ ./GHOST
vulnerable

Exemple sur Fedora 20 (glibc-2.18) :

[Prompt~]$ ./GHOST
not vulnerable

Source: http://seclists.org/oss-sec/2015/q1/274
Auteur :
Mis en ligne : Mercredi 28 Janvier 2015