开源安全研究团队披露了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。