下午正趴着睡觉突然收到主机商那边的短信说有这个漏洞,着手处理了下,本人不涉黑所以就不去研究具体了,这里指说检测和解决方案。

检测方法

检测漏洞的C代码,网上流传的几个都是符号出了问题的,蛋疼,我自己去找到了原始的:

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

将上面这段代码,保存为test.c

随后,用gcc编译: gcc test.c -o test

执行编译好的test文件: ./test

若出现vulnerable字样,恭喜,你的主机有漏洞。 出现should not happen则说明本次漏洞与你无关,出现not vulnerable说明已经修复啦。

修复方案

Centos

循例使用万能的yum,先打yum clean all,后打yum update glibc,升级的版本号为2.12-1.149.el6_6.5就基本没错了(centos6),升级好记的重新用刚刚的test检测一遍。

以上命令执行完成后, 查看Glibc版本:rpm –qa|grep glibc-2.12

OS版本 === 对应Glibc版本

CentOS6.x/redhat6.x === glibc-2.12-1.149.el6_6.5

CentOS5.x/redhat5.x === glibc-2.5-123.el5_11.1

Ubuntu

执行下面2句:

apt-get update

apt-get install libc6

执行完成以后,查看版本, 输出如下表示更新完成:

root@VM-ubuntu:~# dpkg-l|grep libc6

OS版本 === 对应Glibc版本

Ubuntu12.x === 2.15-0ubuntu10.10

Ubuntu14.x === 2.19-0ubuntu6

Ubuntu10.x === 2.11.1-0ubuntu7.20