CVE-2017-0037(Microsoft 浏览器内存破坏漏洞)
本文档介绍 CVE-2017-0037(Microsoft 浏览器内存破坏漏洞)。首先介绍什么是远程代码执行(RCE),然后讨论一些技术细节。
什么是远程代码执行?
远程代码执行是一种网络攻击,攻击者可以远程在另一台计算机上执行命令。远程代码执行(RCE)通常由主机下载的恶意软件引起,与系统位置无关。
实现 RCE 可通过以下方式:
注入攻击:攻击者故意提供错误输入,意图让其中一部分被当作命令的一部分处理。
反序列化攻击:反序列化程序可能将序列化数据中精心构造的用户输入当作可执行代码读取。
越界写入:如果内存分配不当,攻击者可能构造一个超出分配缓冲区的输入。由于可执行代码也存储在内存中,如果写入正确位置,程序可能运行用户提供的数据。
类型混淆攻击:当源代码不对传入的实体进行真实性验证时,存在类型混淆风险。类型混淆允许攻击者通过导致对象类型差异来植入可执行随机指令的代码,因此具有危险性。
RCE 攻击的执行过程
RCE 攻击序列执行简单。首先,威胁行为者搜索互联网上可用于有效攻击的常见漏洞。识别特定漏洞后,黑客利用该漏洞获得访问权限。获得访问权限后,他们可以使用恶意脚本达成目标,包括数据窃取、洗钱、全面监视和服务中断。
代码注入通常使用目标应用程序的语言。然后服务器端处理器执行该语言。常见的编程语言包括 Python、Java、Perl、Ruby 和 PHP。在直接分析未验证输入的平台上,代码注入很常见。实际上,公共网络应用是黑客的主要目标。
恶意脚本通常通过 bash 脚本执行。bash 脚本是一个文本文件,包含通常会在命令提示符下输入的命令。bash 脚本使包含的命令正常运行。通常会给它们附加“.sh”扩展名,但并非必需。打包后,黑客将代码放入易受攻击的应用程序中,该应用程序随后运行代码。应用程序也可能将决定权交给内核让其运行。
攻击指标
下图展示了 CVE-2017-0037 的基础评分指标。

此处 CVSS 评分为 8.1(高)。
攻击向量——易受攻击的组件与网络栈绑定,潜在攻击者范围包括从其他备选方案到整个互联网。
此漏洞的攻击复杂度为高,即攻击成功与否取决于攻击者控制之外的因素。因此,攻击无法随意完成,而是需要攻击者在针对易受攻击元素进行规划或实施时投入有意义的工作量,才能预期有效。
机密性值为高,表示机密性完全丧失,导致攻击者能访问受损组件内的所有资源。
完整性为高,表示完整性和保护严重丧失。
可用性为高,表示可用性完全丧失,允许攻击者完全禁止对受影响的组件资源的访问。
攻击细节
CVE-2017-0037 漏洞是一个类型混淆缺陷,存在于 Microsoft Edge 和 Internet Explorer 10 及 11 中。当用户访问恶意网站时,它允许攻击者在目标机器上远程执行代码。
该缺陷由谷歌研究员 Ivan Frantic 指出,由于微软未能在其 90 天披露期限内修复,谷歌公布了漏洞详情。

研究人员发布的**概念验证(PoC)**利用显示,它可以使 Edge 和 IE 崩溃,允许攻击者远程执行代码并获得受损系统的管理员权限。他还确认该攻击在 Windows Server 2012 R2 上的 64 位 Internet Explorer 上有效,并影响 32 位 IE 11 以及 Microsoft Edge。
类型混淆发生在 mshtml.dll 中的
Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElemnt 函数中。通过远程执行任意代码,利用涉及层叠样式表(CSS)令牌序列和操作TH元素的精心构造的JavaScript代码的向量,攻击可能发生。
谷歌 Project Zero 的 Ivan Fratric 提供的 PoC

如研究员 Ivan Frantic 所述,PoC 在 MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement 中崩溃,读取地址 0000007800000070。


通过分析崩溃点周围的代码,可以观察到在内存地址 00007ffe`8f330a51 处,寄存器 rbp 的内容被读入寄存器 rcx。然后调用 MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable,将值赋给 rax(rax 是用于存储函数返回值的指定寄存器)。
尽管 rcx 应该指向另一个对象类型,但在上述 PoC 中,它指向一个在 Array<Math::SLayoutMeasure>::Create 中分配的 32 位整数数组。表列的偏移量存储在该数组中,攻击者可以控制它。崩溃发生在 00007ffe`8f330a59,因为 rax 指向未初始化的内存。rax 存储了函数
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable 的返回值,该返回值不是一个初始化的内存地址。攻击者可以将 rax 指向他们能控制的某个内存位置。攻击者可以修改表格属性(如 border-spacing)和第一个 TH 元素的宽度,从而控制 rax。

如果攻击者能够控制 行 00007ffe`8f330a59 上的 rax,则函数 MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable 会在行 00007ffe`8f330a5d 743d 上再次被调用,使用相同的参数并跳转到更高的地址。之后,通过一系列从 rax 开始的差异操作,可以获取一个函数指针并存储在 rdi 中。如果攻击者能通过该函数指针的 CFG 检查,则攻击者控制的函数指针将在行 00007ffe`8f330a80 上被调用。
漏洞的可能补丁
根据 Ivan Fratric 的建议,首先必须检测类型混淆发生的原因。根据他的假设,DOM 中存在两种列:HTML 表格列和 CSS 列,IE/Edge 混淆了这两者。因此,如果在易受攻击的函数中添加某种类型检查,就可能解决这个问题。
有用链接
RCE 攻击的影响
初始访问:攻击者可利用此漏洞获取设备控制权并安装恶意软件或实现其他目标。
信息泄露:RCE 攻击有助于安装信息窃取恶意软件或运行收集并从受影响设备窃取数据的命令。
拒绝服务:RCE 缺陷允许黑客在托管受影响应用程序的机器上执行代码,从而中断其运行以及系统上其他程序的运行。
加密货币挖矿:加密货币挖矿恶意软件经常被部署并在易受攻击的设备上执行。
勒索软件:勒索软件是一种阻止用户访问其文件除非支付赎金的软件。
缓解 RCE 攻击的方法
可使用缓冲区溢出控制来缓解 RCE 攻击。
访问控制列表有助于限制用户权限,从而在攻击者获得用户账户控制权时限制其能力。
除了监控端点外,还应监控网络流量中的潜在恶意内容。
使用输入清理,即清理和擦除用户输入,以防止其被用于利用安全缺陷。
参考
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-0037
https://www.bugcrowd.com/glossary/remote-code-execution-rce/
https://bugs.chromium.org/p/project-zero/issues/detail?id=1011
https://blog.0patch.com/2017/03/0patching-another-0-day-internet.html
https://www.cs.uaf.edu/2017/fall/cs301/lecture/09_11_registers.html
https://reverseengineering.stackexchange.com/questions/10746/what-does-mov-qword-ptr-dsrax18-r8-mean