代码审计公司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"命令会打断旧的动态库链接,改为指向新的库文件。在这个过程中,不同的链接指向新旧不同版本的库文件,很容易导致系统崩溃,崩溃后,一般是无法重新启动的。
该漏洞影响glibc库版本2.2-2.17的Linux操作系统
操作系统类型包括
CentOS 6 & 7
Debian 7
Red Hat Enterprise Linux 6 & 7
Ubuntu 10.04 & 12.04
各Linux发行版
复制下面代码,文件保存为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("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
更新是在glibc包中,但是这个库会被很多运行中的服务使用。在更新之后,每个服务都要重启一下。要找到所有依赖glibc的服务,请使用如下命令,它会显示所有打开的文件(lsof),然后找到引用glibc库的文件。
lsof | grep libc | awk '{print $1}' | sort | uniq
最安全的办法是重启所有上面用lsof找到的服务。也可以重启服务器。
建议CentOS在线更新,优先升级对外开放的服务器。
CentOS 5.4 与 6.3 网络源
公司系统环境主要是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 |