Linux Glibc GHOST 漏洞偵測、修補 CVE-2015-0235

這次爆發出的漏洞,狀況有點麻煩,因為漏洞是在 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 再執行才有效。

  1. $ 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);
    }
  2. $ gcc ghosttest.c -o ghosttest
  3. $ ./ghosttest
    • 出現 not vulnerable 就是正常 (更新完 Library 就會出現此訊息,但是機器還是需要重新開機)
    • 出現 vulnerable 就是有問題,需要修正

列出哪些程式使用到 Glibc

  • lsof | grep libc | awk '{print $1}' | sort | uniq

CVE-2015-0235 修正方式

在此只記錄 Debian 與 Ubuntu Linux 的修正方式,步驟如下:

  1. sudo apt-get upate
  2. sudo apt-get upgrade
  3. ldd --version # 看看版本是否有更新
  4. 上述 ghosttest.c 一樣重新 compile + 執行 確認,確認都正確無誤
  5. sudo reboot # 重新開機完成才真正完成修復

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Linux Glibc GHOST 漏洞偵測、修補 CVE-2015-0235〉中有 5 則留言

  1. 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.

    1. 嗯嗯,只要能確定使用 Glibc Library 的程式都可以 restart 重新載入,就可以不用重新開機。

      但是要確認這些,或者直接砍掉 init 重新啟動... 等等的比起來,重新開機算是風險最小的,也是最省事的選項,我是建議寧可花個幾分鐘讓他重新啟動,比較安心~

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料