Vulnerabilità legata ai fantasmi - CVE-2015-0235


13

La vulnerabilità di Ghost richiede l'accesso (come nell'essere un utente connesso) al sistema operativo interessato in questione? Qualcuno può chiarire "l'attaccante remoto che è in grado di effettuare una chiamata all'applicazione"? Mi sembra di trovare solo test da eseguire direttamente sul sistema locale, ma non da un host remoto.

Tutte le informazioni che ho raccolto finora sulla vulnerabilità del fantasma da più fonti (crediti a quelle fonti) che ho pubblicato di seguito in una risposta nel caso in cui qualcun altro fosse curioso.

Modifica, ho trovato la mia risposta :

Durante un controllo del codice, i ricercatori Qualys hanno scoperto un buffer overflow nella funzione __nss_hostname_digits_dots () di glibc. Questo errore può essere attivato sia localmente che da remoto tramite tutte le funzioni gethostbyname * (). Le applicazioni hanno accesso al resolver DNS principalmente tramite l'insieme di funzioni gethostbyname * (). Queste funzioni convertono un nome host in un indirizzo IP.


forse aggiungere alcuni collegamenti al sito di sicurezza SE, come security.stackexchange.com/q/80210/1341 e altri post anche lì?
MattBianco,

Muru, ho spostato il contenuto in una risposta. Grazie per il suggerimento MattBianco, ho anche aggiunto quel link, grazie.
Devnull,

Ho aggiornato la domanda per rimuovere qualsiasi ambiguità.
Devnull,

Risposte:


20

Rispondi alla mia domanda, da Qualys :

Durante i nostri test, abbiamo sviluppato una prova di concetto in cui inviamo un'e-mail appositamente creata a un server di posta e possiamo ottenere una shell remota sulla macchina Linux. Questo ignora tutte le protezioni esistenti (come ASLR, PIE e NX) su entrambi i sistemi a 32 e 64 bit.


La mia ricerca compilata di seguito per chiunque cerchi:


disconoscimento

Nonostante ciò che molti altri thread / blog potrebbero dirti, ti suggerisco di non aggiornare immediatamente ogni singolo sistema operativo che hai ciecamente senza testare a fondo questi glibcaggiornamenti. È stato riferito che gli aggiornamenti di glibc hanno causato enormi segfault delle applicazioni costringendo le persone a ripristinare gli aggiornamenti di glibc alla versione precedente.

Uno non aggiorna semplicemente in massa un ambiente di produzione senza test.


Informazioni di base

GHOST è un bug di "buffer overflow" che influenza le chiamate di funzione gethostbyname () e gethostbyname2 () nella libreria glibc. Questa vulnerabilità consente a un utente malintenzionato remoto in grado di effettuare una chiamata dell'applicazione a una di queste funzioni per eseguire codice arbitrario con le autorizzazioni dell'utente che esegue l'applicazione.

urto

Le chiamate di funzione gethostbyname () vengono utilizzate per la risoluzione DNS, che è un evento molto comune. Per sfruttare questa vulnerabilità, un utente malintenzionato deve attivare un overflow del buffer fornendo un argomento hostname non valido a un'applicazione che esegue una risoluzione DNS.

Elenco attuale delle distribuzioni Linux interessate

RHEL (Red Hat Enterprise Linux) versione 5.x, 6.xe 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 versione 5.x, 6.xe 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 versione 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 versione 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 versione 13.0

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

Fedora Linux versione 19 (o precedente dovrebbe aggiornare)

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 (le versioni precedenti alla 11 dovrebbero essere aggiornate)

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


Quali pacchetti / applicazioni stanno ancora usando glibc cancellato?

( crediti a Gilles )

Per 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}'

Per 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}'

Quale versione della libreria C (glibc) utilizza il mio sistema Linux?

Il modo più semplice per verificare il numero di versione è eseguire il comando seguente:

ldd --version

Output di esempio da 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.

Output di esempio da 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.

Output di esempio da 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.

Controllo della vulnerabilità GHOST

L'Università di Chicago ospita lo script seguente per un facile download:

$ 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);
}

Compilalo ed eseguilo come segue:

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

Red Hat Access Lab: strumento GHOST Non utilizzare questo strumento, la sua segnalazione è errata, il controllo delle vulnerabilità di Qualys è accurato.


patching


CentOS / RHEL / Fedora / Scientific Linux

sudo yum clean all
sudo yum update

Ora riavvia per avere effetto:

sudo reboot

In alternativa, se il tuo mirror non contiene i pacchetti più recenti, basta scaricarli manualmente. * nota: per utenti più esperti

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

Ricomincia:

sudo reboot

SUSE Linux Enterprise

Per installare questo aggiornamento di sicurezza SUSE, utilizzare YaST online_update. Oppure usa i seguenti comandi secondo la tua versione:

SUSE Linux Enterprise Software Development Kit 11 SP3

zypper in -t patch sdksp3-glibc-10206

SUSE Linux Enterprise Server 11 SP3 per 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

Infine, esegui tutte le versioni di SUSE Linux per aggiornare il tuo sistema:

zypper patch

OpenSUSE Linux

Per vedere un elenco di aggiornamenti disponibili incluso glibc su un OpenSUSE Linux, inserisci:

zypper lu

Per aggiornare semplicemente i pacchetti glibc installati con le loro versioni disponibili più recenti, eseguire:

zypper up

Quasi tutti i programmi in esecuzione sul tuo computer usano glibc. È necessario riavviare ogni servizio o app che utilizza glibc per assicurarsi che la patch abbia effetto. Pertanto, si consiglia di riavviare.


Come riavviare init senza riavviare o influenzare il sistema?

telinit u

'man telinit' - U o u per richiedere che il demone init (8) si riesca da solo. Questo non è raccomandato poiché Upstart non è attualmente in grado di pre-servire il suo stato, ma è necessario per l'aggiornamento delle librerie di sistema.


Attenuare immediatamente la minaccia in modo limitato significa disabilitare i controlli DNS inversi in tutti i servizi pubblici. Ad esempio, puoi disabilitare i controlli DNS inversi in SSH impostando UseDNSsu nonel tuo /etc/ssh/sshd_config.

Fonti (e ulteriori informazioni):

  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- server
  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

1
Nitpick: il codice del test di vulnerabilità è di Qualys, non di Openwall. Il post di Openwall collegato è semplicemente l'avviso di Qualys pubblicato nella loro mailing list.
Muru,

"A causa del gran numero di applicazioni / utilità di sistema dipendenti da glibc" -> Potresti anche eliminare quella roba o sottolineare il fatto che il 100% di tutto dipende direttamente da libc, tranne per le cose molto strane che sono state compilate come un grosso nodulo statico. Grazie per il BTW!
Riccioli d'oro,

@goldilocks, grazie per il suggerimento. L'ho modificato insieme ad altre cose. Sono contento che aiuti!
Devnull
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.