首页 > 代码库 > glibc升级小记

glibc升级小记

2015年元月最后几天,glibc幽灵漏洞来袭,引用 中华财经网的报道 稍做介绍:

Linux glibc函数库日前曝出名为GHOST(幽灵)的高危漏洞,漏洞编号是CVE-2015-0235。攻击者可利用此漏洞实施远程攻击,并完全控制目标系统。据360网络攻防实验室介绍,各大Linux发行商已经发布漏洞补丁,提醒企业网管做好服务器的安全更新。Glibc是GNU发布的libc库,即c运行库。它是Linux系统中最底层的API,几乎其它任何运行库都会依赖于glibc。glibc除了封装Linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。国外安全研究人员发现,glibc的__nss_hostname_digits_dots()函数有缓冲区溢出漏洞。这一漏洞既可以本地利用,也可以远程利用。研究人员对漏洞进行了测试验证:向目标邮件服务器发送特别构造的邮件,从而获得了远程登录Linxu系统的shell脚本。通过这种方式可以绕过32位和64位系统上的所有现存保护机制(比如SSLR、PIE和NX)。受glibc-2.2影响的GNU C函数最早版本是在2000年11月发布的。这一漏洞曾在2013年5月被修补(在glibc-2.17 和glibc-2.18版本之间)。但由于当时并没有被认定为安全威胁,包括Debian 7、Red Hat Enterprise Linux 6 & 7、 CentOS 6 & 7和Ubuntu 12.04在内的多数知名Linux版本在长达一年半的时间都没有修补幽灵漏洞。据360网络攻防实验室的安全专家介绍,Linux glibc幽灵漏洞最容易的攻击入口是邮件服务器,和存在SSRF(Server-side Request Forgery)漏洞的WEB接口。值得庆幸的是,此漏洞目前还没有公开通用的攻击代码,这也给了服务器管理员们及时安装补丁的宝贵时间。目前Debian 、Red Hat Enterprise Linux、 CentOS和Ubuntu等Linux发行商已发布了漏洞补丁,用户只需要根据各发行版的安全公告升级glibc就可以修补漏洞,避免受到黑客的幽灵攻击。

 

两天后,各大牛纷纷推出了自己的bug修复脚本,这里我借用turnkeylinux的博客做相关业务服务器的更新:

1. 测试代码 ghosttest.c 

/* ghosttest.c: GHOST vulnerability tester *//* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */#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);}

 

编译ghosttest.c生成可执行文件ghosttest

#gcc -o ghosttest ghosttest.c

2. 升级脚本 update.sh

#!/bin/bashupdate_log="/root/glibc_update.log"rpm -qa | grep glibc >> $update_logyum clean all >> $update_logyum -y update glibc >> $update_logcd /tmp/chmod 700 /tmp/ghosttest./ghosttest >> $update_log./ghosttestrm /tmp/ghosttest/etc/init.d/crond restart >> $update_log/etc/init.d/rsyslog restart >> $update_log/etc/init.d/acpid restart >> $update_log/etc/init.d/sshd restart >> $update_log

 

3. 后续操作就是重启业务服务,balabala ^_^

后记:

内网一台服务由于安装失误,导致在磁盘的开始位置写了两个引导分区,故而每次重启机器都引导出错,报错信息如下:

技术分享

报错信息解释一下:系统引导获取grub.conf指定的img文件,img文件指定的磁盘分区表已经失效,故而每次重启都因找不到对应的磁盘分区而失败。

解决方案:用光盘启动,执行 grub-install --root-directory=/boot /dev/sda

 

glibc升级小记