导语:本文分析了CVE-2018-4878漏洞利用过程中的Adobe Flash保护机制绕过技术。

由于Adobe采取多种措施来加强Flash的安全性,因此Flash Player漏洞的数量最近有所下降。然而,漏洞总是无法避免。1月31日,Kr-Cert报告了一个0day漏洞,编号CVE-2018-4878(Adobe已发布了修复此漏洞的补丁),目前已发现公开利用。我们分析了该利用程序并发现它绕过了为阻止Flash中“长度破坏”攻击而引入的字节数组缓解功能。本文将重点讨论漏洞利用如何绕过长度检查。

一、工作原理

此漏洞已经被用于有针对性的攻击,通过在Microsoft Office Excel中嵌入Flash文件的形式出现。打开Excel文件时,Flash文件会连接服务器并请求密钥。一旦接收到密钥,该文件将解码另一个嵌入的Flash文件,这才是实际的漏洞利用。

密钥为100字节,使用loader.loadbyte函数解码和加载嵌入文件:

由于密钥的URL处于离线状态,因此我们无法获取它。但样本Hash可在多个网站上在线获取。我们分析了样本(SHA-256) 1a3269253784f76e3480e4b3de312dfee878f99045ccfd2231acb5ba57d8ed0d.

此Adobe .SWF文件包含多个ActionScript 3文件以及BinaryData部分中的两个嵌入文件,构成了shellcode(在下图屏幕中标记为红色):

二、攻击行动中的利用程序

启动时,利用程序检查系统是否正在运行Windows。如果是,就会触发漏洞。

正如我们在前面的图片中看到的,该利用需要几个步骤:

· 创建一个mediaplayer对象

· 将mediaplayer的drmManager属性初始化为基于DRMOperationCompleteListener对象nugamej的特定类。

· 对象nugamej被释放,但drmManager指向之前nugamej使用的内存位置

仔细看nugamej,可以看到它是由实现DRMOperationCompleteListener类的Rykim类创建的。Rykim类具有各种uint变量,其值设置为0x1111,0x2222等:

这些变量稍后将用于访问进程空间和其他操作中的各种地址。

之后,利用程序通过Localconnection().connect产生的异常,创建Rykim类的新变量katyt,并实现DRMOperationCompleteListener类。时间检查调用cysit函数:

Cysit检查新分配对象的a1变量是否为0x1111,如果该值不等于0x1111,则cysit终止计时器并继续进行利用。

漏洞利用创建另一个类型为Qep的对象kebenid,它扩展了字节数组类。 kebenid的长度为512字节。稍后将修改此值,使读写权限扩展为对进程内存的无限制访问。

三、字节数组检查以避免损坏

我们可以从https://github.com/adobe/avmplus/blob/master/core/ByteArrayGlue.h看到字节数组的结构:

可以看到字节数组类具有array、 capacity及length。之前,有攻击者破坏长度变量以便任意读写内存。因此有额外的检查来确保字节数组的完整性。该检查会创建一个密钥,与array/capacity/length 异或后保存在变量check_array/check_capacity/check_length中。当访问这些变量时,它们与密钥异或,并将异或的值与存储在check_array/check_capacity/check_length中的值进行比较。如果匹配,那么数据真实; 否则抛出一个错误,如下图所示:

四、绕过检查

从前面的代码,可通过简单地使用以下任一方法来获取密钥:

· Array ^ check_array = key

· Capacity ^ check_capacity = key

· Length ^ check_length = key

· https://github.com/adobe/avmplus/blob/master/core/ByteArrayGlue.h

如果copyOnWrite的值是0,那么密钥为check_copyOnWrite。

如果仔细观察,可以看到katyt和kebenid对象变量都指向相同的内存。如果我们打印并比较两个对象的变量,可以证实这一点。

如前所述,将以下变量与字节数组进行比较,我们得到以下结果:

所以如果改变katyt.a24和katyt.a25,实际上就会改变字节数组的capacity和length。然后只需找到异或的密钥,就可以将其设置为我们想要的任何长度。因此,此漏洞利用通过Array ^ check_array = key计算密钥。

一旦密钥可用,我们可以轻松地将字节数组的capacity和length修改为0xFFFFFFFF和check_length,从而绕过字节数组安全缓解措施,并可在进程空间的任何地方读取或写入:

五、代码执行

漏洞利用通过字节数组对象获得的读写权限,读取内存并搜索kernel32.dll以及诸如VirtualProtect和CreateProcessA之类的函数。一旦找到这些函数的地址,就可以在系统上执行shellcode。此技术在网上有很好的介绍。以下截图显示了负责搜索kernel32.dll的代码,之后将VirtualProtect API地址定位为0x75ff2c15:

然后,漏洞利用将执行shellcode,连接URL:

使用 CreateProcessA启动cmd.exe:

Shellcode检测部分杀毒产品:

六、结论

攻击者不断寻找绕过新保护机制的方法。此利用程序就显示了这样一种方式。与往常一样,我们建议读者在打开电子邮件中的未知附件和文件时要小心。

McAfee Network Security Platform客户通过签名ID:0x45223900免受此漏洞利用的侵害。

七、IOC

Hash

SHA-256: 1a3269253784f76e3480e4b3de312dfee878f99045ccfd2231acb5ba57d8ed0d

URLs

· hxxp://www.korea-tax.info/main/local.php

· hxxp://www.1588-2040.co.kr/conf/product_old.jpg

· hxxp://1588-2040.co.kr/conf/product.jpg

源链接

Hacking more

...