操作系统

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

Jager · 1月29日 · 2015年 · · · 2531次已读

这几天复习运维知识,也没怎么关注业界新闻,可等我一关注,又“捅娄子”了,Linux继上次CVE-2014-6271漏洞爆发以来,再次爆发一个严重漏洞:CVE-2015-0235-Linux glibc高危漏洞,正在使用Linux系统的个人或企业,看到消息请立即修复!

下面是我转载的检测和修复方法,我个人服务器Centos 6.5已成功修复:


一、漏洞概述

2015/01/28【CVE 2015-0235: GNU glibc gethostbyname 缓冲区溢出漏洞 】全面爆发,该漏洞的产生是Qualys公司在进行内部代码审核时,发现了一个在GNU C库(glibc)中存在的__nss_hostname_digits_dots函数导致的缓冲区溢出漏洞。这个bug可以通过gethostbyname *()函数来触发,本地和远程均可行。该漏洞(幽灵漏洞)造成了远程代码执行,攻击者可以利用此漏洞远程获取系统进程当前的权限。

幽灵漏洞是Linux glibc库上出现的一个严重的安全问题,他可以让攻击者在不了解系统的任何情况下远程获取操作系统的控制权限。目前他的CVE编号为CVE-2015-0235。

什么是glibc

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。glibc 囊括了几乎所有的 UNIX 通行的标准。

出现了什么漏洞

代码审计公司Qualys的研究人员在glibc库中的__nss_hostname_digits_dots()函数中发现了一个缓冲区溢出的漏洞,这个bug可以经过 gethostbyname*()函数被本地或者远程的触发。应用程序主要使用gethostbyname*()函数发起DNS请求,这个函数会将主机名称转换为ip地址。

更多的细节可以从下面的视频中看到(一堆鸟语,听不懂):

漏洞危害

这个漏洞造成了远程代码执行,攻击者可以利用此漏洞获取系统的完全控制权。

漏洞证明

在我们的测试中,我们编写了一个POC,当我们发送一封精心构造的电子邮件给服务器后,我们便可以获得远程Linux服务器的shell,这绕过了目前在32位和64位系统的所有保护(如ASLR,PIE和NX)。

我们能做什么?

给操作系统及时打补丁,我们(Qualys)已与Linux发行商紧密合作,会及时发布补丁。

为什么叫做GHOST?

因为他通过GetHOST函数触发。

哪些版本和操作系统受影响?

第一个受影响的版本是GNU C库的glibc-2.2,2000年11月10号发布。我们已找出多种可以减轻漏洞的方式。我们发现他在2013年5月21号(在glibc-2.17和glibc-2.18发布之间)已经修复。不幸的是他们不认为这是个安全漏洞。从而导致许多稳定版本和长期版本暴露在外,其中包括Debian 7 (wheezy),Red Hat Enterprise,Linux 6 & 7,CentOS 6 & 7,Ubuntu 12.04等。

以上内容摘自:360安全播报平台

二、检测方法

检测方法1【RedHat官方检测方法】:

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

ghost_check.sh源码(张戈亲测:推荐使用这种方法来测试更加准确!):

#!/bin/bash
vercomp () {
if [[ $1 == $2 ]]
then
return 0
fi
local IFS=.
local i ver1=($1) ver2=($2)
    # fill empty fields in ver1 with zeros
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
do
ver1[i]=0
done
    for ((i=0; i<${#ver1[@]}; i++))
do
if [[ -z ${ver2[i]} ]]
then
            # fill empty fields in ver2 with zeros
ver2[i]=0
fi
        if ((10#${ver1[i]} > 10#${ver2[i]}))
then
return 1
fi
        if ((10#${ver1[i]} < 10#${ver2[i]}))
then
return 2
fi
done
return 0
}
 
glibc_vulnerable_version=2.17
glibc_vulnerable_revision=54
glibc_vulnerable_version2=2.5
glibc_vulnerable_revision2=122
glibc_vulnerable_version3=2.12
glibc_vulnerable_revision3=148
echo "Vulnerable glibc version <=" $glibc_vulnerable_version"-"$glibc_vulnerable_revision
echo "Vulnerable glibc version <=" $glibc_vulnerable_version2"-"$glibc_vulnerable_revision2
echo "Vulnerable glibc version <=" $glibc_vulnerable_version3"-1."$glibc_vulnerable_revision3
 
glibc_version=$(rpm -q glibc | awk -F"[-.]" '{print $2"."$3}' | sort -u)
if [[ $glibc_version == $glibc_vulnerable_version3 ]]
then
glibc_revision=$(rpm -q glibc | awk -F"[-.]" '{print $5}' | sort -u)
else
glibc_revision=$(rpm -q glibc | awk -F"[-.]" '{print $4}' | sort -u)
fi
echo "Detected glibc version" $glibc_version" revision "$glibc_revision
 
vulnerable_text=$"This system is vulnerable to CVE-2015-0235. <https://access.redhat.com/security/cve/CVE-2015-0235>
Update the glibc and ncsd packages on your system using the packages released with the following:
yum install glibc"
 
if [[ $glibc_version == $glibc_vulnerable_version ]]
then
vercomp $glibc_vulnerable_revision $glibc_revision
elif [[ $glibc_version == $glibc_vulnerable_version2 ]]
then
vercomp $glibc_vulnerable_revision2 $glibc_revision
elif [[ $glibc_version == $glibc_vulnerable_version3 ]]
then
vercomp $glibc_vulnerable_revision3 $glibc_revision
else
vercomp $glibc_vulnerable_version $glibc_version
fi
 
case $? in
    0) echo "$vulnerable_text";;
    1) echo "$vulnerable_text";;
    2) echo "Not Vulnerable.";;
esac

检测方法2【简单的检测方法】:

/usr/sbin/clockdiff `python -c "print '0' * $((0x10000-16*1-2*4-1-4))"`

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

检测方法3【二进制检测方法】:

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

ghost.c源码:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
#define CANARY "in_the_coal_mine"
 
struct {
char buffer[1024];
char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };
 
int main(void) {
struct hostent resbuf;
struct hostent *result;
int herrno;
int retval;
 
  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
char name[sizeof(temp.buffer)];
memset(name, '0', len);
name[len] = '\0';
 
retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
 
if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
exit(EXIT_SUCCESS);
}
if (retval == ERANGE) {
    puts("not vulnerable");
exit(EXIT_SUCCESS);
}
  puts("should not happen");
exit(EXIT_FAILURE);
}

三、修复方法

①、在线修复方案

CentOS, Red Hat, Fedora等系列衍生版本(RHN建议):

yum update glibc

Debian, Ubuntu等系列衍生版本:

apt-get clean && apt-get update && apt-get upgrade

②、离线修复方案

I. Centos6.5离线补丁

先检查本地glibc包安装了哪些相关包

rpm -qa|grep glibc

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

然后,到阿里源下载对应版本

cd /usr/local/src
cat > update.txt << EOF
http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm
http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm    
http://mirrors.aliyun.com/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
EOF

进行后台断点下载补丁包

wget -b -i update.txt -c

使用yum本地安装

yum localinstall glibc-*

或是rpm安装

rpm -ivUh glibc-*

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

II. Red Had系列衍生版本

使用方法:参考上文【Centos6.5离线补丁】的修补方法。

离线包下载地址:

http://mirrors.aliyun.com/centos/7/updates/x86_64/Packages/glibc-2.17-55.el7_0.5.i686.rpm

http://mirrors.aliyun.com/centos/7/updates/x86_64/Packages/glibc-2.17-55.el7_0.5.x86_64.rpm

四、修复检测

①、ghost_check.sh脚本检测

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

②、ghost.c脚本检测

CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

注意:打好补丁后必须立即重启操作系统,否则会造成应用业务无法使用。

五、参考来源

redhat官方:https://access.redhat.com/articles/1332213

redhat官方补丁介绍:

https://rhn.redhat.com/errata/RHSA-2015-0090.html

https://rhn.redhat.com/errata/RHSA-2015-0092.html

ubuntu官方补丁介绍: http://www.ubuntu.com/usn/usn-2485-1/

14 条回应
  1. 必分享 2015-1-29 · 23:56

    不会是每个系统都会有这个吧,那我是不是得马上修复。

    • Jager 2015-1-30 · 10:16

      2000年发行以来的版本应该都有,修复也不难,赶紧修复重启下。

      • 沃主题商店 2015-1-30 · 21:14

        额,是直接重启就修复了,不用yum安装?

  2. 动漫资讯 2015-1-30 · 11:02

    博主的博客越来越完美了啊

  3. 小武 2015-1-30 · 16:24

    收到阿里云的邮件了,提示的就是这个漏洞。。

  4. 沃主题商店 2015-1-30 · 21:13

    O(∩_∩)O哈哈~

    刚收到阿里云的短信,信号是centos ,直接yum安装

  5. 厦门微信营销 2015-1-31 · 16:55

    支持支持!!

  6. 梦想网络 2015-1-31 · 23:39

    好久没来了,过来冒泡。。

  7. 艾博 2015-2-3 · 18:36

    内页还可以访问

    • Jager 2015-2-4 · 12:58

      转入阿里云备案中

  8. 社新社 2015-2-13 · 0:03

    博客终于打开了。

  9. 清知枫 2015-2-13 · 12:07

    tomcat也爆漏洞了,官方给的方法也是升级到最新版本,坑啊,还不知道新版本稳定不!

  10. 自动化运维 2015-2-16 · 14:48

    需要之,写的不错,请求加友链

  11. 日本高速主机 2015-2-21 · 20:33

    我是来拜年的!