這次爆發出的漏洞,狀況有點麻煩,因為漏洞是在 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 # 重新開機完成才真正完成修復
試過根據這篇更新了 glibc 後, compile的程式就幾成not vulnerable。但 ldd --version 仍然是 2.12,不太確定 ldd --version 是不是一個正確的檢查方法。
http://lists.centos.org/pipermail/centos-announce/2015-January/020907.html
嗯嗯,那應該是文章列的那些版本有問題而已,感謝指正,我來修改一下
reboot也不是必要, 請參考以下網頁:
http://www.cyberciti.biz/faq/cve-2015-0235-patch-ghost-on-debian-ubuntu-fedora-centos-rhel-linux/
其中有人提到:
Torbjørn January 28, 2015 at 11:36 pm
It’s not really necessary to reboot, as long as you make sure to restart all affected services so that they no longer use the old version of libc.
I just did it on my server, all you need to do (you also need to be root) after upgrading is:
lsof | grep libc | grep DEL
Then, go through the list and restart all the services/programs you see.
Some of them you may need to kill manually (the ones that don’t have scripts in /etc/init.d/) – e.g. getty [run ‘init q’ to restart it and get your consoles back], and processes like bash and sshd won’t end until you log out…
That said – unless your server is doing something important that shouldn’t be interrupted, a reboot is probably a much quicker and easier solution.
嗯嗯,只要能確定使用 Glibc Library 的程式都可以 restart 重新載入,就可以不用重新開機。
但是要確認這些,或者直接砍掉 init 重新啟動... 等等的比起來,重新開機算是風險最小的,也是最省事的選項,我是建議寧可花個幾分鐘讓他重新啟動,比較安心~