Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

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

漏洞的发现

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

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

 

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

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

以下就是原始的Adobe商标:

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

然而,虽然许多恶意程序使用被盗的资源来隐藏自己的安全应用程序以防止被人发现,但是出于这种目的的图标并不会是实际显示在屏幕上的图标。除了模仿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示例中提取的一个这样的文件:

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

发生什么了?

图标伪装过程分析

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

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

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

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

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

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

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

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

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

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

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

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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

Microsoft图标显示错误,攻击者可任意隐藏恶意PE文件

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故意利用。

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




原文发布时间为:2017年8月10日
本文作者:xiaohui
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
SQL 数据库
Microsoft SQL Server 2000数据还原
Microsoft SQL Server 2000还原数据操作流程 1、开始 - 所有程序 - Microsoft SQL Server - 企业管理器(如图1-1)。
1054 0
|
SQL 数据库
Microsoft SQL Server 2000数据附加
Microsoft SQL Server 2000附加数据操作流程 1、开始 - 所有程序 - Microsoft SQL Server - 企业管理器(如图1-1)。
1057 0
|
SQL 数据库 Windows
Microsoft SQL Server 2008数据还原
Microsoft SQL Server 2008还原数据操作流程 1、开始 - 所有程序 - Microsoft SQL Server 2008 R2 - SQL Server Management Studio(如图1-1)。
1073 0
|
SQL 数据库 Windows
Microsoft SQL Server 2000数据库备份
Microsoft SQL Server 2000备份数据操作流程 1、开始 - 所有程序 - Microsoft SQL Server - 企业管理器(如图1-1)。
1181 0
|
SQL 监控 数据库
Microsoft SQL Server 2008清理LDF日志
Microsoft SQL Server 2008 LDF数据文件清理方法。 PS:由于该操作涉及数据库中的数据,请在操作前先做好数据备份。 准备:Microsoft SQL Server 2008清理LDF脚本,请点击下载获取。
1626 0
|
SQL 数据库 Windows
Microsoft SQL Server 2008修改混合模式
数据库身份验证SQL Server和Windows设置 1、开始 - 所有程序 - Microsoft SQL Server 2008 R2 - SQL Server Management Studio(如图1-1) 图 1-1 2、进入后会弹出窗口【连接到服务器】,在【身份验证】选择中【Windows身份验证】— 点击【连接】(如图1-2) 图 1-2 3、在数据库服务实例名(如图1-3,WIN-VQ5SKTLJ9EU\sql位置)点击鼠标右键【属性】。
1149 0
|
SQL 数据库 数据安全/隐私保护
Microsoft SQL Server 2008修改sa密码
数据库sa密码忘记处理方案 1、开始 - 所有程序 - Microsoft SQL Server 2008 R2 - 点击SQL Server Management Studio(如图1-1)。
1482 0
|
SQL 数据库 数据安全/隐私保护
Microsoft SQL Server 2000修改sa密码提示错误:2812
报错提示:错误 2812:未能找到存储过程 ‘ sp_password ’。 准备:存储过程修复脚本,请点击下载获取。下载完毕后,请放置C盘根目录并解压。
1062 0
|
SQL 数据库 Windows
Microsoft SQL Server 2000修改混合模式
数据库身份验证SQL Server和Windows设置 1、开始—所有程序—Microsoft SQL Server—企业管理器,进入Microsoft SQL Server 2000数据库中(如图1-1)。
1146 0
|
SQL 数据库 Windows
Microsoft SQL Server 2000收缩MDF数据
Microsoft SQL Server 2000 MDF数据文件清理方法。 PS:由于该操作涉及数据库中的数据,请在操作前先做好数据备份。 准备:Microsoft SQL Server 2000收缩MDF脚本,请点击下载获取。
1095 0