分类目录归档:系统安全

glibc CVE-2015-7547 漏洞

开源安全研究团队披露了Glibc getaddrinfo溢出漏洞,该漏洞影响范围较大,涉及当前主要的Linux发行版。据Google 博客中所述,该漏洞应该是可以绕过内存防护技术,从而形成代码执行漏洞。
以下版本均受影响

漏洞危害
Glibc组件包含了大量标准库,这些标准库会被众多的程序调用。其中 libresolv库用来实现主机名与IP地址之间转换的功能。作为glibc包含的组件之一,nss_dns模块通过libresolv库进行DNS查询,从而实现Name Service Switch(NSS)服务。
Libresolv库中的代码在执行A/AAAA 双重DNS查询时会触发基于堆栈的缓冲区溢出漏洞。远程攻击者可以通过创建特殊的DNS响应,造成libresolv崩溃或有可能以运行库用户的身份和权限执行代码;调用函数send_dg(UDP查询)和send_vc(TCP查询)时会触发缓冲区溢出。
漏洞分析
通过对安全漏洞进行分析,glibc通过alloca函数在堆栈中保有2048字节。响应DNS查询请求的函数为_nss_dns_gethostbyname4_r,然后继续调用send_dg和send_vc两个函数。如果响应大于2048字节,就会从堆栈分配一个新的缓冲区并更新所有的信息,包括缓冲区指针、新的缓冲区大小和响应包大小。在某些情况下,这一过程会造成堆栈缓冲之间的不匹配,并会再次分配新的堆栈。最终导致堆栈缓冲将全部被用于存储DNS响应,所以该行为会导致堆栈缓冲的溢出。
验证方法

DNS 解析为 127.0.0.1

1 重启服务

2 执行操作

另一个终端执行./CVE-2015-7547-client ,若含有漏洞,会造成Segmentation Fault。

采取措施:
el7 更新地址

el6 更新地址

参考:

升级后:使用

查看是否使用新的glibc。

OpenSSL 安全漏洞 CVE-2015-1793

OpenSSL 1.0.2d 和 OpenSSL 1.0.1p 发布,修复了一个安全问题(CVE-2015-1793)。安全级别:高影响的版本:OpenSSL 1.0.2c, 1.0.2b, 1.0.1n 和 1.0.1o。
详见描述:
2015.07.09, Version 0.10.40 (Maintenance)

openssl: upgrade to 1.0.1p (CVE-2015-1793)
V8: back-port JitCodeEvent patch from upstream (Ben Noordhuis)
win,msi: create npm folder in AppData directory (Steven Rockarts)

glibc 幽灵漏洞 分析 (CVE-2015-0235)

1 据Qualys公司审核发现GUN C库(glibc)中存在一个__nss_hostname_digits_dots的缓冲区溢出漏洞,信息来源

==1== summary

__nss_hostname_digits_dots()导致的缓冲区溢出漏洞,这个bug可以通过gethostbynames*()函数来触发。在本地和远程均可以触发bug。
分析过程如下:
– 通过gethostbyname()or gethostbyname2(),缓冲区溢出将发生在堆(heap)上,通过gethostbyname_r()or gethostbyname2_4()触发调用者提供(caller-supplied)的缓冲区
溢出(调用者提供的缓冲区可以位于heap,stack,.data,.bss.etc,但实际操作中还未发现这样的情况)
– 漏洞产生时多个sizeof(char *)bytes被重写(注意 char*指针的大小,4bytes on32-bit系统上,8 bytes on 64-bit系统上)
。字节会被重写只有在(’0′…’9′),(‘.’),(‘\0′)
–尽管有这些限制,但我们可以随意的执行代码。作为概念的证明,我们开发了针对Exima邮件服务器的full-fledged远程执行脚本,发现可以旁路绕过所有现有的保护(ASLR,PIE,NX),
在32-bit or 64-bit机器上。
– 第一个容易被攻击的版本为GNU C库的glibc-2.2版本。
– 针对这些bug的研究,发现该漏洞在2013/5/21就已经在glib-2.17-glibc2.18版本之间被修复,但不幸的是,当时并没有被认为是一个安全威胁存在。受影响版本可能为:

==2== Analysis:

存在漏洞的__nss_hostname_digits_dots()是有glibc的不可重入的nss/getXXbyYY.c以及可重入的nss/getXXbyYY_r.c调用。而这个调用由ifdef HANDLE_DIGITS_DOTS来定义的。该定义分
布在以下几个文件中

以上的文件是实现gethostbyname*() family。因此也只有他们会调用reach __nss_hostname_digits_dots(),并触发缓冲区溢出。该函数作用是如果主机名的参数是IPv4 or IPv6的地址,
则不需要有DNS来解析
glibc-2.17的code

86-87行所计算的缓冲区大小size_needed,需要存储3个不同的实体:host_addr,h_addr_pts,name(hostname)
88-117行确定缓冲区足够大
88-97行对应函数的重入case
98-117为非重入case

121-125准备缓冲区指针来存放4个不同实体:host_addr,h_addr_ptrs,h_alias_ptr,hostname。 (*h_alias_ptr)的字符指针的大小被size_need所漏掉。

