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

Posted xiaoshige

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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版本和[处理器](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可能导致系统故障,建议在测试服务器测试后再到将生产服务器进行升级。**

以上是关于Linux底层函数库glibc漏洞核查整改指引的主要内容,如果未能解决你的问题,请参考以下文章

glibc和libc到底有啥区别?

正则表达式基础库源码审计与漏洞分析

Linux开发必知内容整理 libc、glibc和glib的关系

glibc 和 libc的区别

常见漏洞整改方法汇总

Linux下漏洞整改方案