热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UAF漏洞介绍

UAF(UseAfterFree)漏洞是一种内存破坏漏洞,通常存在于浏览器中。最近,浏览器的新版本加入了一系列控件,这也使得利用这些漏洞


UAF (Use After Free)漏洞是一种内存破坏漏洞,通常存在于浏览器中。最近,浏览器的新版本加入了一系列控件,这也使得利用这些漏洞变得更加困难。尽管如此,它们似乎仍然存在。

这篇文章主要会对这类漏洞进行简要介绍,并提供一些与利用有关的基本信息。我没有写如何绕过最新的内存保护(我自己也还没弄明白),但会对这些特定问题的根源进行探究。

 

我选择使用MS14-035 (https://technet.microsoft.com/library/security/MS14-035)来举例。我选择这个漏洞有几个原因,首先,在exploit DB(https://www.exploit-db.com/exploits/33860/)里有一个不错的POC,它在IE 8到10中会声明崩溃。其次, 在exploit DB中,我没法为这个漏洞找到现存可行的利用。

尽管缺乏exploit DB上的利用,我设法找到了一些与这个问题相关的博客。你们可以尝试其中的某一个:

https://translate.google.com.au/translate?hl=en&sl=pl&u=https://malware.prevenity.com/2016/02/cwiczenie-przykad-wykorzystania-bedu.html&prev=search

https://www.nccgroup.trust/globalassets/our-research/uk/whitepapers/2015/12/cve-2014-0282pdf/

https://www.cybersphinx.com/exploiting-cve-2014-0282-ms-035-cinput-use-after-free-vulnerability/

在你们阅读这篇文章时,我也想推荐一下以下的文章,以作参考:

https://www.blackhat.com/presentations/bh-europe-07/Sotirov/Whitepaper/bh-eu-07-sotirov-WP.pdf

https://www.corelan.be/index.php/2013/02/19/deps-precise-heap-spray-on-firefox-and-ie10/

https://www.corelan.be/index.php/2011/12/31/exploit-writing-tutorial-part-11-heap-spraying-demystified/

https://www.fuzzysecurity.com/tutorials/expDev/11.html

https://expdev-kiuhnm.rhcloud.com/2015/05/11/contents/

现在,让我们来看看POC( https://www.exploit-db.com/exploits/33860/)。请看一看内容,尽量去熟悉它。我们正在进行调试,试图搞清楚每个部分的作用,以及它与我们在调试器中看到的内容有什么关系,我认为在这个时候公开这些内容是有意义的。

我使用的环境是Windows 7 SP1 32位和IE 8.0.7601.17514。这是安装新的Windows 7 SP1  32位时IE 8的默认版本。其他需要用到的软件是windbg和gflags, 你可以在https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit下载。

如果你已经设置好了上面的环境,请打开Internet Explorer中的POC,并将windbg附加到这个过程中。你可能需要设置windbg的符号路径,可以在https://msdn.microsoft.com/en-us/library/windows/desktop/ee416588(v=vs.85).aspx找到所需的信息。设置好符号路径后,在浏览器中单击允许已阻止的内容。你会发现windbg出现了崩溃,看上去是这样的:

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/6789f68dabde0aed.png

图1:windbg中的POC崩溃。

 

观察这次崩溃,我们会发现eip指向了无效的内存。我们现在需要找出eip的值从何而来。

借助于kb命令查看调用栈后表明,崩溃发生在执行CFormElement::DoReset函数期间。这为我们的问题探究提供了一个很好的起点,但是,我们还需要更多的信息。

下一步是启用gflags上的用户模式堆栈跟踪和页堆,然后再次运行POC。gflags是一种很实用的帮助排除故障的工具,在这里你可以阅读所有关于它的信息: https://msdn.microsoft.com/en-us/library/windows/hardware/ff549609(v=vs.85).aspx。下面的命令将会打开页堆和用户模式堆栈跟踪:

gflags.exe /i iexplore.exe +ust +hpa (你可以通过/p /enable启用正常的页堆)。

启用了页堆和用户模式堆栈跟踪后,我们再次运行POC,会得到以下的windbg输出:

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/443b30bb45e66690.webp

图2: 启用了页堆和用户模式堆栈跟踪后的POC崩溃

 

页堆会做几件事情来确认内存是否损坏。它会使用f0f0f0f0模式来确认释放的堆氏分配,例如:无论进程何时释放堆分配,页堆标签会迫使这个分配被f0f0f0f0覆盖。考虑到这一点,我们得到了表明这是一个UAF问题的第一个迹象。在call dword ptr [eax+1CCh]这里,我们发现了程序崩溃。这个程序试图调用一个地址应该存储在[eax + 0 x1cc]的函数,然而eax现在存储的值是0xf0f0f0f0,它来自于刚被释放出来的堆内存。

 

为了证实这一点,我们首先需要找到当前eax的值从何而来。为了做到这一点,我们应该调查图1所示的CFormElement::DoReset函数。

下图显示的是windbg命令uf mshtml!CFormElement::DoReset的一部分输出。我不得不截取其中一部分,因为它的输出很长,而现在,我们真正感兴趣的只是这一小块:

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/6c257b6ba227cc3e.webp

图3: mshtml!CFormElement::DoReset函数汇编代码的一部分

 

突出显示的代码就是程序崩溃的地方。根据我们之前对图2中崩溃的分析,你可能会认出这一部分的最后一行。我们现在可以看到, eax的值来自于mov eax, dword ptr [esi]指令。这是典型的虚拟函数调用,那么让我们看一看虚拟函数是如何工作的。

虚拟函数是一种成员函数,可以在一个衍生类别中被覆写。由编译器为每一个类创建一个虚拟函数表后, 即可进行c++实现。虚拟函数表本质上是一个函数指标表,每一个指标都指向一个不同的虚拟函数。当一个对象被创建出来后,第一个成员变量即成为虚表中该类别的一个指标,称为VPTR。当一个虚拟函数被调用时,过程将运行VPTR,并用适当的偏移量调用虚拟函数。

图4将会展示虚拟函数是如何工作的

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/0ef126b5295c089b.webp

图4:虚拟函数调用流量时的图表

 

在图3里突出显示的代码中,程序使用mov eax, dword ptr [esi]指令,将位于esi的VPTR复制到了eax寄存器。现在eax包含了虚拟函数表的地址。然后call dword ptr [eax+1CCh]指令会试图调用偏移量为0x1cc的虚拟函数。

为了找到更多与esi中的释放对象有关的信息,我们可以使用windbg !heap命令启用用户模式堆栈跟踪。该命令的输出内容如图5所示:

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/857a46d091981bac.webp

图5: 崩溃时,!heap –p –a esi命令的输出。

 

图5显示了堆式分配的堆栈踪迹,包含esi内的内存地址。首先我们可以看到对象的大小是0 x60——这很重要。此外我们可以看到,在堆栈跟踪中调用了mshtml!CTextArea::`scalar deleting destructor'函数。这再次表明对象已经被释放,因为它是对析构函数的调用。我们也可以得知,这是一个来自于CFormElement类的CTextArea对象。很清楚的一点是,这实际上是一个UAF漏洞,一个虚拟函数调用引发了崩溃。

好了,到目前为止,我们已经在调试器上花了很多时间。我们得出了结论:这是一个UAF漏洞,当程序尝试从释放的CTextArea对象中调用一个虚拟函数时,就会发生崩溃。下面的POC触发文件也许值得一看,看看我们是如何得到这个代码路径的。

 

 

https://img.php1.cn/3cd4a/1eebe/cd5/e3aa5425383ba10d.png

图6: 导致崩溃的POC

 

看看图6,并记住我们先前所做的分析,因此由此我们可以得出一些结论。我们可以在windbg中测试这些结论。

首先创建一个名为“testfm”的表单。此表格由四个部分组成,其中有两个是文本区域,从我们之前调试中,我们可以知道释放的对象是CTextArea对象。

下一个让人感兴趣的部分是脚本标记中的转换函数声明。这个函数会清除表格的内容,并释放CTextArea对象。


最后,在脚本标记的底部,我们可以看到“testfm”中的 “child2”元素已经被检查过了。然后,使用onpropertychange事件属性,转换函数将会被设定执行。此后表单上会调用函数重置。

在表单上调用重置时,实际上调用的是CFormElement::DoReset函数。这个函数依次通过每个部分,并重置属性。当循环到“child2”元素时,会调用转换函数,清除表单内容并释放表单元素对象。当下一次循环到已被释放的“child3”元素时, 进程将在虚拟函数调用时崩溃。

为了利用它,我们需要创建一个假的堆上对象,它将占据内存中释放的区域。同时,这个假的对象也需要一个假的VPTR和假的虚拟表。

 


推荐阅读
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 汽车电子架构与CAN网络基础解析——鉴源实验室专业解读 ... [详细]
  • 在TypeScript中,我定义了一个名为 `Employee` 的接口,其中包含 `id` 和 `name` 属性。为了使这些属性可选为空,可以通过使用 `| null` 或 `| undefined` 来扩展其类型定义。例如,`id: number | null` 表示 `id` 可以是数字或空值。这种类型的灵活性在处理不确定的数据时非常有用,可以提高代码的健壮性和可维护性。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 在拉斯维加斯举行的Interop 2011大会上,Bitcurrent的Alistair Croll发表了一场主题为“如何以云计算的视角进行思考”的演讲。该演讲深入探讨了传统IT思维与云计算思维之间的差异,并提出了在云计算环境下应具备的新思维方式。Croll强调了灵活性、可扩展性和成本效益等关键要素,以及如何通过这些要素来优化企业IT架构和运营。 ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
author-avatar
我本僐悢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有