导语:Windows中的图标显示错误允许攻击者使用特殊图标伪装PE文件,从本地设备自动“借用”其他常用图标,从而诱惑用户点击它们。

1502253187622013.jpg

Windows中的图标显示错误允许攻击者使用特殊图标伪装PE文件,从本地设备自动“借用”其他常用图标,从而诱惑用户点击它们。这个漏洞目前已经根植在Windows的图像处理代码中了,根据我的分析,至少从Windows 7开始,该漏洞就已经出现,并且仍然存在于Windows 10的最新版本中。

我已经将该错误于2017年6月向微软正式报告了,而且本文对漏洞的分析也经过了微软的许可。

漏洞的发现

我在研究最近一批恶意PE文件时发现了这个漏洞,将文件从一个目录复制到另一个目录后,我注意到一个奇怪的行为,某些文件的图标已更改。为了排除是漏斗引起的错误,我将文件复制到另一个目录,结果还是和上次一样,这些文件的图标再次被更改为不同的常用图标且和本身的图标完全无关。这引起了我的兴趣,并促成了对这一奇怪现象的调查。

要了解此现象,请查看此视频观看全部过程:

 

2017年4月份的一批恶意软件包含了几十个cerber 勒索病毒的样品,所有这些样品都显示了这种异常现象。

以下是从这些示例中提取的图标,如Windows资源管理器中所示:

1502253206150035.png

乍一看,人们可能会认为这些只是一堆恶意软件伪装使用了一些常用图标(不过,左上角的Cybereason图标有点奇怪),但是将这些图标转换为不同的内部图像格式(internal image format),图标就显示了其真实形式:

1502253214147018.png

可以看出,这些文件几乎都经过了轻微的随机像素修改,表明它们是自动生成的,以避免基于图标的签名。原来的图标似乎有点奇怪,但是,它绝对是基于Adobe商标,且都是黑白的,但除此之外它是一个有效的图标文件。

以下就是原始的Adobe商标:

4.png

然而,虽然许多恶意程序使用被盗的资源来隐藏自己的安全应用程序以防止被人发现,但是出于这种目的的图标并不会是实际显示在屏幕上的图标。除了模仿Adobe图标之外,他们都有一个共同点,就是他们都是真正的单色图标(true monochrome icon TMI)。

TMI是具有两个特定特点的图标,它们只有两种颜色,即它们的像素比特数为1,这两种颜色是完全黑色(0x000000)和白色(0xFFFFFF)。应当注意,图标可以是具有其他颜色的单色,以及黑白但不是单色(即,bpp高于1)。但是,这种现象只发生在真正的单色图标上。

关于图标文件格式的完整文档可以在以下两个连接中找到:

https://msdn.microsoft.com/en-us/library/ms997538.aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx

这是一个从Cerber示例中提取的一个这样的文件:

5.png

实验表明,任何TMI都发生了图标切换异常,且都是在不需要特别处理的情况下发生的。为了证明这一点,我使用了十六进制编辑器制作了我自己的空TMI:

6.png

然后,我将该图标作为唯一的“hello world”应用程序的图标。而不是单像素单色图标,Windows资源管理器显示如下:

7.png

将其重命名在同一目录中后,显示的图标更改为:

8.png

9.gif

发生什么了?

图标伪装过程分析

看起来,问题始于渲染图标的缓存方式,特殊处理TMI接收,这使得它们不会覆盖现有的图标。

Windows资源管理器以及其他应用程序中的任何其他基于资源管理器的框架,使用comctl32.dll(用户体验控制库)中的CImageList类实现图标缓存:

https://msdn.microsoft.com/en-us/library/9xc4z2c7.aspx

缓存是通过将文件的路径映射到CImageList中的索引来实现的(有几个这样的缓存,每个图标都会显示大小)。因此,当查看过去已经呈现其图标的文件时,将从缓存中取出。进程中尚未遇到的路径将需要根据文件类型从头开始渲染,并添加到缓存中。这就是为什么当使用多个图标文件或具有嵌入图标的PE文件查看新目录时,文件会逐渐显示出来。当文件被复制或重命名时,它们的图标将被再次渲染,因为它们将被视为新路径。

