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…
Mieliśmy shellshocka, mieliśmy heartbleeda, czas na GHOSTA, który dzisiaj został ogłoszony przez team Qualysa.
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:
Update1:
Pod tym adresem załoga Qualysa stwierdza:
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
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).
Moze przestanmy siac panike z tym Eximem, bo podatnosc istnieje tylko w specyficznych konfiguracjach:
https://lists.exim.org/lurker/message/20150127.200135.056f32f2.en.html
ponadto na pewno nie sa podatne serwery apache, mysql, proftpd, oracle, pgsql i jeszcze kilka.
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.
to jeszcze taki link od chlopakow z openwalla:
http://www.openwall.com/lists/oss-security/2015/01/27/18
Dzięki – już wklejone w samego posta z flagą (Update).
a i jeszcze jedno: Rurkowy portal o wannabe bezpieczenstwie, wycial wszystko poza polska:
z obcego kraju przesyconego zlymi hakerami:
http://zapodaj.net/92cdf8b1c20a4.png.html
z polski:
http://zapodaj.net/24d771229fe2a.png.html
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?
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.
Mała errata w kodzie:
|…|
thx, poprawione
Apache czy nginx może i nie są podatne, ale za to aplikacje w PHP już mogą być: http://blog.sucuri.net/2015/01/critical-ghost-vulnerability-released.html