zl程序教程

您现在的位置是:首页 >  其他

当前栏目

GHOST漏洞原理简单分析

漏洞原理 分析 简单 Ghost
2023-09-14 09:02:05 时间

继 ShellShock漏洞之后,Linux又爆出一重大漏洞。网上各种关于漏洞检查和修复的文章,但很难找到一篇讲述这个漏洞原理的。在阅读网上流传的测试代码后,写一下个人对这个漏洞的简单分析。

这应该是漏洞发布的网址,里面有最详细的解释,本人才疏学浅,只看了少部分,想深入了解的可以直接阅读,如本文有错误,请指正。

http://www.openwall.com/lists/oss-security/2015/01/27/9

漏洞简介:

GHOST是Linux glibc库上的一个安全漏洞,CVE编号为CVE-2015-0235。这是一个缓冲区溢出漏洞,攻击者可以利用它远程执行代码。第一个受影响的版本是GNU C库的glibc-2.2。

其实这个漏洞很早就被发现,在2013年5月21号(在glibc-2.17和glibc-2.18发布之间)已经修复,只是一直没被重视,。目前Qualys公司的安全人员开发了一套完整的针对Exim邮件服务器的攻击PoC,测试中发现可以绕过所有现有保护 ( ASLR,PIE和NX )。且可以攻破32位和64位的机器。这个漏洞回到了人们的视线。

所以,如果你的系统采用最新的glibc是没有这个漏洞的,比如fedora20。之所以现在漏洞被重视,是因为很多系统都没使用新版本的glibc,服务器系统稳定性高于一切,不会很积极把组建升级到新版本,特别是glibc这种基础库。

漏洞原理: 什么是缓冲区溢出:

缓冲区溢出是c程序中经常出现的情况,比如遍历数组时没有控制范围,就会出现段错误。这就是缓冲区溢出,显示段错误是因为系统拦截了越界的操作。

但是,如果系统因为某种原因没有拦截越界操作,那就可能成为一个漏洞。心脏流血就是一个类似的漏洞,但是它是越界读。如果是越界写,就可能覆盖掉不该覆盖的内存段。如果这块内存是数据,那就会造成数据错误。如果这块内存是一个代码,那就可能引起执行错误,精心设计引起的溢出会让系统执行攻击者的代码。

漏洞在哪里产生:

漏洞是glibc中的__nss_hostname_digits_dot()函数导致的,漏洞可以通过gethostbyname *()函数来触发,本地和远程均可行。

gethostbyname*()函数的作用是解析域名。事实上这类函数已经被淘汰。但是很多代码依然依赖这些函数。

我们分析一下网上的这个检测代码:


  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  retval = gethostbyname_r(name, resbuf, temp.buffer, sizeof(temp.buffer), result, herrno);
  if (retval == ERANGE) {                     //函数返回了失败,说明指针越界后被拦截并返回错误码 

这里要先讲一下gethostbyname_r函数,它的参数比较特别。

resbuf是个hostent结构体,结构体中有好几个指针,指向写着主机信息的内存区。而这个内存区就是代码中的tmp.buffer。

name 是要查询的域名,它会被发送到DNS来查询IP等信息。但是这样并不容易引起溢出。

还有一个坑是如果name输入的是IP地址,则不会去DNS查询,而是直接写入到hostent指向的内存区中。这里因为没有进行合法性判断,所以输入奇怪的IP,比如检测代码中的一串0。它会被直接写入tmp.buffer,一同写入的还包括解析的主机信息。所以就很容易超过tmp.buffer的长度,造成溢出。

通过gethostbyname()函数或gethostbyname2()函数,将可能产生一个堆上的缓冲区溢出。经由gethostbyname_r()或gethostbyname2_r(),则会触发调用者提供的缓冲区溢出(理论上说,调用者提供的缓冲区可位于堆,栈,.data节和.bss节等。但是,目前还没有看到这样的情况)。测试代码就是用的gethostbyname_r()。

因为有对IP的判断,所以溢出的内容(name)有一些限制。

它的第一个字符必须是一个数字。 它的最后一个字符不能是”.”(点)。 它必须只包含数字和点(我们称之为“digits-and-dots”要求)。 它必须足够长,以至于缓冲区溢出。例如,不可重入gethostbyname *()函数最初分配缓冲的调用malloc(1024)(“1 kb”的要求)。 它必须被成功解析为一个IPv4地址inet_aton(),或作为一个IPv6地址inet_pton()方法。

对此,这个溢出可以对内存块写数字( ‘0 ‘…’ 9′) ,点( “.”) ,和一个终止空字符(‘\0’ ) 。

看上去这个溢出还是有不少限制的,不知道安全人员会通过怎么样巧妙的方式来攻击。

缓冲区溢出是Linux乃至C类语言很忌惮的东西,它引起的结果其实是让系统把数据当成代码执行。这和SQL注入差不多,但是实现方式不同:

SQL注入是因为SQL语言分析的问题,语法中就没把数据和代码分离好。 缓冲区溢出是因为操作内存代码的漏洞。

转载请注明:旅途@KryptosX » GHOST漏洞原理简单分析


【号外】-挖矿病毒遗留解决办法-Centos挂载磁盘完整图文教程 真是悲惨,之前还以为把挖矿病毒阻止住了,然并没用,病毒依然会在1点钟后复燃,应该是有一个进程一直在循环检测,限于本人能力未能找到根源,但时间又没了,只能进行数据迁移重装系统
IIS6.0目录解析漏洞原理/复现 目录解析漏洞原理 IIS6.0版本存在目录解析漏洞 , ,asp格式命名的文件夹,其目录下的所有文件都会被IIS当做asp文件来解析 Windows 2003系统 , IIS 6.0 服务
thinkphp网站有漏洞怎么解决修复 2019年1月14日消息,thinkphp又被爆出致命漏洞,可以直接远程代码执行,getshell提权写入网站木马到网站根目录,甚至直接提权到服务器,该漏洞影响版本ThinkPHP 5.0、ThinkPHP 5.0.10、ThinkPHP5.0.12、ThinkPHP5.0.13、ThinkPHP5.0.23、thinkphp 5.0.22版本。
网站程序有漏洞怎么修复和查找漏洞 ecshop目前最新版本为4.0,是国内开源的一套商城系统,很多外贸公司,以及电商平台都在使用,正因为使用的人数较多,很多攻击者都在挖掘该网站的漏洞,就在最近ecshop被爆出高危漏洞,该漏洞利用跨站伪造函数,来对网站数据库进行攻击。