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 <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
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包效驗地址:
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 |