Vulnérabilité fantôme - CVE-2015-0235

13

La vulnérabilité Ghost nécessite- t-elle un accès (comme en tant qu'utilisateur connecté) au système d'exploitation concerné en question? Quelqu'un peut-il clarifier «l'attaquant distant capable de lancer un appel d'application»? Il semble que je trouve des tests à exécuter directement sur le système local, mais pas à partir d'un hôte distant.

Toutes les informations que j'ai recueillies jusqu'à présent sur la vulnérabilité fantôme à partir de plusieurs sources (crédits à ces sources), j'ai posté ci-dessous dans une réponse au cas où quelqu'un d'autre serait curieux.

Edit, j'ai trouvé ma réponse :

Lors d'un audit de code, les chercheurs de Qualys ont découvert un dépassement de tampon dans la fonction __nss_hostname_digits_dots () de la glibc. Ce bogue peut être déclenché à la fois localement et à distance via toutes les fonctions gethostbyname * (). Les applications ont accès au résolveur DNS principalement via l'ensemble de fonctions gethostbyname * (). Ces fonctions convertissent un nom d'hôte en une adresse IP.

devnull
la source
peut-être ajouter des liens vers le site de sécurité SE, tels que security.stackexchange.com/q/80210/1341 et d'autres publications également?
MattBianco
Muru, j'ai déplacé le contenu vers une réponse. Merci pour la suggestion. MattBianco, j'ai également ajouté ce lien, merci.
devnull
J'ai mis à jour la question pour lever toute ambiguïté.
devnull

Réponses:

20

Réponse à ma question, de Qualys :

Au cours de nos tests, nous avons développé une preuve de concept dans laquelle nous envoyons un e-mail spécialement créé à un serveur de messagerie et pouvons obtenir un shell distant sur la machine Linux. Cela contourne toutes les protections existantes (comme ASLR, PIE et NX) sur les systèmes 32 bits et 64 bits.


Mes recherches compilées ci-dessous pour quiconque cherche:


Avertissement

Malgré ce que beaucoup d'autres discussions / blogs pourraient vous dire, je vous suggère de ne pas mettre à jour immédiatement chaque système d'exploitation que vous avez à l'aveugle sans tester soigneusement ces glibcmises à jour. Il a été signalé que les mises à jour de la glibc ont provoqué des erreurs de segmentation massives des applications obligeant les utilisateurs à restaurer leurs mises à jour de la glibc vers leur version précédente.

On ne se contente pas de mettre à jour en masse un environnement de production sans tester.


Informations d'arrière-plan

GHOST est un bogue de «débordement de tampon» affectant les appels de fonction gethostbyname () et gethostbyname2 () dans la bibliothèque glibc. Cette vulnérabilité permet à un attaquant distant qui est capable d'appeler une application de l'une de ces fonctions d'exécuter du code arbitraire avec les autorisations de l'utilisateur exécutant l'application.

Impact

Les appels de la fonction gethostbyname () sont utilisés pour la résolution DNS, qui est un événement très courant. Pour exploiter cette vulnérabilité, un attaquant doit provoquer un débordement de tampon en fournissant un argument de nom d'hôte non valide à une application qui effectue une résolution DNS.

Liste actuelle des distributions Linux affectées

RHEL (Red Hat Enterprise Linux) versions 5.x, 6.x et 7.x

RHEL 4 ELS              fix available ---> glibc-2.3.4-2.57.el4.2
Desktop (v. 5)          fix available ---> glibc-2.5-123.el5_11.1
Desktop (v. 6)          fix available ---> glibc-2.12-1.149.el6_6.5
Desktop (v. 7)          fix available ---> glibc-2.17-55.el7_0.5
HPC Node (v. 6)         fix available ---> glibc-2.12-1.149.el6_6.5
HPC Node (v. 7)         fix available ---> glibc-2.17-55.el7_0.5
Server (v. 5)           fix available ---> glibc-2.5-123.el5_11.1
Server (v. 6)           fix available ---> glibc-2.12-1.149.el6_6.5
Server (v. 7)           fix available ---> glibc-2.17-55.el7_0.5
Server EUS (v. 6.6.z)   fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 6)      fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 7)      fix available ---> glibc-2.17-55.el7_0.5

