欢迎来到天天文库
浏览记录
ID:27175877
大小:482.06 KB
页数:23页
时间:2018-12-01
《幽灵(GHOST)漏洞解析.docx》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、CVE-2015-0235:幽灵(GHOST)漏洞解析0x01摘要Qualys公司在进行内部代码审核时,发现了一个在GNUC库(glibc)中存在的__nss_hostname_digits_dots函数导致的缓冲区溢出漏洞。这个bug可达可以通过gethostbyname*()函数来触发,本地和远程均可行。鉴于它的影响,我们决定仔细分析它。分析完成后,我们也决定以“幽灵”(GHOST)命名此漏洞。我们的分析过程中得出的主要结论是:-通过gethostbyname()函数或gethostbyname2()函数,将可能产生一个堆上的缓冲区溢出。经由gethostbyname_r(
2、)或gethostbyname2_r(),则会触发调用者提供的缓冲区溢出(理论上说,调用者提供的缓冲区可位于堆,栈,.data节和.bss节等。但是,我们实际操作时还没有看到这样的情况)。-漏洞产生时至多sizeof(char*)个字节可被覆盖(注意是char*指针的大小,即32位系统上为4个字节,64位系统为8个字节)。但是payload中只有数字('0'...'9'),点(“.”),和一个终止空字符(' ')可用。-尽管有这些限制,我们依然可以执行任意的代码。我们开发了一套完整的针对Exim邮件服务器的攻击PoC,测试中发现可以绕过所有现有保护(ASLR,PIE和NX)。
3、且可以通杀32位和64位的机器。而且,在不久的将来,我们还会发布一个Metasploit的模块。-据悉,GNUC库的第一个易受攻击版本是glibc-2.2,发布于2000年11月10日,相当有年头了。-据了解,是有一些方法可以减轻影响的。事实上,这个漏洞其实在2013年5月21日就已经被修复了(在glibc-2.17和glibc-2.18的发行版之间)。不幸的是,当时它并没有被认为是一个安全威胁。其结果是,大多数稳定版和长期支持版本现在依然暴露在漏洞影响下,比如:Debian7(wheezy),红帽企业版Linux6和7,CentOS6和7,Ubuntu12.04。0x02分析
4、存在漏洞的函数__nss_hostname_digits_dots()由glibc的非重入版本的文件:nss/getXXbyYY.c,以及重入版本:nss/getXXbyYY_r.c提供。然而,这个函数的调用是由#ifdefHANDLE_DIGITS_DOTS来定义的,这个宏定义只在这几个文件有:-inet/gethstbynm.c-inet/gethstbynm2.c-inet/gethstbynm_r.c-inet/gethstbynm2_r.c-nscd/gethstbynm3_r.c以上这些文件实现gethostbyname*()函数族,因此也只有它们会调用__nss_
5、hostname_digits_dots(),并且可能触发它的缓冲区溢出。该函数的作用是:“如果主机名是IPv4/IPv6地址,就跳过费时的DNS查找”。glibc-2.17的代码如下:1.int 2. __nss_hostname_digits_dots (const char *name, struct hostent *resbuf, 1. char **buffer, size_t *buffer_size, 2. size_t buflen, struct
6、hostent **result, 3. enum nss_status *status, int af, int *h_errnop) 4. { 5. 6. if (isdigit (name[0])
7、
8、 isxdigit (name[0])
9、
10、 name[0] == ':') 7. { 8. const char *cp; 9. char *hostname; 10. typedef unsigned char host_addr_t[16]; 11. hos
11、t_addr_t *host_addr; 12. typedef char *host_addr_list_t[2]; 13. host_addr_list_t *h_addr_ptrs; 14. char **h_alias_ptr; 15. size_t size_needed; 16. 17. size_needed = (sizeof (*host_addr) 18. + sizeof
此文档下载收益归作者所有