当前位置: 首页 > 科技观察

Ghost漏洞引发的“血案”

时间:2023-03-13 23:32:51 科技观察

0x00背景近日,某安全公司发现了glibcgethostbyname缓冲区溢出漏洞。该漏洞被命名为ghost。原因是glibc的Gethostbyname函数对传入的畸形域名信息进行了分析处理。导致堆溢出,很多依赖glibc模块的网络应用都会受到影响。目前已经确认受影响的版本为glibc2.2<=version<=2.17,但是我们的安全研究员在测试漏洞的过程中触发了另外一个有趣的格式字符串,我们来看看具体过程。0x01分析详情测试环境ubuntuglibc2.12python2.6.6当我司研究员在python中执行如下代码时,发现程序崩溃12importsocketsocket.gethostbyname('0'*10000000)下面看看漏洞触发过程,查看passongdb查看异常信息点,发现异常发生在以下代码中,memcpy函数执行内存复制时出错。通过分析发现,rdx为拷贝长度,rsi为源缓冲区,rdi为目的缓冲区。通过分析发现rsi是我们传入的数据,但是rdi的地址是访问不到的,所以当memcpy函数进行复制操作时,会写入到目的地址空间失败。通过分析,发现这个地址没有被初始化,最终导致程序崩溃。通过分析,我们发现python语句12ImportsocketSocket.gethostbyname('0'*10000000)会调用sscanfformat将字符串'0'*10000000转换为整型数据“%d.%d.%d.%d”,我们分析glibc中的源码stdio-common/vfscanf。c发现关键问题在宏ADDW中会做如下处理,下面的代码是glibc2.12,这里代码的作用是将我们传入的字符串复制到栈中,alloca函数是打开堆栈空间。我们知道,默认情况下Linux的栈空间是8MB。当我们传入的参数过长时,栈空间会被耗尽,导致内存写入溢出,当我们写入不可预知的未映射内存时,程序就会崩溃。通过搜索找到这个格式化字符串漏洞在2.15版本中被修复。补丁代码如下:补丁代码的处理逻辑是将传入的数据复制到堆内存中,而不是栈空间中。https://sourceware.org/bugzilla/show_bug.cgi?id=131380x02漏洞利用该格式化字符串漏洞利用难度大,复制到的目的地址不可预测,难以控制。0x03结论&引用该漏洞会导致远程崩溃,赶紧升级glibc。感谢阿里安全研究团队和漏洞分析团队的努力参考:https://sourceware.org/git/?p=glibc.git;a=commit;f=stdio-common/vfscanf.c;h=3f8cc204fdd077da66ffc8e9595158b469e2b8e5https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfscanf.c;h=7356eeb3626665a0524bbf1be37398ea22e05d7e;hb=6164128f1ca84eea240b66f977054e16b94b3c86/115dissource/closure.org2:http://blog.sina.com.cn/s/blog_e8e60bc00102vhz7.html