Vulnerabilidade de fantasma - CVE-2015-0235

13

A Vulnerabilidade do Ghost requer acesso (como sendo um usuário conectado) ao sistema operacional afetado em questão? Alguém pode esclarecer o 'atacante remoto que é capaz de fazer uma chamada de aplicativo'? Apenas pareço encontrar testes para executar no sistema local diretamente, mas não de um host remoto.

Todas as informações que reuni até agora sobre a Vulnerabilidade de Fantasma de várias fontes (créditos para essas fontes) foram postadas abaixo em uma resposta, caso alguém mais esteja curioso.

Editar, encontrei minha resposta :

Durante uma auditoria de código, os pesquisadores da Qualys descobriram um estouro de buffer na função __nss_hostname_digits_dots () da glibc. Esse bug pode ser acionado localmente e remotamente através de todas as funções gethostbyname * (). Os aplicativos têm acesso ao resolvedor DNS principalmente por meio do conjunto de funções gethostbyname * (). Essas funções convertem um nome de host em um endereço IP.

devnull
fonte
talvez adicione alguns links ao site de segurança SE, como security.stackexchange.com/q/80210/1341 e outras postagens também?
precisa saber é o seguinte
Muru, mudei o conteúdo para uma resposta. Obrigado pela sugestão. MattBianco, eu também adicionei esse link, Obrigado.
precisa saber é
Atualizei a pergunta para remover qualquer ambiguidade.
precisa saber é

Respostas:

20

Resposta à minha pergunta, da Qualys :

Durante nossos testes, desenvolvemos uma prova de conceito em que enviamos um email especialmente criado para um servidor de email e podemos obter um shell remoto para a máquina Linux. Isso ignora todas as proteções existentes (como ASLR, PIE e NX) em sistemas de 32 e 64 bits.


Minha pesquisa compilada abaixo para quem procura:


aviso Legal

Apesar do que muitos outros tópicos / blogs possam lhe dizer, sugiro que não atualize imediatamente todos os sistemas operacionais que você possui às cegas, sem testar exaustivamente essas glibcatualizações. Foi relatado que as atualizações glibc causaram grandes falhas de aplicativos, forçando as pessoas a reverter suas atualizações glibc para a versão anterior.

Não basta atualizar em massa um ambiente de produção sem testar.


Informações básicas

GHOST é um bug de 'buffer overflow' que afeta as chamadas de função gethostbyname () e gethostbyname2 () na biblioteca glibc. Essa vulnerabilidade permite que um invasor remoto capaz de fazer uma chamada de aplicativo para uma dessas funções execute código arbitrário com as permissões do usuário que está executando o aplicativo.

Impacto

As chamadas de função gethostbyname () são usadas para resolução de DNS, que é um evento muito comum. Para explorar esta vulnerabilidade, um invasor deve acionar um estouro de buffer fornecendo um argumento de nome de host inválido para um aplicativo que executa uma resolução de DNS.

Lista atual de distribuições Linux afetadas

RHEL (Red Hat Enterprise Linux) versão 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 versão 5.x, 6.x e 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 versão 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 versão 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 versão 13.0

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

Fedora Linux versão 19 (ou anterior deve atualizar)

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 (versões anteriores a 11 devem ser atualizadas)

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


Quais pacotes / aplicativos ainda estão usando o glibc excluído?

( créditos para Gilles )

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

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

Qual versão da biblioteca C (glibc) meu sistema Linux usa?

A maneira mais fácil de verificar o número da versão é executar o seguinte comando:

ldd --version

Amostras de saídas do 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.

Exemplo de saídas do 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.

Exemplo de saídas do 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.

Verificação de vulnerabilidade GHOST

A Universidade de Chicago está hospedando o script abaixo para facilitar o 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);
}

Compile e execute-o da seguinte maneira:

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

Red Hat Access Lab: ferramenta GHOST Não use esta ferramenta, seus relatórios estão incorretos, o verificador de vulnerabilidades da Qualys é preciso.


Remendo


CentOS / RHEL / Fedora / Linux Científico

sudo yum clean all
sudo yum update

Agora reinicie para ter efeito:

sudo reboot

Como alternativa, se o seu espelho não contiver os pacotes mais recentes, faça o download manualmente. * observação: para usuários mais avançados

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

Reiniciar:

sudo reboot

SUSE Linux Enterprise

Para instalar esta atualização de segurança do SUSE, use o YaST online_update. Ou use os seguintes comandos conforme sua versão:

Kit de Desenvolvimento de Software SUSE Linux Enterprise 11 SP3

zypper in -t patch sdksp3-glibc-10206

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

Finalmente, execute todas as versões linux do SUSE para atualizar seu sistema:

zypper patch

OpenSUSE Linux

Para ver uma lista de atualizações disponíveis, incluindo glibc no OpenSUSE Linux, digite:

zypper lu

Para simplesmente atualizar os pacotes glibc instalados com suas novas versões disponíveis, execute:

zypper up

Quase todos os programas em execução na sua máquina usam glibc. Você precisa reiniciar todos os serviços ou aplicativos que usam glibc para garantir que o patch entre em vigor. Portanto, uma reinicialização é recomendada.


Como reiniciar o init sem reiniciar ou afetar o sistema?

telinit u

'man telinit' - U ou u para solicitar que o daemon init (8) se re-execute. Isso não é recomendado, pois o Upstart atualmente não pode preservar seu estado, mas é necessário ao atualizar as bibliotecas do sistema.


Atenuar imediatamente a ameaça de maneira limitada é desabilitar as verificações reversas de DNS em todos os seus serviços públicos. Por exemplo, você pode desabilitar a verificação de DNS reverso em SSH, definindo UseDNSa nosua/etc/ssh/sshd_config .

Fontes (e mais informações):

  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- servidores
  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
fonte
1
Nitpick: o código de teste de vulnerabilidade é da Qualys, não da Openwall. A postagem do Openwall vinculada é simplesmente o aviso da Qualys publicado em sua lista de discussão.
muru
"Devido ao grande número de aplicativos / utilitários de sistema dependentes da glibc" -> Você também pode retirar essas coisas ou enfatizar o fato de que 100% de absolutamente tudo depende diretamente da libc, exceto por coisas muito estranhas que foram compiladas como um caroço estático gigante. Graças isso para o BTW!
Goldilocks
@goldilocks, obrigado pela sugestão. Eu editei junto com algumas outras coisas. Ainda bem que ajuda!
devnull