[翻译]Use-after-frees: That pointer may be pointing to something bad

前言
如果看最近几个IE安全公告, 你可能注意到很多补丁是修复UAF[1,2]类型的漏洞. 由于需要手工发现这类型漏洞, 所以UAF至今仍是一类普遍存在的bug. 特别是对大型和复杂的代码库, 手工发现它们更是一个挑战. 原因在于, 它们存在一个应用程序的不同部分, 如某部分代码造成对象释放, 另外一部分代码使用了释放的对象. 因此, 通过代码审计很难发现漏洞. 本文解释什么是UAF并举出两个例子, 最后提及一些可以检测UAF的工具.
UAF与悬挂指针
UAF是由于非关联指针指向一个已经释放的对象导致的(也叫悬挂指针):

两个常见的导致悬挂指针原因:
没有更新当前正在使用对象的引用计数. 结果就是导致正在使用的对象过早被释放. 对象被释放后没有更新对象指针的值
典型的, UAF类型漏洞利用基本上就是重新分配内存尝试占据已释放对象的空间. 造样会造成悬空指针指向攻击者可控的数据. 接下来一旦程序使用了悬空指针, 攻击者便可劫持程序执行流程.
例1: CVE-2012-4969 (IE CMshtmlEd UAF)
一个很好的UAF说明例子是CVE-2012-4969[3], 漏洞存在于IE浏览器, 2012年9月流传出攻击样本. 下面这个简化图说明了UAF产生条件:

在上面的情形中, UAF出现在 CMshtmlEd::Exec() 函数内部, this pointer指向释放的对象. JS的execCommand()函数内部会调用CMshtmlEd::Exec(). 为了释放CMshtmlEd:对象, 攻击者通过某种方式调用execCommand(), 触发JS事件, 接着CMshtmlEd::Exec()中调用攻击者可控的JS事件处理函数. 当JS事件处理函数调用document.write时, 会导致几个对象释放, 其中包括当前正在使用的CMshtmlEd对象. 当执行流返回到 CMshtmlEd::Exec()时, this pointer变成了悬空指针, 这是UAF产生的条件
在这个例子中, 造成UAF的根本原因CMshtmlEd对象引用计数不正确, 使得攻击者可以过早得释放正在使用的对象.
有趣的是, 看着这个0day漏洞, 我意识到这里可能还会有相似的问题(IE的事件处理函数可以释放一个正在使用的对象). 通过公告手工Fuzzing可能存在的相似漏洞, 我尝试了JS方法和JS事件不同组合。 几次失败后, 我偶然发现一个类似UAF的漏洞, 本质上是由于CPasteCommand对象被释放造成的, 根本原因同样是对象引用计数不正确, 我们把这个漏洞报告给微软, 在2013年二月漏洞被修复[1].
例2: CVE-2012-4792 (IE CButton UAF)
另外一个UAF例子是CVE-2012-4792[4], 一个IE的漏洞, 2012年12月野外出现了利用程序.下面这个简单的图显示了漏洞产生条件:

在这个例子, CButton对象指针保存在CDoc对象; 然而, CButton对象引用计数从不更新. 此外, 后来当CButton对象从DOM树被移除后(通过 .outerText=””指令), CButton指针(保存在CDoc)也没更新, 然后, 当garbage-collectected执行, 保存在CDoc中的CButton指针就变成了悬挂指针. 最后当这个悬空指针被引用, UAF就触发了.
检测UAF工具
如果被释放的内存对象没有立即被另一个对象重新使用, 这个对象原来的内容完好无损. 这种情况下没有好的工具很难检测到它. 在这些情况下, UAF条件可能只通过访问冲突随机显现。
此外, 访问冲突的位置导致UAF不同于最初的非关联化悬空指针的位置, 这是因为, 除非悬空指针指向的内存被释放; 引用悬空指针才不会触发访问冲突. 用不期望的值获得使用(或通过写)悬挂指针可能会造成访问冲突.
幸运的是, 已经有工具[5]可以实时检测内存破坏bug包括UAF. 我主要关注闭源的windows程序, 我只要使用page heap[6], 可以通过GFlags[7]或者应用程序验证工具[8]启用它.
我通常用page heap分析简化版(能触发漏洞最简poc)的EXP. 对于UAF, 如果启用了page heap, 被释放对象内存被设置为PAGE_NOACCESS, 当尝试去引用这块内存时便会触发访问冲突.
举个例子, 对IE启用page heap, 用一个简化版的CVE-2012-4969 EXP让IE打开, 当CMshtmlEd::Exec()代码第一次引用悬挂指针, 直接就触发访问冲突.
(270.784): Access violation – code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=00000000 ebx=0000001f ecx=05b29f30 edx=0000000c esi=00000000 edi=06070f78 eip=3d0e107d esp=02d29de4 ebp=02d29df0 […] mshtml!CMshtmlEd::Exec+0x131: 3d0e107d 8b7f08 mov edi,dword ptr [edi+8] ds:0023:06070f80=????????
此外, 如果设置了调试符号, 可以用这个指令dump对象的释放过程”!heap –p”
0:008> !heap -p -a edi address 06070f78 found in _DPH_HEAP_ROOT @ 141000 in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize) 55a8418: 6070000 2000 7c927553 ntdll!RtlFreeHeap+0x000000f9 3d0602c4 mshtml!CMshtmlEd::Release+0x00000025 3d2fec6c mshtml!CHTMLEditor::DeleteCommandTarget+0x00000034 3d2fa581 mshtml!CHTMLEditor::RemoveContainer+0x00000167 3d16b500 mshtml!CHTMLEditor::Notify+0x00000026 3cf347c0 mshtml!CHTMLEditorProxy::Notify+0x00000021 3cf34682 mshtml!CDoc::NotifySelection+0x00000059 3d0f1691 mshtml!COmWindowProxy::SwitchMarkup+0x00000347 3d074d6c mshtml!CDocument::open+0x00000471 3d073c42 mshtml!CDocument::write+0x00000081 […]
堆栈跟踪可以帮助你了解对象释放的一些信息并推断这个对象的类型
总结
发现UAF bug需要非常彻底的手工审查, 尤其是在复制而庞大的代码库. 幸运的是, 一些工具可以协助你捕捉UAF和其他内存破坏漏洞, Fuzzing或者测试软件的时候使用这些工具是个好主意
参考
[1] “Microsoft Security Bulletin MS13-009 – Critical : Cumulative Security Update for Internet Explorer (2792100),” [Online]. Available: http://technet.microsoft.com/en-us/security/bulletin/MS13-009
[2] “Microsoft Security Bulletin MS13-021 – Critical : Cumulative Security Update for Internet Explorer (2809289),” [Online]. Available: http://technet.microsoft.com/en-us/security/bulletin/MS13-021
[3] “Microsoft Security Bulletin MS12-063 – Critical : Cumulative Security Update for Internet Explorer (2744842),” [Online]. Available: http://technet.microsoft.com/en-us/security/bulletin/MS12-063
[4] “Microsoft Security Bulletin MS13-008 – Critical : Security Update for Internet Explorer (2799329),” [Online]. Available: http://technet.microsoft.com/en-us/security/bulletin/MS13-008
[5] “Comparison of various memory error detectors,” [Online]. Available: https://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools
[6] “How to use Pageheap.exe in Windows XP, Windows 2000, and Windows Server 2003,” [Online]. Available: http://support.microsoft.com/kb/286470
[7] “GFlags and PageHeap,” [Online]. Available: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549561(v=vs.85).aspx
[8] “Application Verifier,” [Online]. Available: http://msdn.microsoft.com/en-us/library/windows/desktop/dd371695(v=vs.85).aspx
原文:https://securityintelligence.com/use-after-frees-that-pointer-may-be-pointing-to-something-bad/
