Site icon Mr. 沙先生

Linux 重大漏洞 GHOST-Glibc CVE-2015-0235

每次只要又爆發重大漏洞鬧得沸沸騰騰,我們技術部門又要出動去東補補西補補,這次發生的是被稱為 GHOST (GetHOST) 位於 glibc liberary 中的漏洞

 

這次是由 Qualys漏洞實驗室在 glibc 的 __nss_hostname_digits_dots() 發現的 緩衝區溢位漏洞

 

glibc 是被廣泛使用的 C語言函式庫,重要的是他是 Linux OS 的重要元件。

由於這又是一個可以取得 root 權限的漏洞,而且影響範圍之大,最重要的一點就是在 2013年3月以前安裝的 OS版本都還是有 GHOST 漏洞!

 

有被警告的 Linux OS 版本

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

 

 

檢測

在國外有一份針對 GHOST 檢測的一篇文章

How To Patch and Protect Linux Server Against the Glibc GHOST Vulnerability # CVE-2015-0235

 

1. 檢測版本

被告知有問題的版本有 RHEL / CentOS 2.12, Ubuntu 2.13, Debian 2.15

$ ldd --version

 

 

2. 製作 compile C程式檢測

$ 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);
}

 

編譯 ghosttest.c 你會得到一支 ghosttest 執行檔

$ gcc ghosttest.c -o ghosttest
$ ./ghosttest

vulnerable

執行 ghosttest 會出現 not vulnerable (已修正) / vulnerable (未修正)

 

※切記若是更新完版本必須重新開機

 

3. 列出有使用 glibc 的程式

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

anvil
auditd
auth
awk
bash
config
crond
dovecot
grep
httpd
init
log
lsof
master
mingetty
mysqld
mysqld_sa
pickup
pptpd
qmgr
rsyslogd
saslauthd
sort
sshd
ssl-param
sudo
tlsmgr
udevd
uniq

好啦~~常用的都中了,更新一下吧!!

 

CentOS

$ yum update glibc
$ reboot

 

Ubuntu

$ sudo apt-get update
$ sudo apt-get glibc
$ sudo reboot

 

Exit mobile version