首页 >> 网络安全 >> 正文

glibc幽灵漏洞分析

作者: 发布日期:2015-04-08 点击次数:

一、 概述

Linux系统中的GNU C库(glibc)被爆出存在一个缓冲区溢出漏洞,可能导致本地及远程执行任意代码。该漏洞是Qualys公司的研究人员在对glibc做代码审计的过程中发现的。由于漏洞可以通过glibc中的 gethostbyname*()函数来利用,所以被命名为Ghost漏洞,中文名字叫幽灵漏洞。这个漏洞影响当前大部分的linux系统。

二、 漏洞编号

CVE-2015-0235

三、影响范围

Glibc<=2.17

漏洞从2000年发布glibc-2.2版本中就存在,到2013年5月份21日得到了修补(在2.17至2.18之间发行的版本),但是由于开发者并未将其定义为安全漏洞,导致系统中自带的稳定发行版本并未得到及时的升级。

四、 详细信息

(1) 漏洞详情

漏洞存在于glibc库 _nss_hostname_digits_dots函数中,该函数用于校验主机名是否IPv4或IPv6地址,如果是则跳过DNS查询以加快程序的运行速度。__nss_hostname_digits_dots函数中定义了HOST_ADDR,h_addr_ptrs,h_alias_ptr ,和hostname四个实体的存储指针,但是在计算存储缓冲区大小时仅计算了HOST_ADDR,h_addr_ptrs和name(hostname)漏掉了计算h_alias_ptr的大小,这导致之后的strcpy(hostname,name)操作可能存在缓冲溢出的可能。这个漏洞可以通过glibc库中的gethostbyname *()函数来触发。由于能用的缓冲溢出参数为hostname,导致缓冲区能被覆盖的位数为32位系统上4个字节,64位系统8个字节,并且相关参数需要满足如下条件:

(a)它的第一个字符必须是数字。

(b)它的最后一个字符不能是点 “.”。

(c)它必须只包含数字和点。

(d)它必须足够长以溢出缓冲区。例如,非重入的gethostbyname *()函数最开始就会通过调用malloc (1024)来分配自己的缓冲区 (申请“1 KB”) 。

(e)地址必须成功地解析为IPv4地址或作为inet_pton IPv6地址。

(2) 验证方法

方法一:您可以通过如下命令来查看系统上的glibc版本:

ldd –version

方法二:Qualys公司提供如下的测试程序来检查系统是否存在漏洞:Ghost.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);

}

将上述程序保存为ghost.c并执行下列命令:

gcc ghost.c –o ghost

./ghost

如果运行后显示

Vulnerable (表示存在漏洞)

Not vulnerable (表示不存在漏洞)

(3) 风险评估

系统中有诸多的服务调用了glibc库中的gethostbyname *()函数,由于漏洞利用有诸多的限制,并不是所有调用了这些函数的服务(如ping、arping 、mount.nfs、mtr)都可以利用,但是依然有部分的服务(如clockdiff、procmail、ms-dns、pppd等)可以被本地及远程利用。

目前Qualys公司已经实现了对Exim SMTP邮件服务器的远程攻击,只需向服务器发送一封特制的电子邮件就行!

五、 安全建议

(1) 补丁更新

升级系统上glibc库版本,方法如下:

Readhat/Centos系统执行如下命令

yum update glibc

Debian/ubuntu系统执行如下命令

apt-get update glibc

由于glibc是众多服务的基础支持库,在更新glibc后需要重新启动才能保证相关服务的正常运行,你可以通过重新启动系统来保证相关服务正常运行,如果您的系统无法重启,你可以通过下面的命令来确认需要glibc库支持服务,并逐一重启这些服务,命令如下:

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

版权所有 © 2015 成都大学信息网络中心
网络运维部 (028) 84616789 信息技术部 (028) 84616912 办公室 (028) 84616000

Email:nic@cdu.edu.cn    地址:4教4216