這次爆發出的漏洞,狀況有點麻煩,因為漏洞是在 Glibc Library,所以程式更新完後,還會需要整台重新開機才可以。
Linux Glibc GHOST 漏洞偵測、修補 CVE-2015-0235
此漏洞的原因、解釋可見此篇:Linux出現重大「鬼」漏洞!,下述摘錄自此篇:
Qualys漏洞實驗室總監Amol Sarwate表示,他們在glibc的 __nss_hostname_digits_dots() 功能中發現一個緩衝區溢位漏洞,只要是經由本機或遠端各種將網站名稱轉成IP位址的gethostbyname*() 功能就可觸發該漏洞,駭客可藉以掌控受駭系統,自遠端執行任何程式。由於此一漏洞是經由GetHOST功能觸發,因而被簡稱為GHOST。
Sarwate指出,他們已打造出一個概念驗證程式,傳遞一個特製的電子郵件至郵件伺服器,取得了進入Linux機器的遠端介面,成功繞過不論是32位元或64位元系統的各種保護機制。
CVE-2015-0235 影響範圍、偵測方法
下述整理自此篇:How To Patch and Protect Linux Server Against the Glibc GHOST Vulnerability # CVE-2015-0235
此漏洞會被輕易的取得 root 的權限。
影響的作業系統版本如下:
- RHEL (Red Hat Enterprise Linux) version 5.x, 6.x and 7.x
- CentOS Linux version 5.x, 6.x & 7.x
- Ubuntu Linux version 10.04, 12.04 LTS
- Debian Linux version 7.x
- Linux Mint version 13.0
- Fedora Linux version 19 or older
- SUSE Linux Enterprise 11 and older (also OpenSuse Linux 11 or older versions).
- SUSE Linux Enterprise Software Development Kit 11 SP3
- SUSE Linux Enterprise Server 11 SP3 for VMware
- SUSE Linux Enterprise Server 11 SP3
- SUSE Linux Enterprise Server 11 SP2 LTSS
- SUSE Linux Enterprise Server 11 SP1 LTSS
- SUSE Linux Enterprise Server 10 SP4 LTSS
- SUSE Linux Enterprise Desktop 11 SP3
- Arch Linux glibc version <= 2.18-1
CVE-2015-0235 檢測方式 與 步驟
$ ldd --version # 小於 2.19 的都要注意 (文章列的有問題版本有 RHEL / CentOS 2.12, Ubuntu 2.13, Debian 2.15)
註:CentOS 更新過後版本也是 2.12,這個版本只能當參考,請以下述程式驗證為主
下述程式可以直接正確驗證,需要到每台機器 compile 再執行才有效。
- $ vim ghosttest.c # 貼入下述程式
/* 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); }
- $ gcc ghosttest.c -o ghosttest
- $ ./ghosttest
- 出現 not vulnerable 就是正常 (更新完 Library 就會出現此訊息,但是機器還是需要重新開機)
- 出現 vulnerable 就是有問題,需要修正
列出哪些程式使用到 Glibc
- lsof | grep libc | awk '{print $1}' | sort | uniq
CVE-2015-0235 修正方式
在此只記錄 Debian 與 Ubuntu Linux 的修正方式,步驟如下:
- sudo apt-get upate
- sudo apt-get upgrade
- ldd --version # 看看版本是否有更新
- 上述 ghosttest.c 一樣重新 compile + 執行 確認,確認都正確無誤
- sudo reboot # 重新開機完成才真正完成修復