Utilisateur:YoannMoi/Brouillon

Une page de Wikipédia, l'encyclopédie libre.

Ghost est une faille de sécurité basée sur un dépassement de mémoire tampon causé par les fonctions « gethostbyname » , « gethostbyname2 », « gethostbyaddr » des librairies glibC 2.2 et celles antérieures à la version 2.18 de Linux. Cette faille permet à un attaquant d’exécuter, en fonction du contexte, du code arbitraire et ainsi de prendre le contrôle du système. Elle concerne à la fois les serveurs, les routeurs ou encore les NAS utilisant Linux.

Historique[modifier | modifier le code]

La première apparition de ce type de faille dans glibc remonte à 2000 et avait été corrigée le 21 mai 2013, entre les versions 2.17 et 2.18 de glibc[1][2]. Toutefois, le risque pour la sécurité des systèmes ayant été sous-évalué, l’essentiel des distributions Linux stables bénéficiant d'un support n’ont pas aussitôt appliqué de correction à leur librairie. La raison avancée par les éditeurs est celle d’un problème de compatibilité[1].

Ghost a été découvert par la société Qualys, fournisseur d’information de sécurité, en octobre 2014. Avant de divulguer la faille officiellement le 18 janvier 2015, Qualys a signalé le problème aux éditeurs de distributions Linux, qui ont rapidement mis au point des correctifs. Des mises à jour sont notamment disponibles pour Debian, Ubuntu et Red Hat[3]. Compte tenu du nombre d’applications basées sur glibc, Ghost est depuis le 27 janvier 2015 considéré comme une vulnérabilité sévère qui doit être corrigée immédiatement. La vulnérabilité Ghost est aujourd’hui classifiée par la NCAS[note 1] américaine à la valeur 10, c’est-à-dire au niveau haut, et porte la référence CVE-2015-0235[4].

Sévérité CVSS (version 2.0)

Score: 10.0
Score d'impact: 10.0
Score d'exploitabilité: 10.0

Metriques CVSS

Vecteur d'accès: Exploitable par le réseau
Complexité: Basse
Authentification: Non requis pour exploiter
Type d'impact: Permet la divulgation non autorisée d'informations; Permet une modification non autorisée; Permet l'interruption de service

Principe[modifier | modifier le code]

Ghost exploite une faille logée dans la libraire GNU/Linux nommée glibC. Cette dernière, intégrée dans toutes les distributions de Linux, permet de gérer les appels système de bas niveau, tel l’allocation d’espace mémoire, l’ouverture des fichiers, etc... La vulnérabilité est basée sur un dépassement de mémoire tampon dans les fonctions « gethostbyname » ou « gethostbyaddr » impliquées dans le mécanisme de résolution de nom DNS. Ces fonctions sont appelées par les applications Linux pour gérer les connections Internet, à l’image des serveurs de messagerie par exemple.

La fonction « gethostbyname() » renvoie une structure de type host pour l'hôte « name ». La chaîne « name » est soit un nom d'hôte, soit une adresse IPv4 en notation pointée standard, soit une adresse IPv6 avec la notation points-virgules et points[5]. La fonction gethostbyaddr() renvoie une structure du type host pour l'hôte d'adresse « addr ». Les types d'adresse valides sont IPv4 ou IPv6[5]. Pour revenir à la clé de voute de l’exploit Ghost, l’objectif du dépassement de tampon est la mise en echec d'un programme en écrivant, dans la zone mémoire temporaire utilisée, plus de données qu’elle ne peut en contenir, afin d’écraser le code applicatif et de lui substituer du code malveillant.

Dans les faits
Schéma explicatif du depassement de tampon

Lors de l’appel de la fonction, le programme empile le pointeur d’instruction (@EIP[note 2]) dans la pile. Ceci afin d’avoir l’adresse de retour après l’exécution de la fonction et ainsi enchainer vers l’instruction suivante. Par ailleurs, l’appel de la fonction va généralement créer sa propre pile dans la pile pour simplifier sa gestion d’adressage. Elle va alors empiler l’adresse absolue de la base de la pile (@EBP[note 3]) et affecter la valeur du pointeur de la pile (@ESP[note 4]) à celle de la base(@EBP[note 3] pour la fonction). Ainsi, au dépilement après l’exécution de la fonction, l’adresse absolue de la base sera réaffectée et la pile réinitialisée.

Il faut savoir toutefois que l’allocation de la mémoire temporaire se décompose en deux parties :

  • Le tas[note 5] qui correspond à la zone mémoire réservée temporairement pour le code, et les variables globales. Le tas se situe dans la partie d’adressage basse.
  • La pile[note 6] qui correspond à la zone mémoire réservée dans les cadres d’appel à des fonctions (ou procédures), et les variables d’environnement. La pile se situe dans la partie d’adressage haute.

La grande différence entre ces deux zones est le sens d’empilement : il est croissant pour le tas, et décroissant pour la pile. Pour la pile, la première adresse empilée possède la valeur la plus grande, et la dernière adresse empilée possède la valeur la plus faible. Comme le sens de lecture de la mémoire reste dans le sens croissant, un dépassement de tampon dans la pile permet alors l’écrasement des registres contenant EBP et EIP. Par ce principe, un pirate peut remplacer la valeur d’EIP par une adresse pointant vers du code malveillant logé dans la zone tampon utilisée. Néanmoins, cela demande au pirate de connaitre l’adresse exacte de la pile pour assurer le saut d’adresse utilise à l’exécution de son code arbitraire.

