服务公告 > Linux Glibc幽灵漏洞(CVE-2015-0235)修复方案

Linux Glibc幽灵漏洞(CVE-2015-0235)修复方案

2015-02-02

重要说明:

升级补丁可能会对业务产生影响,升级前请租户做好数据备份和兼容性测试工作。

升级补丁后系统需重新加载Glibc库才生效,建议完成补丁升级后重启操作系统,为了保证业务正常运转,请在非业务时间段进行,安排好业务切换时间。



一、概述

美国时间1月27日,安全公司qualys发现名为 “幽灵”(GHOST)的高危漏洞,该漏洞是Linux glibc库上出现的一个严重的安全问题,最严重情况下可以让攻击者在不了解系统的任何情况下远程获取操作系统的控制权限。漏洞编号CVE-2015-0235。

由于glibc为Linux操作系统基础库,影响范围广泛,漏洞等级定为严重。目前如redhat等部分linux操作系统已经发布针对漏洞的安全补丁,建议启动紧急漏洞修复工作,优先对DMZ区进行补丁安装。



二、详细信息

美国时间1月27日,安全公司qualys发现名为 “幽灵”(GHOST)的高危漏洞。漏洞利用Linux GNU C Library (glibc) 2.18之前的版本中gethostbyname 函数处理漏洞。最严重可导致远程执行代码,控制受影响系统。

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。glibc 囊括了几乎所有的 UNIX 通行的标准。glibc库中的__nss_hostname_digits_dots()函数中发现了一个缓冲区溢出的漏洞,这个bug可以经过 gethostbyname*()函数被本地或者远程的触发。应用程序主要使用gethostbyname*()函数发起DNS请求,这个函数会将主机名称转换为ip地址。Qualys公司已测试可成功利用漏洞,针对名为Exim的邮件系统服务测试,通过发送特殊构造的邮件,即可获得该邮件服务器的权限,从而控制该服务器。但目前并未透露有关利用细节。

部分已发布安全补丁的系统如下:

RedHat Enterprise Linux version 5: https://rhn.redhat.com/errata/RHSA-2015-0090.html

RedHat Enterprise Linux version 6 和7:https://rhn.redhat.com/errata/RHSA-2015-0092.html

SUSE LINUX Enterprise Server 11, X86-64:http://download.novell.com/Download?buildid=i9cYQde3lT8~

Ubintu: https://launchpad.net/ubuntu/+source/eglibc

Debian: https://security-tracker.debian.org/tracker/CVE-2015-0235

GNU C Library: http://www.gnu.org/software/libc/



三、修复方案

为了方便华为云的各位租户能及时修复漏洞,在此提供详细的漏洞修复操作流程。

3.1. 测试是否存在漏洞

(1)通过网上公开POC代码查看是否存在漏洞:

公开代码文件:

/* ghosttest.c: GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#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);
#>#

root登录系统,把以上代码存为ghost.c

编译文件:

#gcc ghost.c –o ghost

执行ghost测试是否存在漏洞:

#./ghost

如果出现vulnerable,表示存在漏洞;如果出现not vulnerable,表示不存在漏洞,无需进行补丁修复。


(2)查看版本,版本在Glibc 2.2 ~ Glibc 2.18范围内存在漏洞

CentOS:#rpm -qa|grep glibc

Ubuntu:dpkg -l|grep libc6


3.2. 升级补丁

3.2.1 Centos/RHEL/ 5,6

升级方法:

#yum update glibc

升级完后,建议重启服务器。下面方法可确定是否修复成功:

执行 #./ghost,如下图所示,表示升级成功。



3.2.2 ubuntu10.04、12.04

升级方法:

sudo apt-get update

sudo apt-get dist-upgrade

升级完后,建议重启服务器。下面方法可确定是否修复成功:

执行 #./ghost,如下图所示,表示升级成功。

华为云服务

2015-2-2