天天看点

glibc gethostbyname 缓冲区溢出漏洞 修复建议

包括linux不支持在线升级替换内核在内, 还有这个case, 还是不如aix啊.

http://www.ksyun.com/indexnotice/info/2015/2185.html#80b8ba67-599d-4f7d-a0e3-196dcc238f03

一、漏洞背景

代码审计公司qualys的研究人员在glibc库中的__nss_hostname_digits_dots()函数中发现了一个缓冲区溢出的漏洞,这个bug可以经过gethostbyname*()函数被本地或者远程的触发。

1)通过gethostbyname()函数或gethostbyname2()函数,将可能产生一个堆上的缓冲区溢出。经由gethostbyname_r()或gethostbyname2_r(),则会触发调用者提供的缓冲区溢出(理论上说,调用者提供的缓冲区可位于堆,栈,.data节和.bss节等。但是,我们实际操作时还没有看到这样的情况)。

2)漏洞产生时至多sizeof(char* )个字节可被覆盖(注意是char*指针的大小,即32位系统上为4个字节,64位系统为8个字节)。但是payload中只有数字( '0 '...' 9') ,点( “.”) ,和一个终止空字符('\0' ) 可用。

3)尽管有这些限制,我们依然可以执行任意的代码。

二、影响范围

该漏洞影响glibc库版本2.2-2.17的linux操作系统

操作系统类型包括

centos 6 & 7

debian 7

red hat enterprise linux 6 & 7

ubuntu 10.04 & 12.04

各linux发行版

三、漏洞测试

1、编译以下测试代码

测试结果:

glibc gethostbyname 缓冲区溢出漏洞 修复建议

四、漏洞修复

       更新是在glibc包中,但是这个库会被很多运行中的服务使用。在更新之后,每个服务都要重启一下。要找到所有依赖glibc的服务,请使用如下命令,它会显示所有打开的文件(lsof),然后找到引用glibc库的文件。

$ lsof | grep libc | awk '{print $1}' | sort | uniq

glibc gethostbyname 缓冲区溢出漏洞 修复建议

最安全的办法是重启所有你上面用lsof找到的服务。当然也可以重启服务器。建议如果机器或服务不是对外开放访问的, 还是别升glibc了。优先升级重启对外开放的服务器,如web和mail等等。

目前,debian和ubuntu,以及centos已经提供补丁更新,你可以通过如下方式升级。

debian/ubuntu升级方法:

#apt?-get update

#apt-get install libc6

rhel/centos升级方法:

#yum update glibc

如果有开放网络端口的服务太多, 还不如重启, 例如

#  lsof | grep libc | awk '{print $1}' | sort | uniq

abrtd

atd

auditd

automount

awk

bash

certmonge

crond

csvlog_up

cupsd

dbus-daem

grep

hald

hald-addo

hald-runn

init

irqbalanc

lsof

master

mcelog

mingetty

pickup

postgres

qmgr

rpcbind

rpc.statd

rsyslogd

sleep

snmpd

sort

sshd

udevd

uniq

xinetd

继续阅读