# 一、 **漏洞概要**
近日,Linux底层函数glibc 的 DNS 客户端解析器被发现存在基于栈的缓冲区溢出漏洞。攻击者可借助特制的域名、 DNS 服务器或中间人攻击利用该漏洞执行任意代码,甚至控制整个系统。
# 二、 **漏洞原理**
攻击者可在恶意域名服务器创建恶意的DNS域名,诱骗用户访问查找恶意域名,并最终得到恶意服务器的 buffer-busting 响应。该域名被嵌入服务器日志中,一旦解析就会触发远程代码执行,SSH客户端也会因此被控制。
glibc通过alloca()函数在堆栈中保有2048字节,这个函数响应DNS查询请求的函数_nss_dns_gethostbyname4_r() ,然后是send_dg()和send_vc()两个函数。如果响应大于2048字节,就会从堆分配一个新的缓冲区并更新所有的信息,包括缓冲区指针、新的的缓冲区大小和响应包大小。在某些情况下,造成堆栈缓冲之间的不匹配,并会分配新的堆。最后的结果就是,堆栈缓冲将被用于存储DNS响应,即使响应包大小超过了堆栈缓冲,以及分配了堆缓冲。该行为导致堆栈缓冲的溢出。关键问题存在于resolv/res_send.c中,并在使用getaddrinfo()函数调用时触发。当启动sudo、curl或其他工具时,均可触发此漏洞利用。
# 三、 **漏洞影响范围**
所有Debian系列、 Red Hat 系列的 Linux 发行版中glibc版本大于 2.9 均受该漏洞影响,低于2.9的有可能受此漏洞影响。
# 四、 **检查方法**
方法一.检查是否存在该漏洞最简单的方法为查看glibc版本,查看指令为ldd –version,可见图4-1。另外一种方法为输入glibc库的名称(如libc.so.6),在基于Debian的 64 位系统上:$ /lib/x86_64-linux-gnu/libc.so.6。
图4-1
方法二. 在linux命令行“输入”glibc库的名称(如,libc.so.6),就像命令一样执行。
输出结果会显示更多关于glibc库的详细信息,包括glibc的版本以及使用的GNU编译器,也提供了glibc扩展的信息。glibc变量的位置取决于Linux版本和[处理器](http://www.chinabyte.com/keyword/%E5%A4%84%E7%90%86%E5%99%A8/)架构。
在基于Debian的64位系统上:
$ /lib/[x86](http://www.chinabyte.com/keyword/X86/)_64-linux-gnu/libc.so.6
在基于Debian的32位系统上:
$ /lib/i386-linux-gnu/libc.so.6
在基于Red Hat的64位系统上:
$ /lib64/libc.so.6
在基于Red Hat的32位系统上:
$ /lib/libc.so.6
## **4.1 glibc版本大于2.9**
假如检查中发现glibc版本为大于2.9版本,可确认存在该漏洞。
## **4.2 glibc版本小于2.9**
假如检查中发现glibc版本为小于2.9版本,可尝试使用参考信息中附件glibc漏洞利用POC工具,验证是否存在漏洞(工具在参考信息已提供压缩包)。POC测试步骤如下:
1. 更改DNS解析为127.0.0.1
2. 执行服务端代码(服务器需安装python):CVE-2015-7547-poc.py
3. GCC编译客户端代码:CVE-2015-7547-client.c , 执行编译后代码 CVE-2015-7547-client
若存在漏洞,会造成Segmentation Fault或段错误。
# 五、 **漏洞利用难度**
网上已公布漏洞利用工具,利用难度一般。
# 六、 **整改办法**
1. 网络侧拦截:根据系统运行实际情况,在防火墙等设备限制所有TCP协议的DNS响应包大小在1024字节之内,并丢弃超过512字节的UDP协议DNS包。
2.更新glibc版本
(1)联网更新
? *CentOS/RHEL/Fedora系统:#yum install glibc -y**Debian/Ubuntu系统:#apt-get update && apt-get install libc6*
(2)手工更新
下载glibc ,地址:<http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz>
下载后通过U盘或者中心网络系统通过该安装包下放到根目录/root
操作指令:
*#tar -xvf glibc-2.23.tar.gz*
*#mkdir glibc-build-2.23*
*#cd glibc-build-2.23*
*#../glibc-2.23/configure--prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin*
*#make & make install*
*#cd glibc-build-2.23*
*#ll libc.so.6*
*#ldd --version*
**注:更新补丁后,所有调用 glibc 的服务均需要重启,请相关人员根据实际情况进行操作;另外升级glibc可能导致系统故障,建议在测试服务器测试后再到将生产服务器进行升级。**
原文地址:https://www.cnblogs.com/xiaoshige/p/11131022.html