157行的strcpy函数,是让我们写过缓冲区的末尾,最多(依赖strlen(name)和字符对其)4 bytes on32-bit,or 8 bytes on 64-bit。
有个相似的strcpy的函数,但没有缓冲区溢出

为了达到157行的缓冲区溢出,主机名参数必须符合以下条件:
- line 127行的 第一个字符是数字
- line 135行的 最后一个字符不能是’.’
- line 197行的 要只能包含数字和’.’
- 必须可以分配最够大的缓冲区,如非重入的gethostbyname* ()初始化分配malloc(1024)的大小
- line 143行,IPv4的地址被inet_aton函数正确解析,or line 147 ipv6 被inet_pton()
inet_pton中的”:”是被禁止的,也不能带有数字和点的地址解析成ipv6地址,所以inet_aton是唯一的选择,且主机名必须是下列形式之一:”a.b.c.d”,”a.b.c”,”a.b”or “a”。a,b,c,d是
无符号证书,最大是0xffffffful。并可以有strtoul转成十进制的。

==3== Mitigating factors

该影响现在显著减少了,
1 在2013/5/21发表的补丁显示:
[BZ #15014]
* nss/getXXbyYY_r.c (INTERNAL (REENTRANT_NAME))
[HANDLE_DIGITS_DOTS]: Set any_service when digits-dots parsing was
successful.
* nss/digits_dots.c (__nss_hostname_digits_dots): Remove
redundant variable declarations and reallocation of buffer when
parsing as IPv6 address. Always set NSS status when called from
reentrant functions. Use NETDB_INTERNAL instead of TRY_AGAIN when
buffer too small. Correct computation of needed size.当缓冲区太小时使用NETDB_INTERNAL而不是TRY_AGAIN
* nss/Makefile (tests): Add test-digits-dots.
* nss/test-digits-dots.c: New test.
2.gethostbyname*()函数被getaddrinfo() 代替,因为IPv6的到来
3.许多程序,特别是suid文件可以访问本地时,仅当使用inet_aton()调用失败时调用gethostbyname()
4 大多数其他程序,尤其是可远程(ssh)访问服务器时,会使用gethostbyname来逆向查找DNS。这个程序通常是安全的,因为传递到gethostbyname的主机名通常被DNS软件预先检测了。
每个lable最多只有63个8-bit octets,由点分隔,最多攻击有255个octets,,这使得其长度不能满足1kB要求
实际上,glibc的DNS解析器可以产生高达(最多)1025字符的主机名(如bit-string lable,特殊和非打印字符)但这些会一如”\\”,这样就造成不能满足”只有数字和点”的要求

==4== Case studies

 

测试:

==5== glibc使用时的案例

1 glibc-2.13/sysdeps/posix/getaddrinfo.c:
调用是安全的,安照”inet-aton”要求,是安全的。仅当第一次调用inet_aton()失败时,getaddrinfo()会调用gethostbyname2_r()

2 mount.nfs
调用是安全的,安照”inet-aton”要求,是安全的。仅当第一次调用inet_aton()失败时,getaddrinfo()会调用gethostbyname2_r()

3 mtr
调用是安全的,调用了getaddrinfo

4 iputils-clockdiff
是有弱点的

5 ping arping
ping 、arping 在inet_aton()失败时调用 gethostbyname() 和 gethostbyname2()。

== 6 == 系统中那些服务和应用涉及到glibc

可以使用以下命令查询

以上显示bash dnsmasq named sshd 可能涉及到gethostbyname影响

wget漏洞信息相关el7(CVE-2014-4877)

00漏洞原理:

wget ftp下载符号链接文件时(没开启retr-symlinks 选项),会在本身系统创建一个符号链接,当伪造一个ftp 数据包中有的文件夹符号链接和一个同名文件夹并且真实文件夹中有子文件时,wget递归下载时会把子文件下载到本地文件夹符号链接指向的地址。攻击者通过伪造ftp数据流可在目标任意目录中创建文件、文件夹、连接符号,甚至设置权限、时间等属性。
首次上报该漏洞给Wget开源项目组的人是Rapid7的首席安全官HD Moore,这个漏洞被命名为CVE-2014-4877。
01 漏洞测试(metasploits)

搭建msf监听本地端口

搭建一个攻击的ftp

攻击结果

02 漏洞测试(wget-symlink_attack_exploit)

攻击结果

03 代码分析

如上代码,wget 会通过symlink 在本地创建链接文件,指向数据包中链接的地址。当使用 -m/–mirror/-r选项时,递归去获取同名文件夹 fakedir 里面的文件,由于本地的fakedir 文件为符号链接,所以ftp 服务器中的同名fakedir 文件夹子层下面的都会被下载到链接文件指向的地址。
04 代码修复
centos/redhat 提供的patch

wget漏洞影响el7,CVE-2014-4877

网络工具wget被发现存在安全漏洞(CVE-2014-4877)。

当wget在用于递归下载FTP站点时,攻击者可通过构造恶意的符号链接文件触发该漏洞,从而在wget用户的系统中创建任意文件、目录或符号链接并设置访问权限。请广大用户留意各自所使用版本的更新情况,及时安装补丁/升级。

MITRE CVE 词典对这个问题解释如下:
** RESERVED ** This candidate has been reserved by an organization or individual that will use it when announcing a new security problem. When the candidate has been publicized, the details for this candidate will be provided.

参照: