X
    Categories: News

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: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post