下午正趴着睡觉突然收到主机商那边的短信说有这个漏洞,着手处理了下,本人不涉黑所以就不去研究具体了,这里指说检测和解决方案。
检测方法
检测漏洞的C代码,网上流传的几个都是符号出了问题的,蛋疼,我自己去找到了原始的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#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