Linux glibc幽灵漏洞检测及修复方案

2015-01-30


        1月28日,Linux glibc库曝出高危缓冲区溢出漏洞GHOST(幽灵),漏洞CVE编号为CVE-2015-0235,通过该漏洞,攻击者可以远程获取linux服务器的最高控制权限。glibc是linux系统中最底层的API,几乎其它运行库都会依赖于glibc,因此该漏洞的危害巨大,众多linux发行版本将受影响。漏洞发现者已经利用该漏洞,成功远程获取了一台邮件服务器的最高权限,并称该漏洞将会有更大的影响,Redhat在昨日发布的紧急安全通告里,也将该漏洞定义为“高危”。


         鉴于网上诸多glibc的原理普及,本文章就不多啰嗦了,直接实践如何检测服务器是否存在该漏洞,以及修复漏洞的方法。


影响范围


该漏洞影响glibc库版本2.2-2.17的Linux操作系统


操作系统类型包括:


CentOS 6 & 7


Debian 7


Red Hat Enterprise Linux 6 & 7


Ubuntu 10.04 & 12.04


各Linux发行版


漏洞测试


一、编译以下测试代码

1. #include

2. #include

3. #include

4. #include

5. #include

6.

7. #define CANARY "in_the_coal_mine"

8.

9. struct {

10. char buffer[1024];

11. char canary[sizeof(CANARY)];

12. } temp = { "buffer", CANARY };

13.

14. int main(void) {

15. struct hostent resbuf;

16. struct hostent *result;

17. int herrno;

18. int retval;

19.

20. /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/

21. size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;

22. char name[sizeof(temp.buffer)];

23. memset(name, '0', len);

24. name[len] = '\0';

25.

26. retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

27.

28. if (strcmp(temp.canary, CANARY) != 0) {

29. puts("vulnerable");

30. exit(EXIT_SUCCESS);

31. }

32. if (retval == ERANGE) {

33. puts("not vulnerable");

34. exit(EXIT_SUCCESS);

35. }

36. puts("should not happen");

37. exit(EXIT_FAILURE);

38. }


二、然后在服务器上执行:


gcc gistfile1.c -o CVE-2015-0235


./CVE-2015-0235


如果提示:vulnerable 就说明存在漏洞。


修复方案

CentOS, Red Hat, Fedora等系列衍生版本(RHN建议):

yum install glibc


Debian, Ubuntu等系列衍生版本:

apt-get clean && apt-get update && apt-get upgrade

注意:打好补丁后必须立即重启操作系统,否则会造成应用业务无法使用。