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