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

原文地址:https://www.cnblogs.com/xiaoshige/p/11131022.html

时间: 2024-11-02 23:39:32

Linux底层函数库glibc漏洞核查整改指引的相关文章

linux内核函数库文件的寻找

linux内核函数的so库文件怎么找呢? 首先还是要产生一个进程的coredump文件的 linux有一个lib-gdb.so库,这个进程的coredump文件中所有load段的最后一个load段中,通过读取二进制文件将最后一个load段读取出来保存lib-gdb.so库文件,这个库文件就是内核函数的库文件. coredump文件头->多个程序头(每一个程序头都会对应一个load段)->通过程序头读取load段

linux curses函数库

fedora20,安装yum install ncurses-devel 编译时:-lncurses 头文件:#include<curses.h> 参考:man ncurses \linux程序设计 一,屏幕 1, 以initscr()开始,以endwin();结束 WINDOW *initscr(void); //初始化 int endwin(void); // 退出curses, 返回OK/ERR 2, 输出到屏幕 int addch(const chtype ch); //当前位置add

Linux C函数库大全

(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) iscntrl(测试字符是否为ASCII码的控制字符) isdigit(测试字符是否为阿拉伯数字) isgraph(测试字符是否为可打印字符) islower(测试字符是否为小写英文字母) isprint(测试字符是否为可打印字符) isspace(测试字符是否为空格字符) ispunct(测试字

linux C 函数库

第1章字符测试函数 1 isalnum(测试字符是否为英文字母或数字) 2 isalpha(测试字符是否为英文字母) 3 isascii(测试字符是否为ASCII码字符) 4 isblank(测试字符是否为空格字符) 5 iscntrl(测试字符是否为ASCII码的控制字符) 6 isdigit(测试字符是否为阿拉伯数字) 7 isgraph(测试字符是否为可打印字符) 8 islower(测试字符是否为小写英文字母) 9 isprint(测试字符是否为可打印字符) 10 isspace(测试字

linux 函数库使用

程序函数库可分为3种类型:静态函 数库(static libraries).共享函数库(shared libraries)和动态加载函数库(dynamically loaded libraries) 静态函数库是在程序执行前就加入到目标程序中去了:而共享函数库则是在程序启动的时候加载到程序中,它可以被 不同的程序共享:动态加载函数库则可以在程序运行的任何时候动态的加载.实际上,动态函数库并非另外一种库函数格式,区别是动态加载函数库是如何被程序员 使用的.后面我们将举例说明 静态函数库 静态函数库

curses不是linux里默认的C函数库

今天在调试一个贪吃蛇程序时,出现如下错误: [[email protected] c++]$ g++ snack.cpp -o snack/tmp/ccCuZ3Jm.o:在函数‘playgame(int, int)’中:snack.cpp:(.text+0xce):对‘erase’未定义的引用snack.cpp:(.text+0xed):对‘mvprintw’未定义的引用snack.cpp:(.text+0x140):对‘mvprintw’未定义的引用snack.cpp:(.text+0x166

Linux之自定义的 Shell 函数和函数库

在 Linux 系统下,Shell 脚本可以在各种不同的情形下帮到我们,例如展示信息,甚至 自动执行特定的系统管理任务,创建简单的命令行工具等等. 在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数. Shell 脚本要存储在何处 为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在$PATH 环境变量所定义的路径里的其中一个. 使用下面的命令可以查看你系统

C语言的动态函数库和静态函数库的生成和使用(linux环境下)

软件开发往往是一个十分庞大的工程.需要消耗大量的脑力.借助别人已经开发好的库,往往能提高效率,下面将介绍如何开发和使用共享的库文件.使用别人已经开发好的库,就像是我们想要建造一辆汽车十分困难,但是如果汽车的各大部件都已经存在并且可以获得,我们要做的工作就是组装,组装过程一定比设计这些部件要轻松. 函数库分为两种静态(static)函数库和动态(shared)函数库.两者都是函数的集合.区别:在编译的时候会把静态函数库的内容加到目标程序中,目标程序具有函数库的代码;而动态函数库是在执行的时候才把函

Linux的静态函数库和动态函数库

一.在Linux中,有两种函数库,以*.so后缀命名的是动态函数库,以*.a后缀命名的是静态函数库 对于静态函数库:在编译链接时候,程序所需要的函数会从静态函数库中拷贝到执行文件中.当程序运行的时候,就不需要链接外部的函数库了. 对于动态函数库:在编译链接时,程序所需要的函数不会从动态函数库中拷贝出来,而是在程序运行的时候,才会将所需要的函数加载进来. 二.静态函数库 1.静态函数库是多个目标文件*.o的集合 2.可以使用ar命令(archiver)来生成.a文件 gcc -c part_a.c