Flexera FlexNet Publisher中基于栈的缓冲区溢出漏洞分析

近日,安全人员在Flexera FlexNet Publisher(License Manager)中发现了一个基于栈的缓冲区溢出漏洞(CVE编号:CVE-2015-8277,CNNVD编号:CNNVD-201602-441),可导致远程代码执行,并且会根据不同的软件产品变化。

FlexNetPublisher是应用广泛的License管理工具,软件厂商可以锁定机器的硬盘号,网卡号,使用日期等,以保护软件的知识产权。英特尔、思科、Adobe、惠普、RSA、西门子等都是FlexNet Publisher的用户。

漏洞细节

该漏洞存在于lmgrd.exe中,并且很多厂商都使用FlexNetPublisher创建vendor二进制文件,主要原因是程序使用一个自定义的strncpy函数(按长度拷贝字符串),与传统的strncpy函数类似,该自定义函数中包含源缓冲区、目的缓冲区和长度三个参数。然而,该漏洞导致strncpy函数忽略了长度参数,因此程序会自动将其转换为strcpy函数。

通过追踪strncpy函数的用法,发现其广泛使用在由FlexNet Publisher支持的lmgrd和vendor二进制文件。当开发者默认最大长度已经被限制时,该函数会十分危险。该函数的伪代码如下图。

图一 strncpy函数的伪代码

经过深度分析,研究人员发现strncpy函数被用在将近100个位置,大多数用于处理消息解析函数中用户提供的数据。确定漏洞的可利用性时,首先应该找出编译到应用程序中的内存保护机制的位置。某些视觉分析法可以显示栈cookie的使用情况,并运行Corelanmona脚本,由此分析,lmgrd二进制文件使用ASLR、DEP和SafeSEH安全机制进行编译。

图二 lmgrd二进制文件的编译

下一步,也是最复杂的一步,就是按照可利用难易程度为使用strncpy函数的位置进行排名。这意味着,不仅要考虑目的缓冲区是位于堆上还是栈上,还有确定栈cookie是否使用在当前的栈框架中。在经过一系列搜索之后,研究人员将目光锁定用于解析0x107类型消息的函数。该函数用途的特殊之处在于,栈框架中没有编译栈cookie,如果该函数的目的缓冲区大小只有4字节,那么程序可能会将其默认为一个地址。

图三 用于解析0x107类型消息的函数

借助特制的数据包运用该消息解析函数确实能引发一个基于栈的缓冲区溢出漏洞。但是还有一个要求是,该溢出不能溢出到函数参数,或者随后要调用的memcpy函数不能抛出异常,否则就不能控制执行。幸运的是,研究人员成功使用ROP方法覆盖了返回的指针,将返回指针在栈中的位置移动到输入缓冲区。

图四 栈溢出前后对比

分析进行到这,还有DEP和ASLR两个内存保护机制需要绕过。绕过DEP的方法是通过在当前二进制目录下使用ROP来重新分配一个可执行的栈。但是使用该方法需要泄露二进制文件或加载库的内存地址,所以需要找到另一个漏洞获取内存地址。真实情况是,研究人员并没有找到获取内存地址的方法。

但是在研究过程中发现,程序中实际有两个二进制文件作为Flexera Publisher服务运行,一个名为lmgrd.exe,另一个为供应商的软件名称(例如,vendor.exe)。lmgrd文件可以管理vendor文件,并且可以重启崩溃的vendor文件。

研究人员可以借助该方法结合暴力破解方法获取加载库的基址。通过向vendor服务发送消息以重启应用程序服务,进而猜测出基址。为何要用暴力破解方法?主要是研究人员发现加载库的基址只有12位会发生变化,也就是说该基址只有4096种可能。

在POC中,研究人员将以上分析的所有内容结合到一个python脚本中。为了验证漏洞利用成功的时间,研究人员使用shellcode连回shell,并设置一个单独的线程通知主线程创建连接的时间。在此过程中需要注意的一点是,要及时停止暴力破解器。研究人员使用了pwntools库来简化与Metasploit服务器连接的代理。

图五 使用pwntools库简化代理

受影响版本

FlexNet Publisher (License Manager) 11.13.1.0及之前版本 嵌入了FlexNet Publisher (License Manager)的产品

修复情况

Flexera已经修复了该漏洞,用户可以从其官网获取补丁,并按照其引导及时升级软件。对于网络防护人员,可以先确定lmgrd.exe的运行位置,然后判断是否修复,如果不确定补丁是否适用,可以联系所使用软件的厂商。同时也要确保服务台能及时处理客户投诉。

总结

人们对于该漏洞更关注的是它广泛的影响。该漏洞本身存在于Flexera软件中,但是却影响了很多嵌入FlexNet Publisher的其他产品,其厂商必须根据Flexera的补丁研究出适用于本产品的相应补丁,因此有些产品的用户可能要等待一段时间才能获取修复版本。

* 原文地址:securitymumblings,securifera,vul_wish编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HaHack

comment.js:一个纯JS实现的静态站点评论系统

31140
来自专栏携程技术中心

携程Android App插件化和动态加载实践

携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Androi...

24570
来自专栏DannyHoo的专栏

iOS9系统下使用UITextField的一个坑——内容从不可见到可见会多出一个空格

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

23920
来自专栏iKcamp

iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影。 前面的文章中,...

43690
来自专栏BIT泽清

贷款应用被拒如何应对?怎么上架(含隐藏开关)的马甲包

      突然间的2.1大礼包成了一个重灾区,苹果加大了中国区的审核力度。但其实归根结底,会触犯到这个大礼包的App很大部分或者说几乎都是和这个关键词挂钩的 ...

515100
来自专栏烂笔头

Django 1.10中文文档-第一个应用Part5-测试

目录[-] 本教程上接教程Part4。 前面已经建立一个网页投票应用,现在将为它创建一些自动化测试。 自动化测试简介 什么是自动化测试 测试是检查你的代码是...

38760
来自专栏依乐祝

.NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概...

12800
来自专栏WeTest质量开放平台团队的专栏

我这样减少了26.5M Java内存!

历时五天的内存优化已经结束,这里总结一下这几天都做了什么,有哪些收获。优化了,或可以优化的地方都有哪些。(因为很多事还没做,有些结论需要一定样本量才能断定,所以...

20210
来自专栏工科狗和生物喵

Python爬虫小白入门(一)

开篇语 本篇文章适用人群 >有一点点语法基础,至少知道Python这个东西,如果有其他方面语言的基础那也凑合 >会一点点Linux系统的操作,最好是ubunt...

565110
来自专栏大内老A

WCF版的PetShop之一:PetShop简介[提供源代码下载]

在《WCF技术剖析(卷1)》的最后一章,我写了一个简单基于WCF的Web应用程序,该程序模拟一个最简单的网上订购的场景,所以我将其命名为PetShop。PetS...

24950

扫码关注云+社区

领取腾讯云代金券