glibc CVE-2015-7547 漏洞

开源安全研究团队披露了Glibc getaddrinfo溢出漏洞,该漏洞影响范围较大,涉及当前主要的Linux发行版。据Google 博客中所述,该漏洞应该是可以绕过内存防护技术,从而形成代码执行漏洞。
以下版本均受影响

Red Hat Enterprise Linux Server 7 
Red Hat Enterprise Linux Server 6 
CentOS Linux 7 
CentOS Linux 6 
Debian Linux 6 squeeze 
Debian Linux 7 wheezy 
Debian Linux 8 jessie 
Ubuntu Linux 15.10 
Ubuntu Linux 14.04 LTS 
Ubuntu Linux 12.04 LTS

漏洞危害
Glibc组件包含了大量标准库,这些标准库会被众多的程序调用。其中 libresolv库用来实现主机名与IP地址之间转换的功能。作为glibc包含的组件之一,nss_dns模块通过libresolv库进行DNS查询,从而实现Name Service Switch(NSS)服务。
Libresolv库中的代码在执行A/AAAA 双重DNS查询时会触发基于堆栈的缓冲区溢出漏洞。远程攻击者可以通过创建特殊的DNS响应,造成libresolv崩溃或有可能以运行库用户的身份和权限执行代码;调用函数send_dg(UDP查询)和send_vc(TCP查询)时会触发缓冲区溢出。
漏洞分析
通过对安全漏洞进行分析,glibc通过alloca函数在堆栈中保有2048字节。响应DNS查询请求的函数为_nss_dns_gethostbyname4_r,然后继续调用send_dg和send_vc两个函数。如果响应大于2048字节,就会从堆栈分配一个新的缓冲区并更新所有的信息,包括缓冲区指针、新的缓冲区大小和响应包大小。在某些情况下,这一过程会造成堆栈缓冲之间的不匹配,并会再次分配新的堆栈。最终导致堆栈缓冲将全部被用于存储DNS响应,所以该行为会导致堆栈缓冲的溢出。
验证方法

[root@qfong CVE-2015-7547]# ldd --version
ldd (GNU libc) 2.17

DNS 解析为 127.0.0.1

/etc/solv.conf
nameserver 127.0.0.1 
cat /etc/nsswitch.conf
hosts:      dns files

1 重启服务

[root@qfong CVE-2015-7547]# systemctl restart nscd

2 执行操作

[root@qfong CVE-2015-7547]# ./CVE-2015-7547-poc.py 
[UDP] Total Data len recv 27
[UDP] Total Data len recv 27
Connected with 127.0.0.1:51780
[TCP] Total Data len recv 58
[TCP] Request1 len recv 27
[TCP] Request2 len recv 27
[UDP] Total Data len recv 27
[UDP] Total Data len recv 27
Connected with 127.0.0.1:51791
[TCP] Total Data len recv 29

另一个终端执行./CVE-2015-7547-client ,若含有漏洞,会造成Segmentation Fault。

[root@qfong CVE-2015-7547]# ./CVE-2015-7547-client 
Segmentation fault (core dumped)

采取措施:
el7 更新地址

 http://mirror.centos.org/centos/7/updates/x86_64/Packages/glibc-2.17-106.el7_2.4.x86_64.rpm

el6 更新地址

 http://mirror.centos.org/centos/6/updates/

参考:

https://www.exploit-db.com/exploits/39454/
https://access.redhat.com/articles/2161461

升级后:使用

lsof +c0 -d DEL | awk 'NR==1 || /libc-/ {print $2,$1,$4,$NF}' | column -t

查看是否使用新的glibc。

发表评论

您的电子邮箱地址不会被公开。