logo资料库

基于语义的恶意代码行为特征提取及检测方法.pdf

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
E-mail: jos@iscas.ac.cn http://www.jos.org.cn Tel/Fax: +86-10-62562563 软件学报 ISSN 1000-9825, CODEN RUXUEW Journal of Software,2012,23(2):378393 [doi: 10.3724/SP.J.1001.2012.03953] ©中国科学院软件研究所版权所有. 基于语义的恶意代码行为特征提取及检测方法   王 蕊 1,2+, 冯登国 1,3, 杨 轶 3, 苏璞睿 3 1(中国科学院 研究生院,北京 100049) 2(信息安全国家重点实验室(中国科学院 信息工程研究所),北京 100029) 3(中国科学院 软件研究所,北京 100190) Semantics-Based Malware Behavior Signature Extraction and Detection Method WANG Rui1,2+, FENG Deng-Guo1,3, YANG Yi3, SU Pu-Rui3 1(Graduate University, The Chinese Academy of Sciences, Beijing 100049, China) 2(State Key Laboratory of Information Security (Institute of Information Engineering, The Chinese Academy of Sciences), Beijing 100029, China) 3(Institute of Software, The Chinese Academy of Sciences, Beijing 100190, China) + Corresponding author: E-mail: wangrui@is.iscas.ac.cn Wang R, Feng DG, Yang Y, Su PR. Semantics-Based malware behavior signature extraction and detection method. Journal of Software, 2012,23(2):378393. http://www.jos.org.cn/1000-9825/3953.htm Abstract: This paper proposes a semantic-based approach to malware behavioral signature extraction and detection. This approach extracts critical malware behaviors as well as dependencies among these behaviors, integrating instruction-level taint analysis and behavior-level semantics analysis. Then, it acquires anti-interference malware behavior signatures using anti-obfuscation engine to identify semantic irrelevance and semantically equivalence. Further, a prototype system based on this signature extraction and detection approach is developed and evaluated by multiple malware samples. Experimental results have demonstrated that the malware signatures extracted show good ability to anti obfuscation and the detection based on theses signatures could recognize malware variants effectively. Key words: malware; semantics; behavior signature extraction; malware detection 摘 要: 提出一种基于语义的恶意代码行为特征提取及检测方法,通过结合指令层的污点传播分析与行为层的语 义分析,提取恶意代码的关键行为及行为间的依赖关系;然后,利用抗混淆引擎识别语义无关及语义等价行为,获取 具有一定抗干扰能力的恶意代码行为特征.在此基础上,实现特征提取及检测原型系统.通过对多个恶意代码样本的 分析和检测,完成了对该系统的实验验证.实验结果表明,基于上述方法提取的特征具有抗干扰能力强等特点,基于 此特征的检测对恶意代码具有较好的识别能力. 关键词: 恶意代码;语义;行为特征提取;恶意代码检测 中图法分类号: TP309 文献标识码: A  基金项目: 国家自然科学基金(60703076, 61073179); 国家高技术研究发展计划(863)(2007AA01Z451, 2009AA01Z435) 收稿时间: 2010-04-12; 修改时间: 2010-09-10; 定稿时间: 2010-10-11
王蕊 等:基于语义的恶意代码行为特征提取及检测方法 379 近年来,恶意代码已经成为威胁互联网安全的主要因素之一.据赛门铁克(Symantec)统计:2008 年,Symantec 在全球范围内监测到的恶意代码样本高达 1 656 227 个,约占 2002 年~2008 年间共监测到的总数的 60%[1].仅由 赛门铁克的监测数据,已可见恶意代码数量的日益庞大及其威胁的日益严重.由于技术的局限性,仍有大量恶意 代码无法有效监测.恶意代码层出不穷,是恶意代码防范形势日益严峻的主要原因. 恶意代码变种的检测问题是目前恶意代码防范的难点和重点.现有的恶意代码变种在实现上可大致分为 两类:一类是基于基础技术的共用,恶意代码开发人员通过重用基础模块实现变种;一类是恶意代码专门针对现 有防范技术而设计开发的混淆技术.混淆技术按实现机理可分为两类[2]:一类是干扰反汇编的混淆,使反汇编无 法得到正确结果,从而阻碍进一步分析;另一类是指令/控制流混淆,此类混淆技术通常采用垃圾代码插入、寄存 器重分配、等价指令替换及代码变换等方式,改变代码的语法特征,隐藏其内部逻辑关系. 恶意代码检测方法可以分为基于启发式(heuristic-based)的检测和基于特征(signature-based)的检测两大 类[3].基于启发式的检测方法根据预先设定的规则判断恶意代码存在的可能性,其优势在于可检测新恶意代码 样本;但其规则的生成依赖于分析人员的经验,在应用中易引发高误报及漏报率,因此在实际检测系统中应用较 少.基于特征的检测方法则根据由恶意代码中提取的特征进行检测,与基于启发式的检测方法相比,具有效率 高、误报率低等优点,因此被广泛应用于恶意代码检测工具之中,是目前恶意代码检测的主流方法. 特征的描述能力是决定基于特征的检测方法的检测能力和检测效率的主要因素.如何更有效地提取恶意 代码的本质特征,降低混淆技术的干扰,从而对恶意代码变种进行准确、有效地检测,是目前恶意代码防御的研 究热点.传统的特征检测大多采用基于代码特征的检测方法,大量商用杀毒软件即使用此类方法.该方法从已有 恶意代码样本中提取代码语法(syntactic)特征用于检测,此类特征通常精确匹配单一样本,恶意代码使用简单混 淆方法即可绕过相应检测[4].并且,不同变种需使用不同特征进行描述,特征库数据量往往十分庞大,且在出现变 种时需及时、不断地更新.此后,研究者提出了基于行为特征的检测方法[5],通过提取恶意代码执行的行为作为 特征进行检测.此方法着眼于恶意代码的实际行为,因此可避免仅针对代码的混淆方法的影响.然而,基于行为 的特征仍局限于语法特性,无法抵御等价行为替换等行为层混淆方法的干扰.如 Sekar 等人[6]提出了一套攻击方 法,通过垃圾行为注入使攻击行为模拟正常行为序列,从而绕过以行为序列为特征的入侵检测系统.基于语义的 检测方法的提出为更好地对抗混淆技术、检测变种提供了可能.通过分析混淆技术原理发现,混淆技术具有改 变代码语法特征但仍保留行为语义的特点.基于语义的检测方法即利用这一特点,通过抽象语义特征实施检测 来提高对变种的检测能力.目前,已有一些工作从语义角度对特征提取及检测方法进行了一定程度的改进[710], 其中比较有代表性的是,Christodorescu 等人[8]结合语义分析提取代码特征,提高了对部分混淆技术的抗干扰能 力,但其方法在等价指令替换等方面的抗干扰能力较弱.目前,其他基于语义的特征提取工作也大多基于静态代 码层分析,在行为层抗混淆方面仍有待提高. 本文提出了一种基于语义的恶意代码行为特征提取及检测方法,使用经语义抽象的行为特征图描述恶意 代码行为特征.基于此特征,通过计算特征值的方法对恶意代码进行检测.本方法通过指令层的动态污点传播分 析,提取恶意代码的关键行为及行为之间的数据依赖关系和控制依赖关系,在此基础上,结合行为层语义分析进 行抗混淆处理,从而提高了对常用混淆技术的抗干扰能力;本方法提取的特征可融合同类多个恶意代码变种的 特性,从而提高对恶意代码变种的检测能力,并具备对部分通过增加或修改行为的方式而产生的恶意代码新种 的检测能力;同时,在一定程度上缩减了特征库数据量. 本文的贡献主要包括如下 3 个部分:  建立了一种基于行为依赖图的特征描述方法.本方法从行为层次抽象特征,以行为之间的数据依赖关系 和控制依赖关系结合的方式表示行为逻辑,建立行为特征图.该特征可表示一类恶意代码的行为特征, 因此可提高对恶意代码变种的检测能力,同时降低了特征库规模,从而改进检测效率.  提出了一种基于语义的抗混淆特征提取方法,从语义无关和语义等价两方面进行抗干扰处理.该方法通 过创建语义等价序列库将行为相同的序列预归为相应的语义等价序列集合,然后建立了相应的特征图 构造算法和特征匹配算法,解决了等价行为替换等混淆代码的检测问题.
380 Journal of Software 软件学报 Vol.23, No.2, February 2012  完成了原型系统开发,实现了基于语义的恶意代码行为特征提取和检测等功能,并完成了基于 SdBot, NetSky 等实例样本的实验.实验结果表明,基于本文所述方法提取的特征具有抗干扰能力强等特点,基 于此特征的检测对恶意代码变种具有较好的识别能力. 本文第 1 节介绍相关工作.第 2 节概述本文特征提取及检测的基本思路.第 3 节详细介绍行为特征的提取 过程和方法.第 4 节说明如何根据提取的行为特征对恶意代码进行检测.第 5 节介绍系统设计及实验结果.第 6 节进行总结. 1 相关工作 本文的主要研究内容是恶意代码行为特征提取及检测方法.为了实现行为特征提取及检测,首先要对恶意 代码进行分析,在此基础上,研究恶意代码行为特征提取及描述方法,并基于提取及描述的特征,实现基于恶意 代码行为特征的检测.因此,本文从恶意代码分析、恶意代码特征描述和恶意代码检测这 3 个方面介绍相关研 究工作. 恶意代码分析一般分为静态分析和动态分析两种.静态分析首先对可执行程序进行反汇编,在此基础上,分 析并提取代码的特征信息.静态分析可对代码进行全面的分析,无须实际执行代码,因此不会对系统产生危害; 但由于所分析的代码不一定是最终执行的代码,可能消耗大量时间于无用代码.同时,静态分析对反汇编技术的 依赖也导致了其局限性.恶意代码可使用各种混淆技术阻碍反汇编分析[4],一些恶意代码通过加密、压缩等方 式,其完整代码只有在实际运行中才释放,导致静态分析难以得到正确结果.为了减少混淆技术的影响,国内外 学者进行了一系列的研究工作,如 Christodorescu 等人[11]针对代码重排、加壳、垃圾代码插入等 3 种混淆方式 提出了相应的处理方法,试图将其恢复为混淆前的代码,但未能解决寄存器重分配、等价替换等其他混淆技术 的干扰问题.动态分析则是在代码执行过程中进行分析,所分析的代码即实际执行的代码;但动态分析一次执行 过程只能获取单一路径行为,而一些恶意代码存在多条执行路径.针对这一问题,Moser 等人[12]提出通过建立系 统快照递归探索多执行路径的方法,改善了动态分析方法的单一执行路径问题.最初的动态分析借助调试工具 进行,依赖于分析者的经验,其断点等操作易被恶意代码察觉并采取反制手段.此后,国内外学者开发了一系列 的动态分析工具辅助人工分析,比较有代表性的是基于虚拟机和基于硬件模拟器的方法.基于虚拟机(VMWare) 的动态分析工具如 CWSandbox[13],采用挂钩 API 的方法监控程序行为.基于虚拟机的方法依然有一部分指令在 主 机 上 执 行,由 于 执 行 速 度 改 变 而 易 被 恶 意 代 码 察 觉;基 于 硬 件 模 拟 器 的 分 析 方 法 如 Bayer 等 人 开 发 的 TTAnalyze[14]系统,在 QEMU[15]的基础上开发,监控恶意代码与系统交互的 API 调用序列并生成报告输出.由于 静 态 分 析 和 动 态 分 析 各 有 优 缺 点, 因 此 产 生 了 两 者 结 合 的 混 合 分 析 方 法. 如,Kirda 等 人 [16] 基 于 间 谍 软 件 (spyware)的行为特征,利用动态分析监控组件与浏览器的交互确定代码区域,然后静态分析检查该代码区域,识 别系统调用信息. 恶意代码的特征描述方法是影响检测能力的重要因素.传统的恶意代码特征大多使用序列描述法.如, Kirda 等人[16]将特征描述为系统调用序列,Bailey 等人[17]用系统消息序列描述特征.序列描述法针对代码或行为 的先后次序,易受代码混淆手段的干扰.常用的还有控制流程图(control flow graph,简称 CFG)描述法[18].它以代 码的执行流程描述特征,但因局限于代码执行顺序,易受顺序无关操作调换等混淆方法的干扰.Christodorescu 等 人[19]将病毒源代码转换为自动机描述特征,并处理了垃圾代码插入及代码顺序变换等问题,但未能解决等价代 码替换的干扰问题.其他描述方法,如 Bilar[20]使用操作码频率分布等信息描述特征,此类通过频率分布来描述 的 特 征, 垃 圾 代 码 插 入 即 可 对 其 形 成 干 扰. 近 年 来, 研 究 者 开 始 使 用 依 赖 关 系 描 述 代 码 内 部 逻 辑 关 系, 如 Christodorescu 等人[21]使用系统调用及系统调用间的数据依赖图描述特征,动态挖掘恶意代码与正常代码的差 异子图来表示恶意代码特征,但其未考虑控制依赖关系的影响,且存在比较样本的选取和差异子图的连续性 问题. 恶意代码检测可分为基于启发式的检测和基于特征的检测.基于启发式的检测,如 Rootkit Revealer[22]系统, 通过比较系统上层信息和取自内核的系统状态来识别隐藏的文件、进程及注册表信息.还有一些研究工作通过
王蕊 等:基于语义的恶意代码行为特征提取及检测方法 381 监控系统特定资源来识别恶意代码,如 Strider Gatekeeper[23]系统检测恶意自启动项信息,VICE[24]检测各种恶意 代码常用钩子.基于特征的检测方法是目前的主流方法,传统的基于代码特征的检测具有速度快、效率高的优 点,但易受代码混淆技术的干扰.基于行为特征的检测从代码行为出发提取特征,如,Kirda 等人[16]根据间谍软件 获取敏感信息,再将数据泄露的行为特点进行检测,但其方法只局限于一类恶意代码.基于语义的特征检测从语 义角度抽象特征,如 Christodorescu 等人[8]通过静态分析代码,结合指令语义信息,使用三元操作符构造特征来进 行检测,可有效对抗指令重排、垃圾代码插入、寄存器重分配等混淆技术的干扰.但由于是指令级提取,对行为 层混淆技术的抗干扰能力较弱,且其匹配判定过程比较复杂.Kinder 等人[10]利用形式化方法,通过模型检验 (model-checking)来检测恶意代码. Sathyanarayan 等人[25]同样从语义角度出发,使用关键系统调用之间的相互 关系,静态分析挖掘一类代码的共同特征,采用统计学比较的方法进行检测,可对抗部分代码混淆技术的干扰. 然而,对等价系统调用替换等混淆方法未能很好地解决,且存在静态分析方法的局限性. 2 基本思路 现有恶意代码变种主要基于混淆技术实现.混淆技术是恶意代码针对当前特征检测方法使用的程序变换 技术.从混淆技术产生作用的层面,可将其分为代码层混淆和行为层混淆两类:代码层混淆通过变形、压缩等方 式,模糊、隐藏或改变原有代码特征,从而使基于代码特征的检测失效;行为层混淆则通过垃圾行为插入、执行 顺序变换及等价行为替换等方式,改变行为序列或执行流程,使基于行为序列或流程图的检测失效. 如图 1 所示,图 1(a)为 ForBot 的原始样本代码,图 1(b)为混淆代码.混淆代码在第 8 行插入了 CreateFile 垃 圾调用;在第 11 行、第 28 行插入了 ReadFile 垃圾调用.需要特别说明的是,混淆代码在第 14 行打开了 log.dat 文件,但实际上,该文件以只读形式打开,因此在后期执行时,第 17 行的写操作操作返回值必定为失败.因此,该操 作并不会引起操作系统的完整性变化,也是垃圾调用.在循环中,第 26 行使用 ReadFile 等价替换了初始代码中的 内存赋值操作,并且在循环中将读写粒度由 68 减为 30 以增加循环次数.在原始的代码中,在第 10 行、第 14 行 和第 16 行分别使用了 CreateFile,CreateFileMapping,MapViewOfFile 的行为序列将文件映射进内存后进行读操 作.而在混淆代码中,则是直接在第 20 行和第 26 行采用了 CreateFile,ReadFile 序列实现同样的读操作. (a) (b) Fig.1 Code segment of ForBot 图 1 ForBot 源码示例
382 Journal of Software 软件学报 Vol.23, No.2, February 2012 以上手段使混淆代码和原始代码在代码特征上发生了很大的变化,并打乱了行为序列,使其行为序列产生 了很大的差别.由这两段代码可知,代码和行为混淆技术简便易行并且效果明显.恶意代码普遍使用各种混淆手 段对代码进行处理,为恶意代码检测带来了挑战. 当前,基于特征的检测方法主要存在以下 3 个方面的问题:其一是特征匹配能力单一,无法检测同类变种,影 响检测准确性;其二是现有特征多为代码特征或行为序列不能充分描述恶意代码的本质特性,易受混淆技术干 扰;其三是大量变种需要不同特征进行描述,特征库需要不断更新,从而造成特征库规模庞大,对性能产生影响. 以 上 问 题 的 根 本 原 因 在 于 , 用 作 检 测 的 恶 意 代 码 特 征 未 能 很 好 地 表 征 恶 意 代 码 的 行 为 本 质 及 意 图 . Christodorescu 等人[21]也曾在研究中指出:目前检测工具的效果不理想,主要是由恶意代码的特征描述和实际行 为之间存在差距导致的.现有的基于序列、流程图的描述方法不能直接反映恶意代码的内在逻辑,而目前使用 依赖图的特征描述中,也仅关注到数据依赖或只补充少部分控制依赖,对行为逻辑关系的描述能力有限. 基于以上分析,本文的目标是从恶意代码行为之间的逻辑关系出发提取特征,提高恶意代码特征的描述能 力和抗混淆能力,从而提高恶意代码的检测能力,特别是对恶意代码变种的识别能力.我们的基本思路是,将指 令层分析与行为层分析相结合,利用动态污点传播分析方法,提取恶意代码的关键行为及依赖关系,从语义的角 度抽象出能够识别同类恶意代码变种的行为特征,使用基于行为依赖图的方法进行描述;最后,以该特征作为恶 意代码检测依据,构建一套适于该特征的检测算法来提高检测能力. 系统调用是应用程序与系统交互的接口,用户空间的应用程序通过这组接口获取系统内核服务,应用程序 的行为目标几乎都是通过系统调用实现的.因此,本文使用恶意代码执行的系统调用(system call)及系统调用之 间的依赖关系来描述恶意代码的行为特征.由于系统调用种类、数目繁多,本文只关注关键系统调用(critical system call),即所有可能导致安全问题的系统调用[21,25].据分析,几乎所有的恶意代码为实现目标而对敏感数据 的操作都与关键系统调用相关[3],因此,监控关键系统调用可以使恶意代码的行为分析更有针对性,有利于清晰 地理解恶意代码的目标并提高效率.为了描述恶意代码行为之间的关系,我们使用关键系统调用之间的数据依 赖关系和控制依赖关系共同创建依赖图.依赖关系能够描述行为逻辑,不受执行流变换的混淆技术干扰.与以往 使用依赖关系的描述方法不同的是,除了数据依赖关系以外,我们还提取控制依赖关系.由于恶意代码可使用控 制依赖影响数据依赖而逃避检测,我们提出同时考虑数据依赖和控制依赖的行为依赖图描述方法,对恶意代码 的行为特征进行更为准确、全面的描述.在依赖关系的提取方面,我们在现有动态污点传播方法的基础上进行 扩展,实现对关键行为的细粒度跟踪和依赖关系的准确提取. 为了对抗混淆技术的干扰,我们通过语义分析,由行为依赖图抽象出行为特征.在恶意代码变种的过程中, 其核心行为是保持不变的,即其主要功能部分的代码语义是保持不变的[7].基于这一特点,我们创建了基于语义 的抗混淆引擎,目标是从一个恶意代码样本中提取能够识别该类恶意代码变种的特征.针对常用混淆方法,本文 通过行为层分析,从语义无关和语义等价两个方面对行为依赖图进行处理.由此形成的恶意代码行为特征图,对 垃圾行为插入、等价行为替换等各类行为层混淆技术的抗干扰能力明显增强. 为了验证所提取行为特征的准确性和有效性,我们设计了一套基于该特征的检测方法对其进行验证,并完 成了特征提取及检测的原型系统,系统框架如图 2 所示. 恶意代码 待测代码 动态污点传播 系统调用及 依赖关系 行为依赖图 基于语义的 抗混淆引擎 语义等价序列库 匹配 特征值计算 特征库 检测结果 Fig.2 Framework of malware signature extraction and detection system 图 2 恶意代码特征提取及检测系统框架图 系统基本流程如下:
王蕊 等:基于语义的恶意代码行为特征提取及检测方法 383 (1) 在可控环境中,利用可回溯的污点传播技术分析恶意代码的执行流程,识别并记录其中的关键系统调 用、系统调用之间的数据依赖关系和控制依赖关系以及与污点数据相关的指令信息. (2) 结合指令信息,根据系统调用、数据依赖关系和控制依赖关系构建恶意代码行为依赖图. (3) 通过行为层的语义分析,对行为依赖图进行抗混淆处理,识别并处理其中的语义无关调用和语义等价 调用,得到基于语义的恶意代码行为特征图. (4) 基于所提取的特征对恶意代码进行检测.根据操作敏感度对行为特征图中的节点和边赋予相应的权 值,设定加权特征值的计算方式及检测阈值;对待测代码进行污点传播分析,根据其执行的系统调用及 依赖关系与特征库中特征的匹配情况计算特征值.当特征值大于检测阈值时,判定该代码为恶意代码. 3 行为特征提取 基于语义的恶意代码行为特征提取过程是在获得恶意代码样本之后,通过对其运行过程的动态跟踪,分析 其行为及语义,提取行为特征.这部分主要包括 3 个方面的内容:  一是对目标代码的数据流分析,提取并分析关键数据和属性.此部分基于动态污点传播分析方法实现. 通过可回溯的动态污点传播技术,跟踪分析代码的数据处理流程,提取行为分析相关的关键数据.  二是基于提取的动态数据和相关属性构造行为依赖图,结合污点传播过程和数据流分析,构造包含数据 依赖关系和控制依赖关系的恶意行为依赖图.在本文中,主要是对依赖图的描述方法进行了扩展,并提 出了一套基于可回溯的动态污点传播的依赖图构造方法.  最后,基于构造的恶意行为依赖图,通过语义抽象提取恶意行为特征,并生成相应的特征描述.在本文中, 主要解决了语义无关调用和语义等价调用的混淆问题. 3.1 动态污点传播分析 为了提取恶意代码的行为特征,首先要提取描述恶意代码行为特征的关键数据.在本文中,需要提取的关键 数据可分为数据元素和关系元素两类.数据元素包括恶意代码执行的关键系统调用及其参数,我们将系统调用 描述为 F={Ret,Parameterin,Parameterout}.其中,Ret 表示系统调用返回值,Parameterin 表示系统调用的传入参数, Parameterout 表示传出参数.关系元素包括数据依赖关系和控制依赖关系.数据依赖关系是由数据的定义和使用 而形成的关系,对于两个系统调用 F1,F2,若 F2 使用了由 F1 定义的数据,且在 F1 到 F2 的执行路径中没有其他系 统调用重新定义该数据,则 F2 数据依赖于 F1.控制依赖关系是指对于两个系统调用 F1,F2,若 F2 能否被执行由 F1 的执行状态决定,则 F2 控制依赖于 F1.同时,为了辅助后续分析过程,我们在提取上述关键数据的过程中提取了 执行过程中与关键行为流程相关的指令信息. 本文中,这些关键数据的提取是通过对恶意代码样本进行动态污点传播分析来完成的.污点传播分析是一 种有效的分析攻击行为、提取攻击信息的方法[26].在污点传播分析中,通过标记敏感数据为污点并编写污点传 播规则,然后根据污点传播规则对代码执行过程中的各种系统调用和指令执行流程进行污点传播计算,构建相 关行为之间的依赖关系,并记录相关数据. 本文使用可回溯的污点传播引擎进行分析.我们对 Dawn Song 的执行流回溯[25]方法进行扩展,实现污点操 作流回溯.由于本文分析关注的是代码执行的关键系统调用之间的数据依赖关系和控制依赖关系,均为与污点 相关的操作之间的关系,而执行流回溯包括所有执行到的指令,为了提高分析的针对性,排除无关指令的干扰, 避免冗余数据量,我们根据本文的应用场景对回溯过程进行修改,针对敏感数据,在污点操作流上进行回溯.我 们使用双链表链接污点传播节点,使其可以回溯污点源和污点传播流程. 污点传播分析过程包括污点标记、污点传播和污点漂白这 3 个方面.首先是标记污点数据,在分析过程中, 我们将系统调用的返回值(若未作特殊说明,所指系统调用返回值均包括 in-out 类型参数返回的数据)作为污点 源.我们选择性地构建了需要作为污点源监控的系统调用列表,并对其作了初步分类,主要包括文件、网络、注 册表、进程这 4 类,可描述为 Funcsensitive={FileTaint,RegistryTaint,NetworkTaint,ProcessTaint}.其中,每类污点源 集合包含了此类需要监控并标记的系统调用,如 Filetaint={CreateFile,OpenFile,ReadFile,...}.当污点源集合中的
384 Journal of Software 软件学报 Vol.23, No.2, February 2012 系 统 调 用 发 生 时, 根 据 该 污 点 源 的 类 型, 标 记 其 返 回 值 为 污 点. 如,CreateFile 应 标 记 返 回 的 Handle 为 污 点,ReadFile 标记读出内容的内存范围为污点.为了方便描述,我们将污点源系统调用列表中的系统调用统称为 敏感系统调用.为了描述污点数据,我们构建影子内存(shadow memory)Taint={Address,Length,Status,Type}来保 存污点数据记录.其中,Address 表示污点的起始地址,即在进程虚拟地址中的偏移;Length 表示污点数据的长度, 以字节为单位; Status 表示污点数据的状态(执行、改写等);Type 表示污点的类型,分为 Regs 普通寄存器、 EFLAGS 标志寄存器和 Mem 内存数据 3 种.污点数据包括两种情况:一种是内存中的数据,另一种是寄存器.对 于内存中的数据,我们根据内存地址、数据的长度和当前内存状态创建影子内存.对于寄存器,同样标记影子内 存.由于控制依赖关系分析的需要,我们对标志寄存器 EFLAGS 创建单独的记录. 当污点标记完成后,我们对恶意代码进行单步指令分析,通过污点传播规则计算污点传播路径,提取数据依 赖关系和控制依赖关系.污点传播规则包括针对系统调用的传播规则和针对指令的传播规则.系统调用的传播 规则根据不同的函数编写,对于系统调用 F={Ret,Parameterin,Parameterout},若传入参数 ParameterinTaint,则将 返回值 Ret 和传出参数 Parameterout 也标记为污点.指令的污点传播规则根据指令类型编写.在我们的分析中, 主要关注内存操作指令、运算指令和控制流转移指令.在污点传播过程中,如果系统调用 F1 产生的污点源 T1 传 播至 F2 的传入参数,则 F2 数据依赖于 F1,记录数据依赖关系.在污点分析过程中,控制依赖表现为污点数据传播 至 EFLAGS,进而影响控制流转移的过程.因此,当控制流转移指令将被执行,同时,该控制流转移指令依赖于带 有污点的标志寄存器时,对当前执行的指令和其后的指令进行反汇编,通过计算后必经节点判断当前控制流转 移指令的控制范围[26].如果系统调用 F1 产生的污点源 T1 传播至影响控制转移的指令 i,则指令 i 控制范围内的 所有系统调用{Fi,1,Fi,2,…}均控制依赖于 F1,记录控制依赖关系. 污点漂白的过程即污点被无关数据改写的过程.对于污点数据记录 Taint、数据 D 和路径 L,如果D,DL, 且 DTaint,则污点数据 Taint 中以 AddressD 为起点、LengthD 长度的内容被漂白.在污点漂白时,对污点传播流 程进行回溯,提取行为之间的依赖关系. 通过可回溯的污点传播分析,我们获取到恶意代码执行的关键系统调用、系统调用之间的数据依赖关系和 控制依赖关系以及污点数据相关的指令信息,将其作为描述恶意代码行为特征的关键数据. 3.2 行为依赖图构建 构造行为依赖图的过程即描述恶意代码执行的关键系统调用之间的数据依赖和控制依赖关系的过程.根 据可回溯的污点传播分析提取的恶意代码执行的关键行为数据,构建行为依赖图. 我们将行为依赖图 Ginitial 描述为 Ginitial={Entry,Exit,N,C,D,Code},其中,Ginitial 表示行为依赖图,Entry 表示图 的入口节点,Exit 表示出口节点,N 表示其他节点,C 表示控制依赖边,D 表示数据依赖边,Code 表示在该图执行过 程中访问的指令记录.由于在污点传播分析中以敏感调用操作的返回值作为污点源,即图的入口,在分析中可能 出现多个行为依赖图,我们将这些图的集合标记为 Tinit={Ginit1,Ginit2,…,Ginitn},nN. 行为依赖图的构造过程包括入口节点的产生、节点的添加、数据依赖边和控制依赖边的添加以及构造结 束的判断. 在对恶意代码开始分析时,行为依赖图集合 Tinit 为空.我们以产生污点的关键系统调用作为入口节点 Entry 生成图 Ginitial,同时更新影子内存记录为当前污点的起始地址、长度、状态和类型信息,以便后续污点传播分析 使用.此后对恶意代码的单步处理中,分析执行的每一条指令,计算污点传播流程. 当新系统调用发生时,解析其传入参数,如果包含污点数据,则将该系统调用作为一个新节点加入到依赖图 Ginitial 中.需要注意的是,当文件映射进内存之后发生读写指令时,我们需要将其转译为相应的系统调用节点.例 如,在恶意代码的文件访问操作中,常使用 CreateFile,CreateFileMappint,MapViewOfFile 将文件映射进内存后进 行读写,此时,相关的读取指令并非使用传统的 ReadFile,而是内存读写类的指令(如 memcpy).以往的分析方法 在这种情况下将缺失本应记录的系统调用及依赖关系,为了解决此问题,我们采取将此类指令转译为系统调用 的方法.这里的难点在于如何判定转义指令.我们注意到,转义指令之前往往有为该转义指令提供执行环境的系 统调用序列,因此,我们使用 DFA 匹配系统调用序列.该 DFA 由手工定义得到,其状态节点包括系统调用和指令.
王蕊 等:基于语义的恶意代码行为特征提取及检测方法 385 当映射系统调用状态匹配之后,根据污点操作指令,将后续匹配的内存操作指令替换为与其等价的系统调用.以 上述文件映射读操作为例,相应 DFA 的前几个状态表示连续的 CreateFile,CreateFileMappint,MapViewOfFile 操 作,在前面 3 个状态匹配之后,开始匹配污点数据操作指令,如果出现对污点数据进行读取的指令,则将其替换为 ReadFile. 依赖边的添加是通过在添加新节点时回溯计算污点传播过程完成的,包括数据依赖边和控制依赖边两种 情况.对于数据依赖边的添加,在新节点加入时,回溯污点传播路径,查询当前污点数据与产生污点的系统调用 节点之间的数据依赖关系,在相关节点和当前节点之间添加数据依赖边.由于控制依赖分析的目标是标志寄存 器引起的控制流转移,因此控制依赖边的添加需要通过识别污点数据对于标志寄存器的改变和计算控制范围 实现.若一个系统调用节点产生的污点数据影响了标志寄存器 EFLAGS,同时在污点传播分析中发现标志寄存 器被作为控制流转移的判断条件,则计算当前控制流转移指令的后必经节点得到其控制范围.当新的系统调用 产生时,判断其是否在某个污点数据的控制范围内,如果是,则在该节点和对应污点源之间添加控制依赖边.在 实际分析中我们发现,代码编译时可能存在多种控制流转移结构,如 switch 分支语句、if else 条件语句、while 条件循环等.我们还发现,不同的编译器会生成不同的二进制代码,例如,在判定 eax 时,若判定是否为1,则代码 被编译为 inc eax;若是其他值,则被编译为 cmp eax,x(其中 x 代表所要判定的值或者其所在寄存器)的形式.基于 以上问题,控制依赖分析的难点在于,如何全面地分析影响控制流转移的指令和如何在动态分析的过程中获取 控制依赖的范围.对于分析影响控制流转移的指令,我们通过针对所有可能改变标志寄存器的指令编写处理规 则来解决;对于控制依赖范围的判定,由于 switch,if, while 最终会被翻译为包含 1 个或多个 jnz 类的二进制代码, 而动态分析每次只分析 1 条路径,因此仅通过动态执行代码的方法无法判定控制范围.控制依赖的范围判定可 通过使用不同编译器产生的代码特征来识别特殊结构实现[27],然而,由于编译器的多样性和不同编译优化结果 的可能,我们并没有采用此方法.我们在系统中整合了反汇编引擎,当发生控制流转移时,递归地反汇编其后继 指令,并使用 Sreedhar 等人[26]提出的计算后必经节点的方法计算该指令的控制范围,以确定控制依赖范围.该方 法存在一定的局限性,例如,使用指针数组进行的控制流转移是使用一个数组结构记录代码指针,当需要执行相 应功能时,计算数组索引取出函数指针地址并跳转到该地址执行,该过程中没有使用标志寄存器而实现了控制 流转移;使用我们的方法无法获取其控制依赖关系,此问题将在我们下一步的工作中改进.由于该类代码一般由 手工编写而非编译器生成,很少使用,因而对于实际分析的效果影响不大. 需要说明的是,在两个系统调用节点之间,可能既存在数据依赖关系又存在控制依赖关系.对于此种情况, 我们将在两节点之间同时添加数据依赖边和控制依赖边,即在两节点之间同时存在两条依赖边. 行为依赖图构建的结束有两种情况:第 1 种是当已经产生的污点记录全部被漂白时,在其后的系统调用不 可能产生相关的操作,因此当前污点的行为依赖图构建结束;第 2 种情况是当恶意代码执行完成时,行为依赖图 创建结束. 3.3 基于语义的抗混淆特征生成 行为依赖图可以对恶意代码行为之间的依赖关系进行描述,但是考虑到恶意代码在行为层仍会采用混淆 技术进行干扰,我们从语义角度出发,针对行为层混淆技术构建抗混淆引擎,在行为依赖图的基础上进一步处 理,提取出有一定抗混淆能力、可用于识别一类恶意代码变种的行为特征图. 通过对行为层混淆技术的分析,我们从语义角度将其分为语义无关调用插入和语义等价调用变换两类.语 义无关调用插入是指恶意代码中常加入一些与其意图无关没有无实际作用的系统调用,目的是改变代码特征, 我们从语义角度将其称为语义无关调用.语义等价调用变换主要是指通过等价系统调用替换、循环变换等方式 改变执行行为的系统调用序列,从而改变特征.等价系统调用序列是指行为相同的不同系统调用序列,将其互相 替换,便可在不改变行为的前提下改变特征.循环变换即指改变操作粒度,将同样的行为分割为不同循环而产生 不同图特征的混淆方式.这两种混淆方法的共同特点是,在保持恶意代码行为意图即代码语义的条件下,通过等 价替换改变特征,我们将此类变换统称为语义等价调用变换. 对于语义无关调用,我们通过分析污点传播过程是否对系统状态产生影响来对其进行识别并删除.我们认
分享到:
收藏