Luka w zabezpieczeniach związana z duchami - CVE-2015-0235


13

Czy luka w zabezpieczeniach Ghost wymaga dostępu (podobnie jak w przypadku zalogowanego użytkownika) do danego systemu operacyjnego? Czy ktoś może wyjaśnić „zdalny atakujący, który może wywołać aplikację”? Wydaje mi się, że znajduję testy do uruchomienia w systemie lokalnym bezpośrednio, ale nie ze zdalnego hosta.

Wszystkie informacje, które do tej pory zebrałem na temat podatności na duchy z wielu źródeł (napisy do tych źródeł) zamieściłem poniżej w odpowiedzi na wypadek, gdyby ktoś był ciekawy.

Edytuj, znalazłem swoją odpowiedź :

Podczas audytu kodu badacze Qualys wykryli przepełnienie bufora w funkcji __nss_hostname_digits_dots () programu glibc. Ten błąd można wywołać zarówno lokalnie, jak i zdalnie za pośrednictwem wszystkich funkcji gethostbyname * (). Aplikacje mają dostęp do usługi rozpoznawania nazw DNS przede wszystkim za pośrednictwem zestawu funkcji gethostbyname * (). Te funkcje konwertują nazwę hosta na adres IP.


może dodać jakieś linki do strony bezpieczeństwa SE, takie jak security.stackexchange.com/q/80210/1341 i inne tam również posty?
MattBianco

Muru, przeniosłem treść na odpowiedź. Dzieki za sugestie. MattBianco, dodałem również ten link, dzięki.
devnull

Zaktualizowałem pytanie, aby usunąć wszelkie niejasności.
devnull

Odpowiedzi:


20

Odpowiedz na moje pytanie od Qualys :

Podczas naszych testów opracowaliśmy test koncepcyjny, w którym wysyłamy specjalnie utworzoną wiadomość e-mail na serwer pocztowy i możemy uzyskać zdalną powłokę na maszynę z systemem Linux. Pomija to wszystkie istniejące zabezpieczenia (takie jak ASLR, PIE i NX) zarówno w systemach 32-bitowych, jak i 64-bitowych.


Moje zebrane badania poniżej dla każdego, kto szuka:


Zrzeczenie się

Pomimo tego, co może powiedzieć wiele innych wątków / blogów, sugeruję, aby nie aktualizować natychmiast każdego systemu operacyjnego na ślepo bez dokładnego przetestowania tych glibcaktualizacji. Doniesiono, że aktualizacje glibc spowodowały masowe awarie aplikacji, zmuszając ludzi do wycofania aktualizacji glibc do poprzedniej wersji.

Nie można po prostu masowo aktualizować środowiska produkcyjnego bez testowania.


Informacje podstawowe

GHOST to błąd „przepełnienia bufora” wpływający na wywołania funkcji gethostbyname () i gethostbyname2 () w bibliotece glibc. Luka ta umożliwia zdalnemu atakującemu, który jest w stanie wykonać wywołanie aplikacji do którejkolwiek z tych funkcji, w celu wykonania dowolnego kodu z uprawnieniami użytkownika uruchamiającego aplikację.

Wpływ

Wywołania funkcji gethostbyname () są używane do rozwiązywania DNS, co jest bardzo częstym zdarzeniem. Aby wykorzystać tę lukę, osoba atakująca musi wyzwolić przepełnienie bufora, podając niepoprawny argument nazwy hosta do aplikacji wykonującej rozpoznawanie DNS.

Aktualna lista zagrożonych dystrybucji Linuksa

RHEL (Red Hat Enterprise Linux) wersja 5.x, 6.x i 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 w wersji 5.x, 6.x i 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 wersja 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 wersja 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 w wersji 13.0

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

Fedora Linux wersja 19 (lub starsza powinna się zaktualizować)

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 (wersje starsze niż 11 powinny zostać zaktualizowane)

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


Jakie pakiety / aplikacje nadal używają usuniętego glibc?

( podziękowania dla Gillesa )

W przypadku 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}'

W systemie 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}'

Z jakiej wersji biblioteki C (glibc) korzysta mój system Linux?

Najłatwiejszym sposobem sprawdzenia numeru wersji jest uruchomienie następującego polecenia:

ldd --version

Przykładowe dane wyjściowe z 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.

Przykładowe dane wyjściowe z systemu 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.

Przykładowe dane wyjściowe z 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.

Kontrola podatności GHOST

University of Chicago udostępnia poniższy skrypt do łatwego pobierania:

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

Skompiluj i uruchom w następujący sposób:

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

Red Hat Access Lab: narzędzie GHOST Nie używaj tego narzędzia, jego raportowanie jest nieprawidłowe, moduł sprawdzania luk Qualys jest dokładny.


Łatanie


CentOS / RHEL / Fedora / Scientific Linux

sudo yum clean all
sudo yum update

Teraz uruchom ponownie, aby zastosować:

sudo reboot

Alternatywnie, jeśli twoje lustro nie zawiera najnowszych pakietów, po prostu pobierz je ręcznie. * Uwaga: dla bardziej zaawansowanych użytkowników

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

Uruchom ponownie:

sudo reboot

SUSE Linux Enterprise

Aby zainstalować tę aktualizację zabezpieczeń SUSE, użyj YaST online_update. Lub użyj następujących poleceń zgodnie z wersją:

SUSE Linux Enterprise Software Development Kit 11 SP3

zypper in -t patch sdksp3-glibc-10206

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

Na koniec uruchom wszystkie wersje SUSE Linux, aby zaktualizować system:

zypper patch

OpenSUSE Linux

Aby zobaczyć listę dostępnych aktualizacji, w tym glibc w systemie OpenSUSE Linux, wpisz:

zypper lu

Aby po prostu zaktualizować zainstalowane pakiety glibc nowszymi dostępnymi wersjami, uruchom:

zypper up

Prawie każdy program działający na twoim komputerze używa glibc. Musisz ponownie uruchomić każdą usługę lub aplikację korzystającą z glibc, aby upewnić się, że łatka zadziała. Dlatego zalecane jest ponowne uruchomienie komputera.


Jak zrestartować init bez restartowania lub wpływania na system?

telinit u

„man telinit” - U lub u, aby zażądać ponownego uruchomienia demona init (8). Nie jest to zalecane, ponieważ Upstart obecnie nie jest w stanie zachować swojego stanu, ale jest niezbędny podczas aktualizacji bibliotek systemowych.


Natychmiastowe ograniczenie zagrożenia w ograniczony sposób polega na wyłączeniu wstecznego sprawdzania DNS we wszystkich usługach publicznych. Na przykład możesz wyłączyć sprawdzanie odwrotnego DNS w SSH, ustawiając UseDNSna now swoim /etc/ssh/sshd_config.

Źródła (i więcej informacji):

  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- serwery
  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: Kod testu podatności na zagrożenia pochodzi z Qualys, a nie z Openwall. Link do Openwall, do którego prowadzi link, to po prostu poradnik Qualys zamieszczony na liście mailingowej.
muru

„Ze względu na dużą liczbę aplikacji / narzędzi systemowych zależnych od glibc” -> Równie dobrze możesz to wyjąć lub podkreślić fakt, że 100% absolutnie wszystkiego zależy bezpośrednio od libc, z wyjątkiem bardzo dziwnych rzeczy, które zostały skompilowane jako gigantyczna statyczna bryła. Dzięki za BTW!
goldilocks

@goldilocks, dzięki za sugestię. Zredagowałem to wraz z kilkoma innymi rzeczami. Cieszę się, że to pomaga!
devnull 30.01.2015
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.