1. 漏洞背景

代码审计公司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 是需要小心考虑的事情,因为整个系统几乎所有应用程序都依赖于原有的动态库,升级的时候,执行"make install"命令会打断旧的动态库链接,改为指向新的库文件。在这个过程中,不同的链接指向新旧不同版本的库文件,很容易导致系统崩溃,崩溃后,一般是无法重新启动的。

 

2. 影响范围

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

操作系统类型包括

CentOS 6 & 7

Debian 7

Red Hat Enterprise Linux 6 & 7

Ubuntu 10.04 & 12.04

各Linux发行版

 

3. 漏洞测试

复制下面代码,文件保存为ghost.c

 

#include
#include
#include
#include
#include
#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("notvulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should nothappen");
  exit(EXIT_FAILURE);
}

生成可执行文件

gcc -o ghost ghost.c

 

 

[root@SX_GH_HA_Master ~]# ./ghost 

vulnerable

 

[root@zh_uat_s2 ~]# ./ghost 

notvulnerable

4. 漏洞修复

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

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

最安全的办法是重启所有上面用lsof找到的服务。也可以重启服务器。

 

建议CentOS在线更新,优先升级对外开放的服务器

 

CentOS  5.4 与 6.3 网络源  

 

5. RPM效验及来源

公司系统环境主要是Centos 5.4  Centos 6.3,

RPMrpm包来至于 http://centos.ustc.edu.cn/centos

Centos 5.4  RPM地址:

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-2.5-123.el5_11.1.i686.rpm  

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-2.5-123.el5_11.1.x86_64.rpm   

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-common-2.5-123.el5_11.1.x86_64.rpm  

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-devel-2.5-123.el5_11.1.i386.rpm   

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-devel-2.5-123.el5_11.1.x86_64.rpm 

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/glibc-headers-2.5-123.el5_11.1.x86_64.rpm 

http://centos.ustc.edu.cn/centos/5/updates/x86_64/RPMS/nscd-2.5-123.el5_11.1.x86_64.rpm 

 

 

RPM-GPG-KEY-CentOS-5 地址:

http://centos.ustc.edu.cn/centos/5/os/x86_64/RPM-GPG-KEY-CentOS-5

 

RPM包效验地址:

http://centos.ustc.edu.cn/centos/5/updates/x86_64/repodata/primary.xml.gz 

 

RPM包效验结果:

RPM效验命令sha1sum  filename

1544cd586e3ea438965655e1206dc561cf97b89c  glibc-2.5-123.el5_11.1.i686.rpm

903af817355afe728b4b4e13e89ef9e896d690ea  glibc-2.5-123.el5_11.1.x86_64.rpm

3c08d80ab9cc1b6e78ca1cc18d30f672af4331ab  glibc-common-2.5-123.el5_11.1.x86_64.rpm

c4a7fb23ac797b42a5f5ac37ed0e0124eafd7148  glibc-devel-2.5-123.el5_11.1.i386.rpm

881ae969d80d13e774e399dc29108a1d9d8ea7a9  glibc-devel-2.5-123.el5_11.1.x86_64.rpm

963094727f64ab20f9160f2f01429a5f35f12b1a  glibc-headers-2.5-123.el5_11.1.x86_64.rpm

62ca97bab165ee1274ec8c8cfdb937d7002f626f  nscd-2.5-123.el5_11.1.x86_64.rpm

 

RPMrpm包来至于 http://centos.ustc.edu.cn/centos

Centos 6.3  RPM地址:

http://centos.ustc.edu.cn/centos/6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm

http://centos.ustc.edu.cn/centos/6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm

http://centos.ustc.edu.cn/centos/6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm

http://centos.ustc.edu.cn/centos/6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm

 

RPM-GPG-KEY-CentOS-6 地址:

http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-6

 

RPM包效验地址:

http://centos.ustc.edu.cn/centos/6/updates/x86_64/repodata/ed26499d2521d874041a3a530613ade08ee2cc9a825860de667d7eb22773c415-primary.xml.gz

RPM包效验结果:

RPM效验命令sha256sum  filename

51df53cceee0f4a7c1cbbc4cea8aecb1910eb1232592e330b6fe467eb2d7b5b5  glibc-2.12-1.149.el6_6.5.x86_64.rpm

65285684336366a98c5ac3c33982c0ccd0d5291563faea655b5fc6f47e8cfa63  glibc-common-2.12-1.149.el6_6.5.x86_64.rpm

b6feecfbc9fbb10259c61ab60d7414d5a70c0cdef553fb2a4f14b7468e664160  glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm

803fa33d7f62d944b019a644d1f3b0ec9f9e8aa67fde4c905cd7000939a1f872  glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm