Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book

GHOST: nowa krytyczna podatność – łatać się kto może…

27 stycznia 2015, 18:32 | W biegu | komentarzy 11

Mieliśmy shellshocka, mieliśmy heartbleeda, czas na GHOSTA, który dzisiaj został ogłoszony przez team Qualysa.

Dla niecierpliwych: bug umożliwia choćby zdalne wykonanie kodu w znacznej liczbie Linuksowych usług sieciowych. Autorzy znaleziska – w ramach Proof of Concept – przygotowali exploita na popularny serwer pocztowy – Exim (choć prawdopodobnie exploit wymaga niestandardowej konfiguracji Exima).

Błąd tym razem jest przepełnieniem bufora w jednej z funkcji standardowej linuksowej biblioteki glibc: __nss_hostname_digits_dots() – ale można się do niej „dobić” (exploitując podatność) korzystając niezmiernie popularnej rodziny funkcji:   gethostbyname*().

Jak to piszą odkrywcy buga:

This bug is reachable both locally and remotely via the gethostbyname*() functions

Z kolei funkcje gethostbyname() w skrócie – służą do zamiany nazw DNS na adresy IP (i na odwrót). Podstawowa funkcjonalność, prawda? Wprawdzie w wielu miejscach nie zaleca się już korzystania z tych funkcji (status: deprecated), ale jak wiadomo używamy masę starego kodu (pisanego jeszcze w czasach gdy użycie gethostbyname() było zalecane), a nie wszyscy wprowadzają zalecania w życie.

Przykład? Autorzy znaleziska w ramach Proof of Concept znaleźli zdalne wykonanie kodu w znanym serwerze pocztowym Exim-ie (update: niekoniecznie w domyślnej konfiguracji – co może obniżać krytyczność tego PoC-a:

As a proof of concept, we developed a full-fledged remote exploit against the Exim mail server, bypassing all existing protections (ASLR, PIE, and NX) on both 32-bit and 64-bit machines. We will publish our exploit as a Metasploit module in the near future.

Ale oczywiście i inne usługi mogą (i pewnie będą) podatne.

Bug istnieje od 2000 roku, a został załatany w maju 2013 (ale nie w związku z problemami bezpieczeństwa…), co powoduje choćby dystrybucje Linuksa, które nie posiadają w miarę najnowszych glibc – takie jak:

Debian 7 (wheezy), Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7,  Ubuntu 12.04– są podatne (dzisiaj udostępnione zostały patche).

Autorzy udostępniają też niewielki kod w języku C, sprawdzający czy jesteśmy podatni czy nie (do własnej kompilacji i uruchomienia):

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

Metryka buga z RedHata:

cve-ghost

Update1:

Pod tym adresem załoga Qualysa stwierdza:

Here is a list of potential targets that we investigated (they all call
gethostbyname, one way or another), but to the best of our knowledge,
the buffer overflow cannot be triggered in any of them:

apache, cups, dovecot, gnupg, isc-dhcp, lighttpd, mariadb/mysql,
nfs-utils, nginx, nodejs, openldap, openssh, postfix, proftpd,
pure-ftpd, rsyslog, samba, sendmail, sysklogd, syslog-ng, tcp_wrappers,
vsftpd, xinetd.

PS

To tylko podstawowa informacja o bug-u – w trakcie rozwoju sytuacji postaramy się publikować aktualizacje.

–ms

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Wypadało by teraz na urządzeniach typu WAF oraz IDS/IPS wdrożyć regułę/sygnaturę, która łapie: /[0-9a-fx\.]{64,}/ (w razie czego śmiało można to podnieść do ok. 1020 bajtów) w miejscach, gdzie może być przekazywany argument do funkcji __nss_hostname_digits_dots()[1]

    [1] – licząc, że aplikacja, która docelowo wykorzystuje tą funkcję, nie przyjmuje danych w innej postaci i nie sprowadza ich do postaci docelowej dla podatnej funkcji (np. ściągając „opakowanie” z danych).

    Odpowiedz
  2. Norbert z Klanu na TVP
    Odpowiedz
    • Dzięki za info! Exploit na razie nie jest publiczny, więc ciężko stwierdzić dokładnie w jakich sytuacjach działa a w jakich nie (choć link ze strony exima – cenny i pewnie tam będzie dalej dyskusja). W tym „na pewno nie są podatne” – to też bym nie przesadzał. Na pewno nie są podatne jeśli nie używają ww. funkcji. Pewnie najnowsze wersje nie używają – ale najnowsze wersje glibc (od 2013r) też nie są podatne – a mimo tego w wielu głównych distro były używane wcześniejsze (podatne) wersje.

      Też informację publikujemy z tego co na obecny czas wiadomo – będą update-y.

      Odpowiedz
  3. Norbert z Klanu na TVP
    Odpowiedz
    • wcaleniepiotr

      Nie rozumiem, jaki mieliby w tym interes.
      Z tego co widzę, to nie wyciął, tylko strona nie odpowiadała, więc dostałeś kopię z cloudflara, tak jak pisze na screenie.
      Mógłby ktoś powiedzieć, jaki może być powód, że z Polski działa, a z USA nie?

      Odpowiedz
      • Paranoid Security

        strona nie odpowiada tylko i wylacznie gdy laczysz sie zza granicy. z polski dziala swietnie. ten stan rzeczy trwa od dwoch dni. jaki w tym interes? zaden, przestraszyli sie GHOSTA.

        Odpowiedz
  4. Mała errata w kodzie:
    |…|

    Odpowiedz
  5. Dessite
    Odpowiedz

Odpowiedz