CentOS Linux version 5.x, 6.x et 7.x

CentOS-5    fix available ---> glibc-2.5-123.el5_11
CentOS-6    fix available ---> glibc-2.12-1.149.el6_6.5
CentOS-7    fix available ---> glibc-2.17-55.el7_0.5

Ubuntu Linux version 10.04, 12.04 LTS

10.04 LTS   fix available ---> libc6-2.11.1-0ubuntu7.20
12.04 LTS   fix available ---> libc6-2.15-0ubuntu10.10

Debian Linux version 6.x, 7.x

6.x squeeze              vulnerable
6.x squeeze (LTS)        fix available ---> eglibc-2.11.3-4+deb6u4
7.x wheezy               vulnerable
7.x wheezy (security)    fix available ---> glib-2.13-38+deb7u7

Linux Mint version 13.0

Mint 13    fix available ---> libc6-2.15-0ubuntu10.10

Fedora Linux version 19 (ou antérieure devrait être mise à niveau)

Fedora 19 - vulnerable - EOL on Jan 6, 2014 (upgrade to Fedora 20/21 for patch)

SUSE Linux Enterprise

Server 10 SP4 LTSS for x86                    fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for AMD64 and Intel EM64T  fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for IBM zSeries 64bit      fix available ---> glibc-2.4-31.113.3
Software Development Kit 11 SP3               fix available ---> glibc-2.11.3-17.74.13
Server 11 SP1 LTSS                            fix available ---> glibc-2.11.1-0.60.1
Server 11 SP2 LTSS                            fix available ---> glibc-2.11.3-17.45.55.5
Server 11 SP3 (VMware)                        fix available ---> glibc-2.11.3-17.74.13
Server 11 SP3                                 fix available ---> glibc-2.11.3-17.74.13
Desktop 11 SP3                                fix available ---> glibc-2.11.3-17.74.13

openSUSE (les versions antérieures à 11 devraient être mises à niveau)

11.4 Evergreen     fix available ---> glibc-2.11.3-12.66.1
12.3               fix available ---> glibc-2.17-4.17.1


Quels packages / applications utilisent encore la glibc supprimée?

( crédits à Gilles )