Il est à noter que la technique d'exploitation de la faille n'est pour le moment pas clairement définie, et elle est spécifique à chacun des services exposés sur un réseau (SSH, MySQL, Apache...).

Impact[modifier | modifier le code]

Pour le mois de février 2015[6], les logiciels identifiés vulnérables sont :

  • Clockdiff,
  • Procmail (au travers des fonctionnalités comsat/biff),
  • Point-to-Point Protocol daemon (en),
  • Exim (lorsque les options « helo_verify_hosts » et « helo_try_verify_hosts » sont activées, ce qui n'est pas le cas par défaut),
  • L’interpréteur PHP.

A noter aussi que les sites qui utilisent Wordpress (système de gestion de contenu CMS) pourraient être vulnérables avec la page « xmlrpc.php » par défaut qui utilise la fonctionnalité de notification « pingback ».

Pour vérifier si son système est concerné par la vulnérabilité Ghost, il est d’abord nécessaire de connaitre sa version de glibc grâce à la commande suivante : ldd –version

Qualys propose un outillage pour tester son système rapidement[7]. A ce titre, les distribution suivantes sont identifiées comme vulnérables :

OS Distributions Versions
Linux Red Hat Enterprise 5.x, 6.x et 7.x
Linux CentOS 5.x, 6.x & 7.x
Linux Ubuntu 10.04, 12.04 LTS
Linux Debian 7.x
Linux Fedora 19 et ultérieurs
Linux SUSE 11 et ultérieurs
Linux Arch Linux avec Gblic inférieure ou égale à 2.18-1
Linux Mint 13.0

POC[modifier | modifier le code]

Plusieurs preuves de concept sont publiées :

  • Pour PHP, la commande suivante permet de vérifier si la vulnérabilité existe en rapportant un message d’erreur

php -r '$e="0";for($i=0;$i<2500;$i++){$e="0$e";gethostbyname($e); }'

  • Pour Wordpress, la méthode « pingback » est à désactiver car elle emploie « gethostbyname »[8].

Exploit[modifier | modifier le code]

A la date de publication de cet article, seul l’exploit fourni par Qualys est disponible au public, mais il ne provoque seulement qu’un déni de service[9]. En effet, aucun code d'exploitation n'est encore proposé pour prendre le contrôle d'un système à distance. Qualys a annoncé disposer d'un outil permettant de prendre le contrôle d'un serveur Exim à distance. Cependant, ce code ne sera publié que lorsque Qualys estimera que la majorité des systèmes exposés sur Internet seront corrigés[1].

Palliatifs[modifier | modifier le code]

Tous les éditeurs Linux ont publié un correctif :

Les constructeurs de matériels comme les NAS[note 7] ou les routeurs utilisant une version de Linux impactées publient progressivement des patchs[10][11].

Il est important de noter que les fonctions « gethostbyname() » et « gethostbyaddr() » sont obsolètes. Les applications devraient plutôt utiliser les fonctions « getaddrinfo() » et « getnameinfo() » à la place et ainsi éviter la vulnérabilité. Le conseil majeur pour se prémunir de Ghost est d’appliquer le plus rapidement possible les patchs fournis par les éditeurs. Une autre possibilité est de protéger l'OS contre les débordements de tampon, par exemple à l’aide de l’ensemble de patch Grsecurity pour Linux.

Notes et références[modifier | modifier le code]

Notes[modifier | modifier le code]

  1. NCAS pour National Cyber Awareness System qui pourrait être traduit par Sytème National de Cyber-sensibilisation.
  2. EIP pour Instruction Pointer. Le registre EIP contient l’offset de la prochaine instruction à exécuter.
  3. a et b EBP pour Frame Base Pointer. Ce registre sert à pointer sur une donnée dans la pile.
  4. ESP pour Stack Pointer. Ce registre 32 bits contient le déplacement pour atteindre le sommet de la pile.
  5. tas: heap en anglais.
  6. Pile: stack en anglais.
  7. NAS pour Network Access Server qui pourrait être traduit par Serveur d'accès réseau.

Références[modifier | modifier le code]

  1. a b et c (en) amolsarwate, « The GHOST Vulnerability », sur Qualys Community, (consulté le )
  2. (en) Qualys Security Advisory, « Qualys Security Advisory CVE-2015-0235 », sur Openwall,
  3. (en) « Technical analysis of Qualys' GHOST », sur lcamtuf's blog, .
  4. (en) US-CERT/NIST, « Vulnerability Summary for CVE-2015-0235 », sur National Vulnerability Database, .
  5. a et b « Manuel du programmeur Linux », sur linux-france.org
  6. (en) Marc-Alexandre Montpas, « Critical “GHOST” Vulnerability Released », sur SecuryBlog
  7. (en) Nixcraft, « How To Patch and Protect Linux Server Against the Glibc GHOST Vulnerability », sur Nixcraft.
  8. (en) Ryan Barnett, « GHOST gethostbyname() heap overflow in glibc », sur Trustwave
  9. (en) « Exim ESMTP GHOST Denial Of Service », sur packetstormsecurity
  10. « Faille Ghost : Synology met en ligne le correctif pour le DSM 5.1 », sur nextinpact
  11. « Faille Ghost : les NAS QNAP ne sont pas épargnés, un correctif arrive », sur nextinpact