Poważna podatność w bibliotece glibc ⩾ 2.9
 

Poważna podatność w bibliotece glibc ⩾ 2.9


2016-02-17

Wykryto poważną podatność (CVE-2015-7547) w bibliotece glibc (od wersji 2.9), z której korzysta wiele innych aplikacji (w tym ssh, sudo, curl i inne): stack-based buffer overflow przy wywołaniu funkcji getaddrinfo(). W sieci dostępny jest Proof-Of-Concept - zobaczmy jak działa. Wystarczy, że klient wywoła zapytanie DNS dla domeny kontrolowanej przez atakującego:

1
r = getaddrinfo("zatruta-domena.org", "22",&hints, &res)) != 0)

Spreparowana odpowiedz na takie zapytanie (pochodząca z serwera DNS atakującego) powoduje w kliencie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(gdb) bt
#0  0x00007ffff742380b in __libc_res_nquery () from /lib64/libresolv.so.2
#1  0x00007ffff7423d69 in __libc_res_nquerydomain () from /lib64/libresolv.so.2
#2  0x00007ffff7424a4f in __libc_res_nsearch () from /lib64/libresolv.so.2
#3  0x00007ffff76367a7 in _nss_dns_gethostbyname4_r () from /lib64/libnss_dns.so.2
#4  0x4242424242424242 in ?? ()
#5  0x4242424242424242 in ?? ()
#6  0x4242424242424242 in ?? ()
#7  0x4242424242424242 in ?? ()
#8  0x4242424242424242 in ?? ()
#9  0x4242424242424242 in ?? ()
#10 0x4242424242424242 in ?? ()
#11 0x4242424242424242 in ?? ()
#12 0x0000424242424242 in ?? ()
#13 0x2e302e302e373231 in ?? ()
(gdb) info registers
rax            0x4242424242424242 4774451407313060418
rbx            0x220  544
rcx            0x4242424242424242 4774451407313060418
rdx            0x4242424242424242 4774451407313060418
...
rip            0x7ffff742380b 0x7ffff742380b <__libc_res_nquery+459>

Jak widać został nadpisany pokaźny kawałek stosu (i w konsekwencji cześć rejestrów). Zapisany wskaźnik instrukcji (RIP) w wyniku działania tego PoC został nadpisany, ale jednak nie doszło do przekazania sterowania pod podmieniony adres. Stalo się tak, ponieważ zanim funkcja _nss_dns_gethostbyname4_r() powróciła, pojawił się krytyczny błąd w jednej z funkcji przez nią wywoływanych:

1
2
(gdb) x/xi
   0x7fffffffc9e2:    add    BYTE PTR [rax],al

Wysyłany przez PoC payload nadpisał rejestr wynikowy (RAX) adresem niezaalokowanej komórki pamięci. Odpowiednie skorygowanie payloadu PoC'a powinno jednak umożliwić bardziej niebezpieczne działania, włącznie ze zmianą działania programu.

Biorąc pod uwagę, ze payloadem mogą być tez najprawdopodobniej dowolnej wartości bajty (a na pewno znaczący bajt NULL), błąd wydaje się być bardzo poważny.

Zalecamy jak najszybsze uaktualnienie bibliotek glibc.

 
 

wcss

Kontakt
 

Email: zbi@wcss.pl
Klucz: PGP

Telefon1: 71 320 20 79
Telefon2: 71 320 20 13

więcej →

Centrala ZBI
 

Budynek C-3
pok. 231A
ul. Janiszewskiego 11/17
50-372 Wrocław


Partnerzy