Pour CentOS / RHEL / Fedora / Scientific Linux:

   lsof -o / | awk '
   BEGIN {
       while (("rpm -ql glibc | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

Pour Ubuntu / Debian Linux:

   lsof -o / | awk '
   BEGIN {
       while (("dpkg -L libc6:amd64 | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

Quelle version de la bibliothèque C (glibc) mon système Linux utilise-t-il?

Le moyen le plus simple de vérifier le numéro de version consiste à exécuter la commande suivante:

ldd --version

Exemples de sorties de RHEL / CentOS Linux v6.6:

ldd (GNU libc) 2.12
Copyright (C) 2010 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.

Exemples de sorties d'Ubuntu Linux 12.04.5 LTS:

ldd (Ubuntu EGLIBC 2.15-0ubuntu10.9) 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.

Exemples de sorties de Debian Linux v7.8:

ldd (Debian EGLIBC 2.13-38+deb7u6) 2.13
Copyright (C) 2011 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.

Vérification de la vulnérabilité GHOST

L'Université de Chicago héberge le script ci-dessous pour un téléchargement facile:

$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
[OR]
$ curl -O https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
[responds vulnerable OR not vulnerable ]
/* ghosttest.c:  GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#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);
}

Compilez-le et exécutez-le comme suit:

$ gcc ghosttester.c -o ghosttester
$ ./ghosttester
[responds vulnerable OR not vulnerable ]

Red Hat Access Lab: outil GHOST N'utilisez pas cet outil, ses rapports sont erronés, le vérificateur de vulnérabilité de Qualys est précis.


Patcher


CentOS / RHEL / Fedora / Scientific Linux

sudo yum clean all
sudo yum update

Redémarrez maintenant pour prendre effet:

sudo reboot

Alternativement, si votre miroir ne contient pas les packages les plus récents, téléchargez-les simplement manuellement. * remarque: pour les utilisateurs plus avancés

CentOS 5

http://mirror.centos.org/centos/5.11/updates/x86_64/RPMS/

CentOS 6

mkdir ~/ghostupdate
cd ~/ghostupdate

wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/nscd-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-utils-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm

yum localupdate *.rpm [OR] rpm -Uvh *.rpm

Ubuntu / Debian Linux

sudo apt-get clean
sudo apt-get update
sudo apt-get dist-upgrade

Redémarrer:

sudo reboot

SUSE Linux Enterprise

Pour installer cette mise à jour de sécurité SUSE, utilisez YaST online_update. Ou utilisez les commandes suivantes selon votre version:

Kit de développement logiciel SUSE Linux Enterprise 11 SP3

zypper in -t patch sdksp3-glibc-10206

SUSE Linux Enterprise Server 11 SP3 pour VMware

zypper in -t patch slessp3-glibc-10206

SUSE Linux Enterprise Server 11 SP3

zypper in -t patch slessp3-glibc-10206

SUSE Linux Enterprise Server 11 SP2 LTSS

zypper in -t patch slessp2-glibc-10204

SUSE Linux Enterprise Server 11 SP1 LTSS

zypper in -t patch slessp1-glibc-10202

SUSE Linux Enterprise Desktop 11 SP3

zypper in -t patch sledsp3-glibc-10206

Enfin, exécutez pour toutes les versions de SUSE linux pour mettre votre système à jour:

zypper patch

OpenSUSE Linux

Pour voir une liste des mises à jour disponibles, y compris la glibc sur un OpenSUSE Linux, entrez:

zypper lu

Pour simplement mettre à jour les packages glibc installés avec leurs nouvelles versions disponibles, exécutez:

zypper up

Presque tous les programmes exécutés sur votre machine utilisent la glibc. Vous devez redémarrer chaque service ou application qui utilise la glibc pour garantir que le correctif prend effet. Par conséquent, un redémarrage est recommandé.


Comment redémarrer init sans redémarrer ni affecter le système?

telinit u

'man telinit' - U ou u pour demander que le démon init (8) se réexécute. Ceci n'est pas recommandé car Upstart n'est actuellement pas en mesure de conserver son état, mais est nécessaire lors de la mise à niveau des bibliothèques système.


Pour atténuer immédiatement la menace de manière limitée , vous devez désactiver les vérifications DNS inversées dans tous vos services publics. Par exemple, vous pouvez désactiver les vérifications DNS inversées dans SSH en définissant UseDNSsur nodans votre /etc/ssh/sshd_config.

Sources (et plus d'informations):

  1. https://access.redhat.com/articles/1332213
  2. http://www.cyberciti.biz/faq/cve-2015-0235-patch-ghost-on-debian-ubuntu-fedora-centos-rhel-linux/
  3. http://www.openwall.com/lists/oss-security/2015/01/27/9
  4. /security/80210/ghost-bug-is-there-a-simple-way-to-test-if-my-system-is-secure
  5. http://bobcares.com/blog/ghost-hunting-resolving-glibc-remote-code-execution-vulnerability-cve-2015-0235-in-centos-red-hat-ubuntu-debian-and-suse-linux- les serveurs
  6. https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability
  7. https://security-tracker.debian.org/tracker/CVE-2015-0235
devnull
la source
1
Nitpick: Le code de test de vulnérabilité provient de Qualys, pas d'Openwall. Le message Openwall lié à est simplement l'avis Qualys affiché dans leur liste de diffusion.
muru
"En raison du grand nombre d'applications / utilitaires système dépendant de la glibc" -> Vous pourriez aussi bien supprimer ces éléments, ou souligner le fait que 100% de tout dépend directement de libc, sauf pour les choses très étranges qui ont été compilées comme une bosse statique géante. Merci pour le BTW!
goldilocks
@goldilocks, merci pour la suggestion. Je l'ai édité avec d'autres choses. Heureux que ça aide!
devnull