近日,Mozilla 发现了一个安全漏洞,并于 4 月 3 日发布了 Firefox 74.0.1 以修复该漏洞,该漏洞涉及到了 Firefox 普通版和长期支持版(ESR),所以有理由推测这个漏洞在 2019 年发布 Firefox 68 ESR 时就已经存在其中了。
紧急发布更新
几天前,Mozilla 为 Firefox 浏览器推出了新的版本 Firefox 74.0.1,以修补可能被利用的安全漏洞。普通版 Firefox 需要从 74.0 更新到 74.0.1,如果是 Firefox ESR 版本的用户,需要从 68.6.0 更新到 68.6.1。Tor 浏览器也随之发布了新版本,需要从 9.0.7 升级至 9.0.8。
目前,Mozilla 并没有公布有关于该安全漏洞的详细信息,包括何时发现该漏洞,攻击者会如何利用该漏洞进行攻击,目前为止因此漏洞被攻击的人数有多少等等,Mozilla 只提到了一点:
值得注意的是,这两个漏洞 Mozilla 都提示发现了相关针对性的在野利用攻击,在漏洞被利用时极可能为 0day 状态。根据奇安信的分析来看,该漏洞主要是通过诱导用户点击存有安全隐患的页面从而获取用户电脑的控制权。
图片来源于奇安信
什么是 Use-after-free 漏洞
Use-after-free 漏洞,也称为 UAF 漏洞,即释放后重用。
大致原理就是:申请出一个堆块保存在一个指针中,在释放后却没有将该指针清空,形成了一个悬挂指针,而后再申请出堆块时会将刚刚释放出的堆块申请出来,并复写其内容,而悬挂的指针此时仍可以使用,结果出现了不可控的情况,而攻击者就是利用这个漏洞控制函数指针,进而劫持程序执行流。
攻击者可以利用 UAF 漏洞对用户造成一些任意内存的修改,可能会造成任意内存的读取,可能会读取用户的 cookie 或是页面请求被修改,严重的能够造成任意命令的执行,获得 shell,而造成的影响还是要取决于被释放的指针是怎么使用的。
如何避免 UAF 漏洞
早在 2018 年 12 月,Mozila 发布的 Firefox 64 就曾出现过一个与 select 元素有关的 UAF 漏洞问题,漏洞名称为 CVE-2018-18492。去年 3 月,Google 也曾披露两个漏洞,其中 Chrome 的漏洞名称为 CVE-2019-5786,还有一个存在于 Microsoft Windows 中。去年 10 月,WhatsApp 也出现了 UAF 漏洞,名称为 CVE-2019-11932。
UAF 漏洞虽然不易造成过于严重的后果,但想要完全解决这个问题也并非易事,那么如何解决这个问题呢?Tarjei Mandt 在他的论文中提到了解决方案,大致如下:
Windows 系统中有一个名为 IoCompletionReserve 的对象,大小为 0x60,可以通过 NtAllocateReserveObject 申请出来,需要做的是:
首先申请 0x10000 个该对象并将指针保存下来;
然后再申请 0x5000 个对象,将指针保存下来;
第二步中的 0x5000 个对象,每隔一个对象释放一个对象;
原理在于通过第一步的操作将现有的空余堆块都申请出来,而第二步中申请的堆块都应是连续的,再通过第三步的操作,使用户申请 Use-after-free 结构体前面没有空闲的堆块,因此在释放的时候不会合并,再分配的时候基本上不会出现意外。
Tarjei Mandt 的论文《Kernel Pool Exploitation on Windows 7》:
https://media.blackhat.com/bh-dc-11/Mandt/BlackHat_DC_2011_Mandt_kernelpool-wp.pdf
延伸阅读:
https://www.mozilla.org/en-US/security/advisories/mfsa2020-11/#CVE-2020-6819
评论