Linux底层函数库glibc漏洞核查整改指引

一、 漏洞概要

近日,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版本和处理器架构。

  在基于Debian的64位系统上:

$ /lib/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

4. 若存在漏洞,会造成Segmentation Fault或段错误,见图5-1。

图5-1

五、 漏洞利用难度

网上已公布漏洞利用工具,利用难度一般。

六、 整改办法

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可能导致系统故障,建议在测试服务器测试后再到将生产服务器进行升级。

发布于 10:47

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券