背景
2020年8月12日,微软发布了8月份的漏洞风险通告。通告中一个显示已被公开披露和在野利用的漏洞进入了我们的视野。该漏洞编号为CVE-2020-1464,其被描述为Windows验证文件数字签名时存在一个欺骗漏洞,攻击者若成功利用此漏洞可以绕过Windows数字签名安全验证并加载执行未正确签名的恶意文件。而在真实攻击情形中,攻击者利用该漏洞可能会绕过防止加载未正确签名文件的安全软件(如杀毒软件等)。
红雨滴团队研究人员在经过补丁对比分析后发现,该漏洞疑似为VirusTotal在2019年1月公开的针对.MSI(Windows Installer文件)文件数字签名验证绕过的攻击利用技术[2]。而在文章发布近一年半后,微软终于修复了该问题。我们在VirusTotal上也发现了数十个利用该漏洞的在野样本,随后奇安信威胁情报中心也第一时间在安全社区[1]公开了该漏洞的相关信息。
https://twitter.com/RedDrip7/status/1294225309336707072
漏洞原理
红雨滴团队研究人员通过补丁对比分析后发现,该漏洞原理为Windows在验证.MSI文件的数字签名时未对MSI文件的附加数据(复合二进制文件以外的数据)进行校验,这样在拥有合法数字签名的MSI文件尾部增加其它数据后,该文件也能通过Windows的签名验证:显示数字签名正常。
而如果在拥有合法数字签名的MSI文件尾部附加比如一个恶意的.jar(JAVA可执行文件)文件后,再将该文件重命名为.jar后缀。由于JAVA运行时环境对.jar文件的宽松解析特性,此时双击执行该文件将会执行文件末尾附加的恶意.jar文件,从而可能绕过安全软件的检测进而分发恶意软件。当然如果有其它类型文件也拥有这种宽松解析特性,那也可以用于利用该漏洞进行类似攻击。
补丁分析及修复原理
我们通过分析8月份Windows 7和Windows 10的补丁文件后发现,被修复的msisip.dll文件可能是CVE-2020-1464漏洞所在的文件。
使用BinDiff对比补丁前后的msisip.dll,发现补丁后的msisip.dll!MsiSIPVerifyIndirectData函数内新增了两个判断逻辑(NeedFileSizeVerification和VerifyFileSize)。
NeedFileSizeVerification函数为一个检测开关,决定是否调用VerifyFileSize对MSI文件进行检查。如果在指定的注册表键下存在指定的值,则关闭此开关,默认为开启状态。
VerifyFileSize函数会对MSI文件进行具体的检查。该函数会初始化CFBFileFormatCheck类,并调用其中的VerifyFileSize成员函数。
CFBFileFormatCheck::VerifyFileSize函数首先调用该类的另一成员函数GetDiscFileSize检测该文件大小是否非零,然后调用GetCFBFileSize成员函数做进一步的检查。
CFBFileFormatCheck::GetCFBFileSize函数中会解析MSI的头部,并判断MSI中核心的头部字段是否有效。
通过奇安信威胁情报中心研究人员的分析,补丁增加的函数主要检测了以下的字段:
NumFatSects不能为0
NumFatSects不能为-5、-4、-3、-2、-1
FirstDIFATSectorLocation不能为0
NumberOfDIFATSectors不能为-5、-4、-3、-2、-1
MajorVer必须为4
SectorShift必须为12
MiniSecShift必须为6
DIFAT中的有效扇区数量必须小于或等于NumFatSects
MSI文件的大小必须是(2^SectorShift)的整数倍
MSI文件的大小必须大于2*(2^SectorShift)
DIFAT有效扇区中对应的最大SID值必须等于(MSI_FileSize/(2^SectorShift)-2)
归根结底,补丁的作用是为了防止在MSI文件末尾附加数据,如果附加了其它的数据,则当前的MSI签名验证将无法正确验证通过。
在野利用分析
我们通过奇安信大数据分析平台查找到一例疑似最早在VirusTotal上出现的利用该漏洞的在野样本:
https://www.virustotal.com/gui/file/0f4238c3b41b99fd94f264b0df5b0400906a7e20af82107476dca4723aeb66bf/detection
该样本初始上传时也仅有6家杀软能够查杀:
上述样本在未打2020.08月补丁前,是具有欺骗效果的。右键查看选项卡中的数字签名,可看到其拥有微软官方的数字签名,且数字签名正常。
不仅如此,使用低版本的SigCheck也会有签名欺骗的效果。2019年的一篇通告中指出微软和VirusTotal达成合作,对SigCheck2.70及以后的版本加入了对MSI篡改的检测,所以使用SigCheck2.70之前的版本将不会对这类漏洞利用样本有任何提示。
使用SigCheck2.70之后的版本对利用该漏洞的MSI文件进行签名检测,会提示文件大小无效。
在打上2020.08月的补丁后,右键查看选项卡中的数字签名将提示无效。
POC构造
利用该漏洞的样本极容易构造,只需要找到一个有正确数字签名的.MSI文件(比如拥有微软数字签名的文件),然后将恶意的JAR文件附加到MSI文件末尾,并将文件后缀修改为.jar。此时的JAR文件将拥有微软的正常签名,但是一旦双击该文件,恶意的JAR将会执行。
公开披露
其实,早在2019年01月,VirusTotal便在其的一篇技术分析报告中(https://blog.virustotal.com/2019/01/distribution-of-malicious-jar-appended.html)详细描述了MSI签名欺骗漏洞。报告中明确指出微软当时并没有修复该漏洞的打算。但是现在微软突然修复了此漏洞,即使此漏洞不是所谓的CVE-2020-1464,也足以让人匪夷所思了。
也许这也是微软在CVE-2020-1464的安全通告中描述该漏洞为已公开披露的原因吧。
IOCs
VirusTotal上利用该漏洞分发恶意程序的文件MD5
0cbd9fedd37dc083765344678eb1afa2
1e6b3a2d8a5ceeaa007a45b3909bcc79
7518b1c88fd6a4477d2e65925eab9a24
43b074d8b331a66e1696eecf6c79e6f9
db0d40c9576f491f26e485233e4d1b80
bc4156817ce79bb4310c1469a6cca247
355bc242cce2044bdf9ba7478a58ea08
efa71fc71b9335e6b634b86b0dd7a41c
03dcba3432021b00ee282efcb52af2d1
3e16acf1d60041f18a2506a82a4d0476
b01fb4466de75ff9c1d3013282d32f41
9012770b1838b6ed23ac7a44dcfef171
96929921fafb080c2a914420c6854932
b7b7b6ffd677bd506ca070b330be69cc
65a137d42ab4a2e88af0c517dea6550f
f9fd811b038a75c8023e9dce36e9ecc8
5f58de5832ae9f469eb52c89b86cf455
fec9c5147054a2c45436a484be7539ec
4feb40630168235000b8549ea5dec8b8
a4a64df68cf763c840552dd9d1c9b302
10db29d53d0862fdc14fb75f5977efe6
1c809ccea3274496793140eb11de0bcb
42444b12fd202fc0d234a35d00c9f567
c6353085aed4f2c07d5b1e9226f390d7
f5b66ded098b9036022a520c51f95446
76a26b83e203b4c279b5913fa7ae5e7e
372e36765f5a6b21919cddf46f871dbf
d9a89aaa631673357d4e2af5e584513b
a91e3c41de82c201ce0351d5b595c378
5c4c1ed91cd32ff49e1ca7086d594217
5c3548fe4f439dd017d3c84b82285c3c
5d9b0569a3b9563af27a838af7a18d21
1d941c4dee6f9770acc3cc59e5983f86
f8bfa1f0ed2de5c7fccbef1687024d56
84c04a9757b164bdcd544370647ff3b7
0126910bb1a81205b579b0bad9fe1071
f49f5381335ac2de02ddbb21ecce5317
8a8c6e2b6f5cd7d3a940fec0a8b42637
d19dcae454266045083a6e66c256c782
94220f1326e2fce70abebafcd44dde66
参考链接
[1]. https://twitter.com/RedDrip7/status/1294225309336707072
[2]. https://blog.virustotal.com/2019/01/distribution-of-malicious-jar-appended.html