然而,这些缓存都很有限且相对较小。当一个新的图标被添加到图像列表中,如果它还不是空的,则使用的索引将为-1,并且将附加新的图标。但是,一旦列表已满,新图标将覆盖之前创建的图标,将其替换为其索引(假定以LRU为基础)。

该逻辑在CImageList :: _ ReplaceIcon函数中实现:

10.png

根据给定的索引添加或替换:

11.png

经过以上一系列操作后,该函数将检查该索引处的当前图像是否具有Alpha通道,如果有(几乎总是有),则设置一个往后用于决定如何调用DrawIconEx的标志。

12.png

如果设置了这个标志,该函数稍后将使用标志DI_MASK而不是DI_NORMAL调用DrawIconEx来实际绘制列表中预先存在的图标。

13.png

在内部,图标和图像一般可能包含两个不同的像素图——“颜色”和“蒙版”,它们可以被应用于颜色的调制,如ICONINFO的文档所示:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms648052.aspx

本质上,只有图标的“掩码”部分被绘制并覆盖了掩码([esi + 7ch])的DC(设备上下文)而不是颜色的DC([esi + 78h])) 。当图标是TMI时,这实际上会导致没有新的像素被覆盖,并且图标的渲染还是借用在该索引处的CImageList。

这要求缓存是满的,且取决于这些函数的调用者。但是,对于类似浏览器的组件(例如“文件打开”对话框),大小通常非常小。

以下举个例子,显示这可能发生在使用这些组件的任何进程中。该例子是从Outlook 2016的“添加附件”窗口中截取的截图,可以查看完整的TMI的目录:

1502253323196906.png

当然,这个漏洞不仅会触发图标文件,也会触发嵌入它们的任何PE文件。条件是这些是文件中唯一的图标类型,因为选择“最佳拟合”图标的Windows的算法往往会根据大小和颜色深度由高到低的顺序排列嵌入图标。

既然如此,我决定在其资源部分搜索我的恶意软件数据库,其中只包含真正的TMI,并且可以从2013年开始(数据库中最早的样本)找到数百个样本。所有这些都无一例外地触发了这个漏洞,而在良性样本数据库中进行的类似搜索没有得到任何结果。

我根据使用的图标变化将这些样本分成几组:

15.jpg

如上所述,第一次检测是4月17日对Cerber 勒索病毒样本滥用了Adobe图标。以下是五个这样的样品:

16.png

https://www.virustotal.com/en/file/10b2fd1e06c3ac73d23e67bb59c4294cef8485bdc1b116005c56bfb950f21e44/analysis/

https://www.virustotal.com/en/file/4559b52596deb7a8181df722bebcf08921b97451d944840cf6bdf0c04c1bc364/analysis/

https://www.virustotal.com/en/file/bf66c5ccfa0319fe695d8fe5afcb5492c909aff70748b550259ac20974a18f80/analysis/

https://www.virustotal.com/en/file/f2bf40f15b44a28be2d9ff5c1572a84c6ba5a8942d6c1a01aa44db51aa2d1ccb/analysis/

https://www.virustotal.com/en/file/f7c15cb91ddaebf03f523e4eed412377217b511ee8f37ba99a8d8b7832f227df/analysis/

这些样本可能只是一小部分自动生成的PE文件,附带伪随机资源来掩盖它们,不过很难确定该漏洞从未被Cerber故意利用。

这个漏洞虽然不是一个重大的安全漏洞,但很可能出现网络钓鱼活动。对于网络钓鱼,大家可能习惯性的认为只有可疑的电子邮件和附件才能进行,读了今天的这篇文章,想必你的思路又拓宽了不少。

源链接

Hacking more

...