陈霄(1995-), 男, 博士生, 主要研究领域为系统安全, 虚拟化安全, 网络安全
肖甫(1980-), 男, 博士, 教授, 博士生导师, CCF高级会员, 主要研究领域为传感网, 物联网
沙乐天(1985-), 男, 博士, 副教授, 主要研究领域为软件安全, 网络安全, 物联网安全
王众(1999-), 男, 本科, 主要研究领域为软件安全, 物联网安全
底伟鹤(1998-), 男, 本科生, 主要研究领域为软件安全, 物联网安全
动态链接库(dynamic link library, DLL)的出现给开发人员提供了极大的便利, 也提高了操作系统与应用程序之间的交互性. 然而, 动态链接库本身存在的安全性隐患不容忽视, 如何有效地挖掘Windows平台下安装程序执行过程中出现的DLL劫持漏洞是当下保障Windows操作系统安全的关键问题之一. 搜集并提取大量安装程序的属性特征, 从安装程序、安装程序调用DLL模式、DLL文件本身3个角度出发, 使用双层BiLSTM (bi-directional long short-term memory)神经网络进行学习, 抽取出漏洞数据集的多维特征, 挖掘DLL劫持未知漏洞. 实验可有效检测Windows平台下安装程序的DLL劫持漏洞, 共挖掘10个未知漏洞并获得CNVD漏洞授权, 此外通过和其他漏洞分析工具进行对比进一步验证该方法的有效性和完整性.
The emergence of the dynamic link library (DLL) provides great convenience for developers, which improves the interaction between the operating system (OS) and applications. However, the potential security problems of DLL cannot be ignored. Determining how to mine DLL-hijacking vulnerabilities during the running of Windows installers is important to ensure the security of Windows OS. In this paper, the attribute features of numerous installers are collected and extracted, and the double-layer bi-directional long short-term memory (BiLSTM) neural network is applied for machine learning from the perspectives of installers, the invocation modes of DLL from installers, and the DLL file itself. The multi-dimensional features of the vulnerability data set are extracted, and unknown DLL-hijacking vulnerabilities are mined. In experiments, DLL-hijacking vulnerabilities can be effectively detected from Windows installers, and 10 unknown vulnerabilities are discovered and assigned CNVD authorizations. In addition, the effectiveness and integrity of this method are further verified by comparison with other vulnerability analyzers.
随着个人电脑的快速普及, Windows操作系统迅速占领市场, 总体份额也在不断提升. 然而, 其自身设计所存在的安全问题也随之不断凸显, 威胁系统和用户的安全. 作为Windows系统的核心组件之一, 动态链接库(dynamic link library, DLL)用于提高软件开发人员的软件编写水平和软件运行效率, 不仅可以提高内存使用效率, 也可以实现对关键技术的保护, 但也引入了较大的攻击面.
目前针对动态链接库的攻击主要分为DLL注入、DLL劫持、DLL侧加载等, 以上攻击行为主要利用DLL机制存在跨进程加载、优先搜索应用程序目录以及缺少验证等缺陷, 对应用程序和操作系统造成破坏, 严重威胁程序和系统安全. 其中DLL注入本来是软件用于向其他程序添加扩展功能、调试或逆向工程的一种合法技术[
根据DLL劫持产生的方式可将其划分为以下几种, 如
DLL劫持3种方式
第一, 针对安装程序进行DLL劫持攻击. 安装程序即应用程序的安装软件, 用来在主机上执行安装操作. 通过网络下载安装程序时, 用户通常不会修改其所在目录, 攻击者可以在获取到该目录的前提下, 伪造恶意DLL文件供安装程序在安装时进行调用, 从而实现恶意DLL加载, 攻击系统安全. 第二, 针对应用程序原生目录进行DLL劫持攻击. 应用程序安装包在执行完安装操作后, 会在主机上的某个目录下存放所有的文件, 该目录即为原生目录. 原生目录中不仅有该应用程序可执行的文件, 也包括了程序正常执行过程中所需的DLL文件. 应用程序在运行时会找寻特定名称的DLL文件, 而攻击者可以通过伪造一个恶意的同名DLL文件并释放到原生目录, 实现DLL劫持攻击, 从而制作程序外挂或者进行免杀. 第三, 针对文件关联进行DLL劫持攻击. 操作系统上各种类型文件都有一个与之关联的默认处理软件. 当某个文件被打开时, 操作系统会自动创建一个进程来处理该文件, 进程对应的程序就是该文件类型关联的默认处理程序, 进程的当前目录就是被打开文件所在的目录. 如果进程在处理该文件的过程中, 需要加载一个系统中并不存在的DLL文件, 例如执行特定扩展功能的DLL, 则攻击者可以通过伪造该恶意的DLL文件到音视频、文本等文件所在目录, 进程最终会搜索到文件所在目录, 进而加载该恶意DLL, 形成DLL劫持. 3种DLL劫持方式的差异如
3种DLL劫持方式对比
劫持方式 | 目标对象 | 攻击前提 | 攻击方式 | 限制条件 | 触发难度 |
安装程序型 | 网络下载的安装程序 | 获取安装程序所在目录进行读写 | 预先放置同名恶意DLL到下载目录中, 执行安装时进行劫持 | 安装程序和DLL在同一目录 | 低, 下载目录通常已知且权限低 |
应用程序原生目录型 | 应用程序安装后所在原生目录 | 获取原生目录并进行读写 | 预先放置同名恶意DLL文件到原生目录中, 程序执行时进行劫持 | 通常为系统级
|
高, 原生目录未知且权限高 |
文件关联型 | 音视频、文本等常见文件 | 提前了解文件默认打开方式; 确保进程目录、系统目录、Windows目录下都不存在该DLL文件; 获取文件所在目录进行读写 | 预先放置同名恶意DLL文件到文件所在目录, 默认处理进程执行时搜索该DLL, 最终执行当前目录下的恶意DLL | 部分系统环境下不存在特定DLL文件 | 高, 文件默认打开方式未知且环境不可控 |
从
如
安装程序DLL劫持漏洞攻击示意图
然而, 现有的DLL安全研究很少有直接针对DLL劫持漏洞的挖掘与分析, 相关工作主要集中在以下两个方面: 一方面是通过代码插桩、API Hook等技术实现对DLL注入、DLL侧加载等攻击的防御; 另一方面则主要是通过监控DLL文件的调用或者验证DLL文件的合法性进行恶意软件的检测. 虽然DLL劫持漏洞由来已久, 但是相关工作呈现零散化的状况, 真正针对该漏洞进行挖掘分析的研究较少.
工业界相关工具根据DLL劫持漏洞的原理, 通过动态分析来获得程序运行时加载的DLL文件列表, 进而判断目标DLL能否被劫持. 该方法较为直观, 但是使用比较复杂, 并且只考虑DLL文件路径这一唯一属性, 漏洞覆盖面较窄, 效率较低且通用性不强. 尤其针对安装程序DLL劫持漏洞的挖掘不够深入, 粒度不够细致, 难以实现对大规模安装程序的高效率漏洞挖掘与安全分析.
安装程序DLL劫持型漏洞主要涉及到安装程序、调用DLL模式和DLL文件3个方面, 基于DLL文件路径只能覆盖一定范围漏洞, 而在其基础上加入安装程序自身的多维属性和调用DLL模式的不同维度, 能够使得对漏洞研究对象的描述粒度更加具体, 不仅可以覆盖之前单纯基于DLL文件路径属性所挖掘的漏洞, 而且能够利用神经网络来寻找研究对象3方面的多维属性与漏洞的深层次映射关系, 并且神经网络可以在多次迭代中自动调整每个属性的具体权重, 实现漏洞挖掘的全面性和高覆盖性. 此外, 存在漏洞的安装程序本身的一些属性也存在共性信息, 单纯考虑DLL路径可能会缺失一些漏洞, 而基于已知漏洞可以分析出不同属性的安装程序执行安装所调用的DLL文件大体范围与种类, 相对于已有工具, 能够节省大量时间, 效率更高.
因此, 基于上述分析, 目前亟待提出一种针对Windows平台下安装程序DLL劫持的漏洞挖掘与分析方法, 从安装程序、调用模式以及DLL文件的属性角度分析相关漏洞与缺陷, 为安装程序的安全加固及DLL劫持漏洞的高效防御提供研究依据.
本文实现了一种基于双层双向长短时记忆网络 (bi-directional long short-term memory, BiLSTM)的Windows平台安装程序DLL劫持的漏洞挖掘及验证系统BiL-DLLMining. 通过对目前已知存在DLL劫持漏洞的EXE文件和尚未挖掘到漏洞信息的EXE文件进行分析, 从静态和动态的角度抽取属性特征, 同时对属性进行归一化, 使得各属性类型一致. 建立双层BiLSTM神经网络, 训练所有EXE文件的自然属性与漏洞情况的映射关系, 获取存在劫持漏洞的EXE文件属性特征集. 训练存在漏洞的EXE文件属性与DLL调用的映射关系, 获取可劫持DLL属性特征集, 最终综合两个特征集, 挖掘出若干未知的DLL劫持漏洞, 为Windows平台安装程序与动态链接库的安全风险评估提供重要的技术支撑.
本文第1节对相关研究工作进行介绍. 第2节简单分析一下DLL劫持漏洞的原理. 第3节给出关于EXE文件和DLL文件的相关属性集合, 并且对EXE文件的保护机制给出判定规则. 第4节详细介绍本文提出的基于双层BiLSTM的DLL劫持漏洞挖掘及验证系统BiL-DLLMining, 主要包括安装程序漏洞特征判决模型和可劫持对象判决模型两部分. 第5节通过实验来分析BiL-DLLMining的效能. 第6节对工作进行总结, 并对不足之处进行分析和讨论.
本文所提出的DLL劫持漏洞挖掘方法, 主要针对Windows平台的安装程序和其调用的DLL文件进行属性抽取与调用关系映射分析, 所采用的神经网络为双层BiLSTM网络. 其中安装程序为EXE文件, 即可执行文件(executable file), 而神经网络不仅在图像分类、人脸识别等领域有所应用, 在入侵检测、系统漏洞挖掘等安全方面也应用广泛. 因此相关研究工作主要包括以下几个方面: 第一, 恶意可执行文件分析与检测; 第二, 动态链接库安全研究; 第三, 基于神经网络的攻击检测与漏洞挖掘.
对于恶意可执行文件的分析与研究, 主流的方法可以分为动态/静态分析和机器学习两大类. 具体来看, 动态与静态分析主要从可执行文件的代码属性特征、控制流程图、网络流量交互等方面入手, 建立恶意可执行文件判决规则. 文献[
使用机器学习相关算法进行恶意可执行文件的检测, 主要利用不同算法对于可执行文件关键特征的高效分析能力, 可以大幅度提高传统检测的效率与准确率. 文献[
总体而言, 对恶意可执行文件的研究一直围绕着文件自身的属性展开, 通过对关键属性的抽取, 动态、静态分析与机器学习算法相结合, 最终实现对不同平台下恶意可执行文件的高效分析与检测. 因此后续对于恶意可执行文件的研究以及可执行文件本身的缺陷检测, 可以继续从文件自身入手, 将自身属性作为研究的出发点.
目前有关动态链接库的安全研究主要聚焦在DLL注入、DLL劫持、DLL侧加载等攻击及防御技术的演进. 文献[
具体到DLL劫持相关安全研究, 文献[
综上所述, 目前对于DLL劫持漏洞的研究较少, 尚无针对该漏洞本身的挖掘与分析方法. DLL劫持漏洞与DLL注入以及DLL侧加载相比, 存在着较大差异性, 针对DLL注入或者DLL侧加载等方面的研究不具备通用性, 无法准确移植到DLL劫持漏洞的挖掘上. 目前需要对DLL劫持漏洞投入更多研究, 保障系统的安全和稳定.
近些年来, 随着深度学习的快速发展, 越来越多的领域开始尝试使用深度学习的方法来解决分类及识别问题. 作为神经网络的一部分, 循环神经网络(recurrent neural network, RNN)与长短时记忆网络(long short-term memory, LSTM)能够处理任意输入序列长度, 建模多时间尺度的序列关系, 十分适合于学习和抽取序列数据中的特征和模式, 在自然语言处理、语音图像等多个领域均有非常广泛的应用.
目前使用RNN、LSTM等神经网络进行攻击检测和漏洞挖掘, 已经成为安全人员研究的重点和热点, 其中利用神经网络来提高网络入侵检测系统的检测率尤为突出. 文献[
神经网络不仅仅被应用在提高入侵检测准确率方面, 还在其他方面发挥着重要作用. 文献[
基于神经网络进行软件攻击检测和漏洞挖掘, 一直都是安全研究的热点, 但是目前利用神经网络进行动态链接库漏洞挖掘的研究匮乏, 需要更好地利用神经网络的特性, 发挥神经网络在动态链接库漏洞挖掘上的作用.
本文基于上述研究现状, 抽取EXE文件和DLL文件的属性特征, 生成属性特征序列, 利用LSTM神经网络在处理序列数据方面的优势, 构建双层BiLSTM神经网络, 对训练集进行学习, 并用测试集进行验证. 通过不断调整和优化相关参数, 挖掘EXE属性和可被劫持的DLL文件属性之间深层映射关系, 从而实现对安装程序漏洞特征的判定, 进而通过神经网络训练可被劫持动态链接库对象模型, 并对发现的漏洞进行验证, 最终构建漏洞挖掘与验证的原型系统, 实现对DLL劫持漏洞的分析与挖掘, 保障计算机系统的稳固和安全.
在Windows系统中, 如果进程加载某个DLL时发现路径未知, 则会按照系统的默认搜索顺序到对应的目录下进行DLL文件搜索, 一旦在某个目录下通过DLL名匹配到该DLL文件, 则会直接加载该DLL, 并且停止对后续目录的查找操作. 这种搜索并加载DLL的方式在一定程度上简化了应用程序对DLL的调用, 但也带来了很多风险. 如
DLL劫持漏洞原理图
由
为了缓解这一问题, 从Windows XP sp2开始, SafeDllSearchMode机制被提出. 由
本文研究的是Windows 10系统下针对安装程序的DLL劫持漏洞挖掘, 即安装程序在执行正常安装过程中调用DLL文件而出现的劫持行为. 用户通过网络下载的EXE安装程序会存放在某个特定的文件夹中, 而该文件夹的权限是普通用户级别的, 因此攻击者可以获取到该文件夹的路径, 伪造一些不在KnownDLLs中的恶意DLL文件, 并且加入大量恶意代码或者病毒木马程序. 当用户按照正常的操作流程, 打开该文件夹并点击EXE安装程序时, 安装进程会通过操作系统来寻找安装所需的DLL文件, 而当前目录下的恶意同名DLL文件会被匹配到, 并直接返还给安装进程, 导致恶意代码被加载, 给系统造成一定的安全风险.
微软在2010年8月23日发布的2269637号安全公告, 首次提到多个版本的操作系统存在DLL劫持的缺陷, 可能导致远程攻击, 随后DLL劫持漏洞开始大规模传播, 不断威胁着计算机系统的安全. 由于DLL文件在Windows操作系统中的基础性作用, 无论是安装一个程序, 还是执行一个文件, 都会涉及到对DLL的调用操作, 因此如何保证DLL文件的安全性是保障系统安全的一个关键点.
为了更加准确地描述安装程序加载动态链接库文件的具体过程与操作, 本文分别对安装程序EXE、动态链接库DLL文件和EXE调用DLL的模式3方面进行研究. EXE文件是应用程序执行安装操作的主体, 需要首先进行研究. 通过对Windows平台上大量安装程序的分析发现, 对EXE进行属性划分, 可以高精度地描述某一个EXE的特征, 而具体属性可以分为功能类别、保护机制等. 通过多个维度的属性判决, 进而综合各属性取值, 可以精确描述EXE的信息. DLL文件作为应用程序执行安装操作的客体, 也需要通过类似的属性划分方式进行定量描述. 为了更加细粒度的分析DLL文件情况, 本方法对DLL劫持中涉及到的DLL文件进行归纳整合, 避免了对系统中所有DLL文件进行大规模分析带来的低效率问题, 提高了实际安全研究的效率. 针对DLL劫持中涉及到的某个DLL文件, 通过叠加生成类别、目录属性、地址级别等属性的取值, 可以达到最大限度的特征描述, 方便对具有特定特征的某一个或某一类DLL文件进行定位. 此外, 安装操作是EXE和DLL之间动态的调用过程, 因此不能完全将两部分孤立开来. 第3部分即是对EXE调用DLL的模式进行属性划分, 主要考虑EXE在执行安装操作时所处系统级别和加载DLL文件的方式. 通过综合这两个方面的信息, 可以更加准确地描述调用的过程.
具体定义内容与属性取值如下.
本文定义EXE的属性集合为EXE.Attribute (EXE.A), 包括: 功能类别, 保护机制, 动态特征, PE内容, 漏洞属性. 以下给出各项的具体内容.
(1)功能类别(function category, EXE.fc). 根据EXE安装程序具备的主要功能, 具体可分为以下几种: ① 输入法类(inputting type, it); ② 下载类(download type, dt); ③ 浏览器类(browser type, bt); ④ 音乐类(music type, mt); ⑤ 办公类(office type, ot); ⑥ 游戏类(game type, gt); ⑦ 视频类(video type, vt); ⑧ 社交类(social type, st); ⑨ 解压刻录类(decompression type, det). 不同类别的应用程序由于所执行的功能不同, 安装程序在安装阶段所调用的DLL文件也存在着差别, 例如音乐类的安装程序会调用Linkinfo.dll、Cscapi.dll等, 而浏览器类安装程序则会调用WindowsCodecs.dll、Msls31.dll等, 因此该属性需要首先考虑.
(2)保护机制(protection mechanism, EXE.pm). 根据EXE安装程序自身所带的安全保护机制, 具体可分为以下几种: ① 加壳Shell; ② 序列号保护serial number ptotection; ③ 完整性检验integrity check; ④ 时间限制time limit; ⑤ 功能限制function limit; ⑥ 信息隐藏information hiding; ⑦ 加密算法encryption algorithm; ⑧ 花指令junk code; ⑨ 反调试anti-debug; ⑩ 反跟踪anti-trace; ⑪ 自修改代码 (self modifying code, SMC)技术; ⑫ 多态变形Polymorphic and metamotphic. 保护机制会限制对于EXE文件的静态和动态分析, 因此需要优先进行研究.
(3)动态特征(dynamic feature, EXE.df). 通过本地或在线的沙箱环境对EXE安装程序进行动态分析, 提取动态特征信息, 主要包括以下几类信息: ① 文件操作(file operation, fo), 包括文件查找、文件读写、文件建立、文件删除等; ② 注册表操作(registry operation, ro), 包括注册表条目查找、注册表写入删除等; ③ 网络流量(network flow, nf), 主要包括安装过程中读取、发送与接收网络请求等; ④ 系统交互(system interaction, si), 主要包括读取系统信息、读取用户输入等.
(4) PE内容(pe content, EXE.pc). 根据安装程序在静态环境下DLL文件路径, 具体可分为以下几种: ① 全部为绝对路径情况(all-absolute-paths, aap), 主要指各DLL都为绝对路径; ② 存在非绝对路径情况(non-absolute-paths, nap), 主要指存在一些DLL, 其路径没有给出绝对地址.
(5)漏洞属性(vulnerability attribute, EXE.va). 基于目前已知存在DLL劫持漏洞的EXE文件信息, 对EXE数据集进行划分, 具体包括: ① 已知存在漏洞(known vulnerability, kv), 主要包括CVE、CNVD等平台上已知漏洞号; ② 尚未发现漏洞(no vulnerability found, nvf), 指实验前尚未在互联网上存在DLL劫持漏洞信息.
软件保护机制是软件开发者为了保护软件不被静态逆向分析和动态调试的有效措施, 具体包括加壳、序列号保护、花指令、信息隐藏、反调试等. 由于网络下载的EXE安装程序种类繁多, 功能各异, EXE安装程序本身可能存在各种保护机制, 在抽取动态特征、PE内容等属性时会对研究产生屏障, 因此首先需要对保护机制进行判别, 再根据保护机制的不同类别进行针对性去除操作, 从而保证后续属性的抽取能顺利进行, 保证EXE属性集的准确性与完备性.
保护机制的分析判定与去除需要考虑每一种保护机制的不同类别, 每一种类别所采用方法的合理性影响着最终分析与研究的效率, 因此要对各种类型的保护机制进行更细致化的分类. 具体如
保护机制具体分类
保护机制 | 具体分类 | 简记 | 保护机制 | 具体分类 | 简记 | |
加壳
|
加密壳
|
prs | 完整性检验
|
磁盘完整性校验
|
dic | |
压缩壳
|
pac | 内存完整性校验
|
mic | |||
虚拟机保护
|
vmp | 校验和
|
chs | |||
序列号保护
|
单变量简单加密
|
svse | 时间限制
|
限制单次时长
|
lsut | |
多变量简单加密
|
mvse | 限制总时长
|
ltut | |||
单变量复杂加密
|
svce | 功能限制
|
正式版与试用版
|
oatv | ||
多变量复杂加密
|
mvce | 注册机制
|
reg | |||
加密算法
|
单向散列加密
|
ohea | 信息隐藏
|
利用文件冗余空间
|
utrs | |
对称加密
|
sea | 利用结构与运行特点
|
usoc | |||
非对称加密
|
aea | 花指令
|
可执行花指令
|
ejc | ||
其他加密算法
|
oea | 不可执行花指令
|
nejc | |||
反调试
|
调试器
|
deb | 反跟踪
|
结构化异常处理
|
seh | |
调试标志位
|
def | 调试器断点
|
drb | |||
调试时长
|
det | 不可执行花指令
|
nejc | |||
代码自修改
|
多层嵌套加密
|
mne | 多态变形
|
静态多态性
|
sp | |
复杂加密函数
|
cef | 动态多态性
|
dp | |||
与反跟踪结合
|
cwat |
对于
安装程序保护机制判定与去除流程
由
为了更加细化EXE安装程序的保护机制判定及去除, 并且将去除的过程与属性生成联系起来, 增加算法的描述, 对每个保护机制的具体分析过程进行代码处理, 将判定的结果用具体的数值标记, 最终综合生成目标EXE安装程序的唯一保护机制属性值.
下面针对保护机制的判定与去除, 给出具体的算法描述, 如算法1.
算法
Input: EXE(fc) //输入: 带有功能类别的EXE文件;
Output: EXE(fc, pm) //输出: 经过保护机制检测算法后增加保护属性的EXE文件.
1. if Shell_Det(EXE(fc))!=0 //是否存在加壳机制
2. EXE.pm1=1; //存在则置该标志位为1
3. if Shell_Det(EXE(fc))==prs || pac, crack encryption algorithm || use unpackers; //加密壳或压缩壳
4. if Shell_Det(EXE(fc))==vmp, put it as pending, then return EXE((fc, pm)); //VMP则放入待定集合
5. endif
6. if Ser_Num_Prot_Det(EXE(fc))!=0 //是否存在序列号保护机制
7. EXE.pm2=1; //存在则置该标志位为1
8. if Ser_Num_Prot_Det(EXE(fc))==svse || mvse, use KeyGen; //简单加密
9. if Ser_Num_Prot_Det(EXE(fc))==svce || mvce, modify comparison instruction; //复杂加密
10. endif
11. if Int_Che_Det(EXE(fc))!=0, modify comparison instruction, EXE.pm3=1; //是否存在完整性校验
12. if Time_Limit_Det(EXE(fc))!=0, modify jumping instruction, EXE.pm4=1; //是否存在时间限制
13. if Func_Limit_Det(EXE(fc))!=0, modify jumping instruction, EXE.pm5=1; //是否存在功能限制
14. if Info_Hiding_Det(EXE(fc))!=0, crack encryption algorithm, EXE.pm6=1; //是否存在信息隐藏
15. if Encry_Algo_Det(EXE(fc))!=0, dynamic debugging, EXE.pm7=1; //是否存在加密算法
16. if Junk_Code_Det(EXE(fc))!=0, dynamic debugging, EXE.pm8=1; //是否存在花指令
17. if Anti-Deb_Det(EXE(fc))!=0, api hooking or modify jumping instruction, EXE.pm9=1; //是否有反调试
18. if Anti-Trace_Det(EXE(fc))!=0, dynamic debugging, EXE.pm10=1; //是否存在反跟踪
19. if SMC_Det(EXE(fc))!=0, EXE.pm11=1 //是否存在SMC, 存在则置该标志位为1
20. if SMC_Det(EXE(fc))==mne || cef, crack encryption algorithm; //多层嵌套或复杂加密
21. if SMC_Det(EXE(fc))==cwat, dynamic debugging; //涉及反跟踪技术
22. endif
23. if Poly_Meta_Det(EXE(fc))!=0, EXE.pm12=1 //是否存在多态变形, 存在则置该标志位为1
24. if Poly_Meta_Det(EXE(fc))==sp, dymatic debugging; //静态多态性
25. if Poly_Meta_Det(EXE(fc))==dp, put it as pending; //动态多态性, 则放入待定集合
26. endif
27. EXE.pm = (EXE.pm12, EXE.pm11, ..., EXE.pm2, EXE.pm1);//所有保护机制的标志位集合
28. return EXE(fc, pm) //确定最终的保护机制属性值
算法初始对于每个保护机制设定标志位pm1至pm12, 所有标志位初始全部赋值为0, 最终返回的EXE.pm为各个标志位的集合. 为了更好地对后续的网络进行训练, 此处按照静态保护机制与动态保护机制的分类方法, 先对所有保护机制进行分类: 静态保护机制(加壳Shell、序列号保护serial number ptotection、完整性检验integrity check、时间限制time limit、功能限制function limit、信息隐藏information hiding和花指令junk code); 动态保护机制(反跟踪anti-trace、反调试anti-debug、SMC技术、多态变形polymorphic and metamotphic和加密算法encryption algorithm), 接着用保护机制的复杂程度来定义每个EXE的保护机制属性, 即从Exe.pm12开始, 直到Exe.pm1, 首个不为0的属性即为该EXE文件最后的保护机制属性. 如果不存在任何保护机制, 则该属性置0. 通过该方法, 可以最大程度反映EXE安装程序自身的保护机制复杂程度, 方便后期对程序进行分析研究.
算法的复杂性方面, 通过具体实例分析可以得出, 算法执行的时间复杂度与EXE安装程序自身的保护机制层数
本文定义DLL的属性集合为DLL.Attribute (DLL.A), 包括生成类别, 地址级别, 目录属性, 调用依赖. 以下给出各项的具体内容.
(1)生成类别(generation category, DLL.gc). DLL文件根据生成方式具体可以分为4种: ① 非MFC的DLL (non-mfc, nm); ② 静态链接到MFC的DLL (static link to mfc, sltm); ③ 动态链接到MFC的DLL (dynamic link to mfc, dltm); ④ 扩展DLL (extension dll, exd). 使用不同生成方式构造的DLL文件, 可能存在被调用方式上的不同.
(2)目录属性(directory attribute, DLL.da). 根据DLL文件原始所在地址, 具体可分为如下3种: ① \windows\system32 (ws32), 操作系统的系统文件夹, 用来存放64位程序文件; ② \windows\syswow64 (ws64), 64位Windows用来存放32位Windows系统文件的地方; ③ \windows (wi), 该目录下存在少量DLL文件. 本属性主要考虑被劫持的DLL文件原始位置, 用于后期对文件进行定位.
(3)地址级别(address attribute, DLL.aa). 根据劫持漏洞发生时目标DLL文件所在地址属性, 具体包括如下几种可能: ① 在系统核心目录KnownDLLs (knd)中; ② 正在加载该DLL的进程的可执行文件目录(exe directory, ed); ③ 系统目录(system directory, sd); ④ 正在加载该DLL的进程的当前目录(current directory, cd); ⑤ PATH环境变量中列出的目录(path directory, pd). 发生DLL劫持时, DLL文件处于不同位置, 对应着不同的劫持方式, 因此需要考虑地址级别.
(4)调用依赖(call dependency, DLL.cd). 根据DLL文件在被调用时是否会依赖其他DLL, 具体可以分为: ① 依赖其他DLL文件(dependent on, do); ② 不依赖其他DLL文件(non-dependent on, ndo). DLL文件在调用时是否依赖其他DLL, 将会影响该DLL被调用到进程空间的流程.
本文定义EXE调用DLL的模式属性集合为EXE_DLL.Attribute (EXE_DLL.A), 包括: 运行级别, 加载方式. 以下给出各项的具体内容.
(1)运行级别(operation authority, EXE_DLL.oa). 根据EXE安装程序在执行安装操作时所处系统级别, 具体可以分为以下几种: ① 管理员级别(administrator level, al); ② 普通用户级别(ordinary user level, oul). 当安装程序需要管理员权限来执行安装操作时, 需要调用的DLL文件可能不等同于普通用户级别下的情况, 因此在调用模式属性集里需要考虑该属性.
(2)加载方式(loading mode, EXE_DLL.lm). 根据EXE安装程序在加载DLL文件到进程空间时的方式, 具体可以分为以下几种: ① 静态加载(static loading, stl), 也称隐式调用, 指在运行程序之前由操作系统的加载器将DLL和EXE一起加载到内存里; ② 动态加载(dynamic loading, dyl), 也称显式调用, 指应用程序运行过程中程序自己完成对DLL的加载; ③ 延迟加载(delayed loading, del), 指使用特定编译链接技术使得相关DLL不在EXE一开始运行时就加载进来, 而是等到正式调用该DLL的时候, 才会进行加载, 使得程序在正式调用DLL之前, 都可以正常执行. EXE加载DLL的3种不同方式, 决定了DLL被调用的模式, 也会对最终漏洞的挖掘产生影响.
本文利用循环神经网络中的双层BiLSTM实现了DLL劫持漏洞挖掘及验证的原型系统BiL-DLLMining, 其中选用BiLSTM神经网络, 主要原因在于该网络是一种采用前向LSTM和后向LSTM结合的多层反馈神经网络, 在对大量EXE文件的多维度属性所构成的数据集进行训练的过程中, 能根据正向传播与反向传播的数值进行权值和阈值的动态调整, 对不同属性赋予不同权重, 同时挖掘属性之间关联性, 直到输出结果与预期结果的误差达到要求, 从而形成高准确率的安装程序漏洞特征判决模型. 此外, 利用该神经网络还可以通过对安装程序与动态链接库的全属性集进行神经网络训练, 分类得出安装程序属性集与动态链接库属性集之间的深层映射关系, 从而构建可劫持对象判决模型. 而采用双层的原因在于, 双层网络的判决准确率相较于单层的更高. 综合安装程序漏洞特征判决模型与可劫持对象判决模型, 即可实现对未知安装程序的DLL劫持漏洞分析与挖掘.
系统的整体架构图如
BiL-DLLMining原型系统架构图
由
为了达到对未知漏洞属性的安装程序进行漏洞判定的目的, 需要通过神经网络对安装程序的静态特征与动态特征进行训练, 学习出具备漏洞属性的安装程序特征集, 进而利用该特征集挖掘新的安装程序DLL劫持漏洞. 首先, 在对大量安装程序进行静态分析与动态分析的基础上, 加入目前已知存在DLL劫持漏洞的安装程序, 对各个安装程序进行多维度属性抽取, 共同构建安装程序样本集, 作为双层BiLSTM网络训练和测试的原始数据集. 随后按照神经网络中标准的7:3比例[
(1)输入数据规范化. 由于原始数据集中包含了大量EXE的属性信息, 而这些属性在最初抽取时是以文本形式存在数据库中, 长度不一, 字符类型也不便于直接放入模型进行训练, 因此需要先对属性进行规范化操作, 从而生成属性向量集, 使得模型的输入是规范一致的. 具体规范化时需要考虑各个属性的实际取值范围以及统计性规律, 第3节中详细给出了各属性的实际取值范围, 相关统计性规律则在第5节的实验部分进行给出, 此处直接展示规范化的结果. 安装程序EXE各属性的规范化结果为: 功能类别为
对PE内容和漏洞属性进行标注
属性 | 取值 | 说明 |
EXE.pc | 1 | 存在非绝对路径 |
−1 | 全部为绝对路径 | |
EXE.va | 1 | 已知存在漏洞 |
−1 | 尚未发现漏洞 |
(2)计算遗忘门
其中,
(3)计算临时记忆神经单元
其中,
tanh为Sigmoid函数向下平移和收缩后的表示.
(4)计算当前时刻隐藏层状态的输出
(5)获取隐藏层状态序列
(6)构建双向LSTM, 计算输入安装程序的属性特征表示
(7)加入dropout层, 设定每一个神经网络层进行dropout的概率, 在每次训练过程中随机将上一个LSTM输出的部分元素的权重
计算dropout层的输出
其中, 权重
(8)加入第2个BiLSTM层, 构建关于学习到安装程序属性特征的序列矩阵, 具体LSTM的网络训练过程此处不再赘述. 接着进入一个全连接层, 对高维数据进行降维处理的同时, 进一步提取和整合关键特征信息, 得到全连接层的安装程序输出表示
(9)最后进入
其中,
通过
(10)漏洞特征判决. 根据训练结果不断调整参数, 包括LSTM层各个门结构的权重、隐藏层的个数、dropout层的概率等, 再进行逐步优化, 当测试集给出的训练精度满足预先要求时, 结束算法, 基于双层BiLSTM循环神经网络的安装程序漏洞特征判决模型至此构建完成. 对于未知的安装程序, 进行属性抽取之后, 将数据放入判决模型中, 根据模型输出的结果进行有无漏洞的判决. 下一步将判定结果为存在漏洞的安装程序放入可劫持对象判决模型中, 目的是通过该模型找到安装程序可被劫持的具体DLL文件, 通过后续的验证对漏洞判决模型的结果给出反馈, 同时得到真正存在DLL劫持漏洞的安装程序和对应的DLL文件.
对于漏洞判决模型中输出为存在漏洞的安装程序, 需要进一步找到其可被劫持的DLL文件, 寻找方法是通过预先抽取的DLL文件属性, 对特定的DLL文件进行定位, 对满足要求的DLL文件逐个验证. 所涉及到的属性具体包括安装程序调用DLL的权限、加载方式、DLL文件生成类别、地址属性、目录属性、调用依赖等. 可劫持对象判决模型的构建过程与漏洞判决模型具体操作存在一些差异, 主要体现在: 从安装程序全数据集中随机选取70%的数据, 作为新的数据集. 原因在于此时不再需要标签为−1的数据, 只对已知存在漏洞的安装程序数据进行训练. 数据集的删减可以大幅度地降低训练的难度, 提高训练效率. 此外的一个不同点在于, 双层BiLSTM神经网络的输出不再是上一个模型中的−1/1, 而是DLL文件的各项属性值, 即将DLL文件的各项属性值作为安装程序的预测输出, 目的是通过双层BiLSTM神经网络训练出安装程序各项属性与被劫持DLL文件各项属性之间的高精度映射关系, 从而通过对安装程序的属性分析, 找到相对应被劫持概率高的DLL文件, 进行后期的DLL劫持验证. 具体过程如下.
(1) DLL文件属性提取. 对目前已知存在DLL劫持的EXE文件, 首先在实验环境下复现DLL劫持情况, 并通过静态和动态分析相结合的方式, 提取DLL文件的各项关键属性, 包括: 安装程序调用DLL的权限、加载方式、生成类别、目录属性、地址级别和调用依赖. 各项属性的集合可以有效地反映DLL文件的基本信息, 同时可以精确定位到指定范围内的DLL文件. 最终得到目前已知存在DLL劫持漏洞的DLL文件各项属性信息, 包括EXE_DLL.Attribute (EXE_DLL.A)和DLL.Attribute (DLL.A), 即双层BiLSTM的预期输出属性集为
(2)预期输出规范化. 从原始EXE特征数据集中抽取出具备DLL劫持漏洞的数据, 命名为EXEVul, 作为可劫持动态链接库对象判决模型的输入, 而预期输出则为所对应的DLL文件相关属性. 对预期输出的各个属性进行规范化操作. 具体方式如
预期输出规范化
属性 | 取值 | 说明 | 属性 | 取值 | 说明 | |
EXE_DLL.oa | −1 | 管理员级别 | DLL.cd | −1 | 不依赖其他DLL | |
1 | 用户级别 | 1 | 依赖其他DLL | |||
EXE_DLL.lm | −1 | 静态加载 | DLL.da | −1 | \windows\system32 | |
0 | 动态加载 | 0 | \windows\syswow64 | |||
1 | 延迟加载 | 1 | \windows | |||
DLL.gc | −1 | 非MFC的DLL | DLL.aa | −2 | KnownDLLs | |
0 | 静态链接到MFC的DLL | −1 | 可执行文件的目录 | |||
1 | 动态链接到MFC的DLL | 0 | 系统目录 | |||
2 | 扩展DLL | 1 | 进程当前目录 | |||
2 | PATH变量目录 |
(3)模型构建. 将安装程序漏洞特征判决模型的输入和预期输出进行相应修改, 赋予各个门初始权重, 进行多次迭代训练, 使得最终
(4)漏洞验证. 将安装程序漏洞特征判决模型给出的EXE文件放入模型中, 根据输出结果, 对满足各属性要求的DLL文件进行抽取, 并利用相关工具验证. 最终给出确切的DLL劫持漏洞名单. 具体验证过程主要是使用AheadLib工具构造同名DLL文件, 并在dllmain函数中加入MessageBox函数进行弹窗操作, 将该DLL文件放置到EXE文件所在的安装程序目录下, 如果EXE安装程序调用了该DLL文件, 则会执行dllmain函数中的弹窗操作, 进行弹窗显示, 进而证明该EXE文件存在DLL劫持漏洞, 可被该DLL劫持.
本节首先给出实验环境与评价指标, 接着介绍安装程序漏洞特征判决模型及其分类结果, 包括属性特征的规范化、判决模型过程、测试输出结果. 随后介绍可劫持动态链接库对象判决模型的运行过程与结果, 同时对给出的安装程序与DLL文件进行对应验证. 最后, 通过与其他类似工具的对比分析来说明BiL-DLLMining原型系统的高性能.
实验数据集. 实验主要搜集目前已知的安装程序DLL劫持漏洞以及对应的DLL文件信息, 包括但不限于CVE、CNVD等平台, 数据获取方法为: 搜集CVE、CNVD、漏洞银行、漏洞盒子等漏洞平台上从2010年DLL劫持漏洞爆发至今(2020年6月)所有的DLL劫持漏洞所涉及的安装程序, 主要包括漏洞号、具体的安装程序名称、安装程序版本、对应可劫持的DLL名称、操作系统版本等, 通过数据比对去除重复信息, 最终综合得到已知存在DLL劫持漏洞的安装程序378个, 对应可劫持的DLL文件315个, DLL文件数量少于安装程序数量的原因在于部分安装程序可劫持的DLL文件相同. 同时对主流应用程序提供平台上的安装程序进行搜集, 主要包括腾讯软件管家、360软件管家、2345软件管家等, 时间限定在近3年, 获取多类型的安装程序信息, 并综合各个应用程序的官网, 去除重复数据后, 最终得到不同种类、不同版本的安装程序共1954个, 默认这些安装程序的DLL劫持漏洞属性为未知.
经过上述步骤, 最终搜集到已知存在DLL劫持漏洞的安装程序378个, 构成数据集EXEVul, 漏洞属性未知的安装程序1954个, 构成数据集EXEUn, 而EXEVul和EXEUn汇总后构成EXE全数据集, 命名为EXEFul, 共有EXE安装程序2332个. DLL全数据集命名为DLLFul, 共有DLL文件315个. 其中, 安装程序漏洞特征判决模型的训练数据集为70%的EXEFul, 即1632个安装程序(EXEVul中随机选取265个, EXEUn中随机选取1367个), 测试数据集为剩下的30%的EXEFul, 即700个安装程序(EXEVul中剩下113个, EXEUn中剩下587个). 同理, 对于可劫持对象判决模型, 训练数据集为70%的EXEVul, 即265个安装程序以及对应的可劫持DLL文件219个(265个EXE程序为EXEVul中随机选取), 而测试数据集为EXEVul剩下的113个已知存在漏洞的安装程序以及对应的可劫持DLL文件102个, 其中由于存在不同EXE可被相同DLL劫持的情况, 导致训练集和测试集中DLL文件的总和并不等于DLLFul的元素总量.
对安装程序和DLL文件进行属性特征分析与提取时, 涉及到工具主要包括PEiD、Pestudio、IDA、OllyDbg、Depends、WinHex等, 涵盖了主流的PE文件静态与动态分析工具. 通过前述工具对EXE安装程序和DLL文件进行多方位属性提取, 能够多维度表征EXE和DLL的深层次特征, 保证系统可以高效地处理输入的数据集, 最终在多次迭代和训练之后, 给出EXE漏洞特征集和可劫持DLL文件属性集, 经过实际的验证之后成功挖掘到10个未知的DLL劫持漏洞, 证实了BiL-DLLMining原型系统的可靠性与高效性, 为后续系统的进一步优化与应用打下坚实的基础.
具体的实验环境参数如下所示.
1) 硬件平台
处理器: Inter(R) Core(TM) i5-8300H CPU@2.30 GHz
内存: 16 GB
显卡: NVIDIA GeForce GTX1050Ti
2) 软件平台
操作系统: Windows 10 家庭版(64位)
系统版本: 1909
开发环境: VS 2019
实验所用评价指标为针对二分类结果常见的评估方法. 首先做如
评价指标所用参数对照表
参数 | 具体含义 |
本身不存在漏洞但被模型判定为存在漏洞的安装程序数量 | |
本身存在漏洞但被模型判定为不存在漏洞的安装程序数量 | |
本身存在漏洞并且被模型判定为存在漏洞的安装程序数量 | |
本身不存在漏洞并且被模型判定为不存在漏洞的安装程序数量 |
接着对
分析各个指标的具体含义可知, 理想的模型输出需要满足误报率(false positive rate,
● 属性特征的规范化. 通过对EXE的静态分析与动态分析, 发现属性的取值呈现一定的规律性. 在功能类别部分, 样本集中音乐、视频、下载等常见类别呈现近似均匀分布, 因此对该属性在进行规范化时可以采用简单的区间随机分配方式. 对于保护机制, 通过统计发现, 83.72%的EXE安装程序并没有采用复杂的保护机制, 例如花指令、反调试、SMC、多态变形等, 而是只采用简单保护机制或者并没有保护机制存在, 整体呈现近似正态分布的特征, 因此对该属性的规范化操作可以采用指定区间上标准正态分布的方法, 从而保证对该属性的精确描述. 同理, 动态特征部分, EXE安装程序在安装过程中, 91.47%的程序都会进行文件相关操作, 例如文件查找、文件创建、文件读写等, 同时也会在注册表中进行程序注册等操作, 而网络流量和系统交互则相对较少一些. 因此, 总体来看, 动态特征项也可以采用标准正态分布的方法进行规范化. PE内容主要分为文件中DLL文件名全部为绝对路径和存在非绝对路径两种情况, 因此直接采用−1/1标注即可, 在训练后期根据网络训练效果进行进一步归一化等操作, 例如加入mapminmax等归一化函数. 此外, 使用−1/1标签法对每个程序目前可被劫持情况进行标记, 用作网络的期望输出值. 具体规范化操作已在第4.1节给出, 此处不再赘述.
● 模型判决过程分析. 针对收集到的大量数据集进行属性提取、输入, 通过BiLSTM网络进行建模, 在每次训练过程中用dropout层进行随机元素权重置0, 接着通过全连接层进行特征整合和数据降维, 最后通过
双层BiLSTM网络训练准确度与损失图
● 模型判决结果分析. 双层BiLSTM网络在最终的
漏洞特征判决模型输出结果
由
对应指标可知
● 可疑安装程序选取. 通过上述步骤, 漏洞特征判决模型即建模完毕. 训练集和测试集最终得到的判决准确率也满足模型的要求. 在同步进行可劫持对象判决模型构建的同时, 从EXEFul和金山毒霸软件管家、160软件管家等其他平台上, 选取200个安装程序, 其中包括已知存在DLL劫持漏洞的安装程序和新的未知漏洞属性的安装程序, 进行属性抽取与规范化操作后, 放入训练好的漏洞特征判决模型中, 最终有16个EXE安装程序的
● 属性特征的规范化. 通过对DLL文件进行多角度分析, 得出各个属性的统计性数据. 在分析EXE调用DLL情况时, 普通用户级别下静态加载是主要的方式. 而DLL文件本身的各个属性里, 静态链接到MFC的DLL文件占主体, 同时大部分可劫持的DLL文件原始目录都处于\windows\syswow64下, 被劫持时处于可执行文件目录下, 并且不依赖其他DLL的情况占到85%以上. 根据这些统计性数据, 对各个属性进行规范化操作, 具体方法已在第4.2节列出, 此处不再赘述.
● 模型判决过程分析. 将EXEVul划分为训练集和测试集, 使用修改后的双层BiLSTM网络进行训练, 最终通过
可劫持对象判决模型输出类别概率
从
将混淆矩阵中的准确率数值转换为表格形式, 具体如
可劫持对象判决模型输出准确率
属性 | 分类 | 分类
|
属性
|
运行级别
|
Administrator level | 92 | 89.50 |
Ordinary user levl | 87 | ||
加载方式
|
Static loading | 95 | 93.00 |
Dynamic loading | 91 | ||
Delayed loading | 93 | ||
生成类别
|
Non-MFC | 85 | 89.25 |
Static link | 88 | ||
Dynamic link | 90 | ||
Extension | 94 | ||
目录属性
|
\windows\system32 | 90 | 91.33 |
\windows\syswow64 | 93 | ||
\windows | 91 | ||
地址级别
|
EXE directory | 100 | 100 |
调用依赖
|
Not dependent on | 90 | 91.50 |
Dependent on | 93 |
● 可劫持对象判决分析. 对该模型给出的可疑EXE安装程序与对应可劫持DLL文件的属性进行统计分析, 具体统计性结果如
可劫持对象判决结果统计性分析
从
● 漏洞验证. 基于安装程序漏洞特征判决模型所给出的16个可疑EXE文件, 经过可劫持对象判决模型的分析后, 给出对应每个可疑EXE文件的DLL, 使用AheadLib等相关工具生成同名的DLL文件, 在文件中加入MessageBox函数进行弹窗操作, 将DLL文件对应放置在EXE文件所在目录下, 按照EXE调用DLL文件的运行权限, 逐一进行安装操作, 进行漏洞验证. 验证情况如
漏洞验证
EXE | 中文名称 | 功能类别 | 运行环境 | 存在漏洞 | 劫持所用DLL | CNVD编号 |
WPS.exe | WPS办公 | 办公 | Win10家庭版 | True | shfolder.dll | 未知, 已获批, CNVD-2020-02235 |
Potplayer.exe | Potplayer播放器 | 视频 | Win10家庭版 | False | - | - |
PCQQ.exe | QQ
|
社交 | Win10家庭版 | True | version.dll | 未知, 已获批, CNVD-2020-26364 |
Sogou_Pinyin.exe | 搜狗拼音输入法 | 输入法 | Win10家庭版 | True | version.dll | 未知, 已获批, CNVD-2020-18637 |
Chrome.exe | 谷歌
|
浏览器 | Win10家庭版 | True | linkinfo.dll | 已知, CNVD-2020-23843 |
BaiduPinyin.exe | 百度拼音输入法 | 输入法 | Win10家庭版 | True | shfolder.dll | 未知, 已获批, CNVD-2020-18738 |
XunLei.exe | 迅雷 | 下载 | Win10家庭版 | True | version.dll | 未知, 已获批, CNVD-2020-26371 |
KuaiZip.exe | 快压 | 解压刻录 | Win10家庭版 | True | bcrypt.dll | 未知, 已获批, CNVD-2020-26363 |
360se.exe | 360
|
浏览器 | Win10家庭版 | False | - | - |
KSbrowser.exe | 猎豹
|
浏览器 | Win10家庭版 | True | winsta.dll | 未知, 已获批, CNVD-2020-18662 |
Sogou_explorer.exe | 搜狗
|
浏览器 | Win10家庭版 | True | iertutil.dll | 未知, 已获批, CNVD-2020-18671 |
GuaGuaPlayer.exe | K歌伴侣
|
音乐 | Win10家庭版 | True | version.dll | 已知, CNVD-2020-00790 |
BaiduNetdisk.exe | 百度网盘 | 下载 | Win10家庭版 | True | dpapi.dll | 未知, 已获批, CNVD-2020-26360 |
ysyy.exe | 央视影音
|
视频 | Win10家庭版 | True | cldapi.dll | 已知, CNVD-2020-03921 |
QQBrowser.exe | QQ
|
浏览器 | Win10家庭版 | True | usp10.dll | 未知, 已获批, CNVD-2020-26361 |
yy.exe | YY语音 | 社交 | Win10家庭版 | True | usp10.dll | 已知, CNVD-2020-12841 |
以CNVD-2020-18637为例, BiL-DLLMining原型系统挖掘的完整流程如下: 首先抽取目标EXE安装程序的属性特征, 即搜狗拼音输入法安装程序的功能类别、保护机制、动态特征与PE内容, 其中功能类别为输入法, 保护机制为无, 动态特征为文件操作和注册表操作, PE内容为存在非绝对路径情况; 接着将上述属性规范化后, 将其输入到原型系统BiL-DLLMining中, 漏洞特征判决模型对属性进行多维度分析训练, 最终给出漏洞属性判定, 结果为存在DLL漏洞概率为93.25%, 因此该安装程序被判定为存在DLL劫持漏洞; 随后将上一步中获取的属性信息输入到可劫持对象判决模型中, 通过对已有DLL劫持漏洞中EXE文件和DLL文件的映射关系解析, 得到目标EXE文件, 即搜狗拼音输入法安装程序可劫持的DLL文件, 结果共输出3个, 分别为version.dll、usp10.dll和shfolder.dll. 最后使用AheadLib工具分别对3个DLL文件进行逐一验证, 验证方法主要是通过构造同名DLL文件放置到对应的安装程序目录下, 并在dllmain函数中加入MessageBox函数进行弹窗操作. 如果可以成功劫持某个DLL文件, 则安装程序会调用伪造的DLL, 并且执行dllmain函数中的弹窗操作, 进行弹窗显示. 实验最终发现伪造的version.dll成功被劫持, 安装程序直接在当前目录下调用了该伪造的DLL文件, 并进行弹窗, 继续修改伪造的DLL文件中相关函数, 可以实现更多的操作, 例如在安装过程中打开其他进程、获取主机的敏感信息等.
对于原型系统的实时性分析, 目前主流的系统实时性评估工具有Benchmark和profile等, 其中Benchmark采用压力测试挖掘整个系统的性能状况, 而profile工具最大限度地呈现系统的运行状态和性能指标, 方便用户诊断性能问题和进行调优. 本文采用上述两种工具来对BiL-DLLMining进行实时性分析. 使用Benchmark生成50个具体的安装程序EXE文件, 其中属性集为工具按照已有规则自动生成, 采用在线处理的方式测试BiL-DLLMining原型系统对于测试用例的执行时间, 最终某一测试用例的输出结果为(50, 17947362948 ns/op), 表示该测试用例执行了50次, 平均每次执行时间约为17.947 s (17947362948 ns), 共花费约897.368 s. 通过改变测试用例的属性, 即安装程序EXE文件的多种属性后, 重复实验20次, 最终获得的平均单个测试用例执行时间为16.276 s. 从时间角度考虑, 原型系统的表现满足预期要求. 在实验过程中同时采用profile进行运行状态的分析, 单次单个测试用例中具体的函数执行情况如
profile分析结果
Time percentage (%) | Cumulative time (s) | Self time (s) | Calls | Self/call (s) | Total/call (s) | Name |
40.79 | 7.324 | 7.324 | 2 | 3.662 | 4.104 | DoubleBiLSTM |
23.24 | 11.497 | 4.173 | 5 | 0.835 | 0.925 | Data_split |
22.79 | 15.593 | 4.096 | 8 | 0.512 | 0.617 | Attrib_weight |
从
目前学术界和工业界对于Windows系统安全都有较多的研究, 但对于动态链接库劫持漏洞的研究则较少. 传统对于DLL劫持的检测方法, 主要是采用process explorer等工具分析进程加载的所有DLL文件, 通过与注册表项中的DLL文件对比, 同时加上加载路径的判定, 最终选取可疑的DLL文件进行逐一验证, 从而尝试查找存在劫持漏洞的程序. 这类方法思路简单, 但是实用性不强, 对于新的程序需要重复操作, 不具备普适性, 并且人工操作繁琐, 难以实现漏洞的高效挖掘与分析. 为了增加对漏洞的快速挖掘, 工业界出现了一些DLL劫持漏洞挖掘的自动化工具, 尝试从不同的角度进行漏洞的自动化挖掘. 本文选取目前主流的几种自动化挖掘工具进行对比分析, 最终给出各维度的分析结果, 表明本文所提出模型的高效性与完备性.
本文选取的3种自动化挖掘工具分别为Rattler[
为了更加细致且针对性地对3款工具进行分析, 本文从EXEFul中随机选取500个安装程序, EXEFul为上文提到的安装程序集, 包括CVE、CNVD、漏洞银行、漏洞盒子等漏洞平台上从2010年DLL劫持漏洞爆发至今(2020年6月)所有的DLL劫持漏洞涉及的安装程序, 加上腾讯软件管家、360软件管家、2345软件管家等平台上获取到的安装程序. 500个安装程序为随机选取, 包含150个已知存在漏洞的EXE文件和350个漏洞属性未知的EXE文件, 研究3款工具与本文所提模型在使用方式、分析粒度、挖掘形式、输出结果等特征以及准确率等方面的差异. 具体结果如
特征对比结果
Rattler | ChkDllHijack | DLLHSC | BiL-DLLMining | |
使用方式 | 命令行 | UI界面 | 命令行 | 模型接口 |
分析粒度 | 粗粒度 | 粗粒度 | 细粒度 | 细粒度 |
挖掘形式 | 枚举DLL,
|
其他工具预先分析出所有DLL文件, 逐个验证 | 3种不同模式, 编译以及
|
应用程序多维属性集合, 特征抽取与分类, 漏洞模型进行判决 |
输出结果 | DLL路径
|
DLL路径
|
DLL路径
|
应用程序运行级别
|
准确率对比结果 (%)
指标 | Rattler | ChkDllHijack | DLLHSC | 本文方法 |
20.66 | 19.33 | 16.00 | ||
22.76 | 19.51 | 17.89 | ||
77.24 | 80.49 | 82.11 | ||
79.34 | 80.67 | 84.00 | ||
75.40 | 77.34 | 81.45 | ||
76.33 | 82.54 | 81.78 |
由
如
动态链接库作为Windows操作系统底层的核心组件, 为上层众多的应用程序服务, 不仅方便开发者进行程序开发, 也提高了系统的整体运行效率. DLL劫持漏洞的出现将DLL的安全性推到了人们的面前, 促使安全人员对其展开深入研究, 从而保障DLL文件以及整个系统的安全. 本文基于目前已知的DLL劫持漏洞, 搜集并抽取了大量安装程序的属性特征, 从安装程序自身、安装程序调用动态链接库模式、动态链接库自身3个角度出发, 使用双层BiLSTM神经网络进行特征学习, 分类出具备DLL劫持的漏洞特征, 在验证了已知漏洞的同时也挖掘到一些未知漏洞. 同时通过与目前主流的DLL劫持漏洞分析与挖掘工具对比, 表明了本文基于BiLSTM神经网络的漏洞挖掘及验证系统BiL-DLLMining的高效与完备性. 当然目前的系统还存在一些不足之处, 比如在对安装程序进行保护机制判定部分, 对于虚拟机保护以及多态变形等复杂机制的解决还存在可以改进的地方, 整个模型的数据集也需要继续扩大, 准确率也有继续提升的空间. 未来会针对这些问题进行更加深入的研究.
Berdajs J, Bosnić Z. Extending applications using an advanced approach to DLL injection and API hooking. Software: Practice and Experience, 2010, 40(7): 567–584. [doi: 10.1002/spe.973]
傅建明, 杨铮, 罗陈可, 黄坚伟. 一种基于内核事件的Windows系统游戏反外挂方法. 电子与信息学报, 2020, 42(9): 2117–2125. [doi: 10.11999/JEIT190695]
Fu JM, Yang Z, Luo CK, Huang JW. An anti-cheat method of game based on windows kernel events. Journal of Electronics & Information Technology, 2020, 42(9): 2117–2125 (in Chinese with English abstract). [doi: 10.11999/JEIT190695]
彭帝, 周安民, 方勇, 刘亮. 动态链接库预加载漏洞检测方法. 信息与电子工程, 2011, 9(4): 515–518. [doi: 10.3969/j.issn.1672-2892.2011.04.026]
Peng D, Zhou AM, Fang Y, Liu L. A method for detecting Dynamic Link Library preload vulnerability. Information and Electronic Engineering, 2011, 9(4): 515–518 (in Chinese with English abstract). [doi: 10.3969/j.issn.1672-2892.2011.04.026]
http://www.jos.org.cn/1000-9825/4221.htm]]>
http://www.jos.org.cn/1000-9825/4221.htm]]>
http://www.jos.org.cn/1000-9825/3953.htm]]>
http://www.jos.org.cn/1000-9825/3953.htm]]>
http://www.jos.org.cn/1000-9825/5863.htm]]>
http://www.jos.org.cn/1000-9825/5863.htm]]>
http://www.jos.org.cn/1000-9825/4927.htm]]>
http://www.jos.org.cn/1000-9825/4927.htm]]>
Narouei M, Ahmadi M, Giacinto G, Takabi H, Sami A. DLLMiner: Structural mining for malware detection. Security and Communication Networks, 2015, 8(18): 3311–3322. [doi: 10.1002/sec.1255]
An L, Castelluccio M, Khomh F. An empirical study of DLL injection bugs in the Firefox ecosystem. Empirical Software Engineering, 2019, 24(4): 1799–1822. [doi: 10.1007/s10664-018-9677-7]
Kwon T, Su ZD. Automatic detection of unsafe dynamic component loadings. IEEE Transactions on Software Engineering, 2012, 38(2): 293–313. [doi: 10.1109/TSE.2011.108]
傅建明, 彭碧琛, 杜浩. 一种组件加载漏洞的动态检测. 清华大学学报(自然科学版), 2012, 52(10): 1356–1363, 1369. [doi: 10.16511/j.cnki.qhdxxb.2012.10.007]
Fu JM, Peng BC, Du H. Dynamic detection of component loading vulnerability. Journal of Tsinghua University (Science & Technology), 2012, 52(10): 1356–1363, 1369 (in Chinese with English abstract). [doi: 10.16511/j.cnki.qhdxxb.2012.10.007]
Ding S, Fu JM, Peng BC. ModuleGuard: A gatekeeper for dynamic module loading against malware. Wuhan University Journal of Natural Sciences, 2013, 18(6): 489–498.
刘峰宇, 解炜. 基于签名认证的DLL加载漏洞防御技术研究. 信息网络安全, 2017, (11): 62–66. [doi: 10.3969/j.issn.1671-1122.2017.11.010]
Liu FY, Xie W. Research on DLL loading vulnerability defense technology based on signature verification. Netinfo Security, 2017, (11): 62–66 (in Chinese with English abstract). [doi: 10.3969/j.issn.1671-1122.2017.11.010]
http://www.jos.org.cn/1000-9825/6062.htm]]>
http://www.jos.org.cn/1000-9825/6062.htm]]>
Sohi SM, Seifert JP, Ganji F. RNNIDS: Enhancing network intrusion detection systems through deep learning. Computers & Security, 2021, 102: 102151. [doi: 10.1016/J.COSE.2020.102151]
Sun PF, Liu PJ, Li Q, Liu CX, Lu XL, Hao RC, Chen JP. DL-IDS: Extracting features using CNN-LSTM hybrid network for intrusion detection system. Security and Communication Networks, 2020, 2020: 8890306. [doi: 10.1155/2020/8890306]
http://www.jos.org.cn/1000-9825/6055.htm]]>
http://www.jos.org.cn/1000-9825/6055.htm]]>
http://www.jos.org.cn/1000-9825/6061.htm]]>
http://www.jos.org.cn/1000-9825/6061.htm]]>
Matsuda W, Fujimoto M, Mitsunaga T. Detection of malicious tools by monitoring DLL using deep learning. Journal of Information Processing, 2020, 28: 1052–1064. [doi: 10.2197/ipsjjip.28.1052]
https://github.com/sensepost/rattler/]]>
https://github.com/anhkgg/anhkgg-tools]]>
https://github.com/ctxis/DLLHSC]]>