◆徐尚志 归光宗
部分查毒引擎的局限及验证
◆徐尚志1归光宗2
(1.北京邮电大学 北京 100871;2.山石网科研发部 北京 100871)
本文利用自主开发工具检测查毒引擎的查毒能力是否存在一定局限性。PE文件结构中有部分区域为空白区域,本文利用随机填充PE文件中空白区域这一方法,在不影响文件正常运行的情况下,修改恶意文件的全文哈希值以及部分恶意特征码结构,随后利用查毒引擎进行查毒检测,验证是否部分查毒软件存在局限性,可以被上述方法绕过。
查毒引擎;PE文件结构;绕过手段
随着网络技术的应用和发展,网络安全问题对于用户的威胁日益显现,尤其是恶意软件数量的不断增涨,给个人用户的信息安全造成了严重威胁。为了有效地保护隐私,用户往往会选择安装查毒引擎,但是部分查毒引擎存在着设计缺陷,例如仅使用病毒样本全文哈希值特征匹配进行查毒、仅使用二进制文件全文匹配进行查毒等。这些技术检测能力弱,很容易被攻击者绕过。因此,如何验证查毒引擎是否存在上述局限性,成为一个亟须解决的问题。
据报告显示,现今已经有上亿个恶意软件,Panda Security在2015年共计检测到84000万新款恶意软件样本,然而这仅占史上恶意软件总数的27.63%。如果查毒引擎不能够对简单的填充绕过(例如本文中使用的PE文件空白填充)进行识别和拦截,那么对于文件中一个仅仅8bits的空白区域,就可以产生256个全文哈希值不同的变种文件,如果这些变种文件都可以运行,且查毒引擎不会对这些文件进行报毒,就会造成恶意软件绕过引擎查毒,威胁用户安全;如果查毒引擎对这些文件进行报毒,但是查杀引擎单纯将文件的全文哈希值等特征加入病毒数据库,会使得病毒数据库特征数据数量激增,如果黑客生成大量变种文件对查毒引擎进行攻击,可能造成引擎数据库的冗余,大幅度降低查毒效率与引擎性能。
本文分析了市面上查毒引擎现状,介绍主流查毒方法和新兴查毒方法,介绍PE文件基本结构。随后,对于“部分查毒引擎存在局限性”这一猜想,借助工具Virustotal网站进行验证。Virustotal是一个提供可疑文件分析服务的网站,对于上传的可疑文件,它借助几十种查毒引擎对其危害性进行判别,并形成结果报告,Virustotal几乎囊括了世界上所有的杀毒软件。
本文首先对部分查毒引擎的局限性提出合理猜想,而后查找PE文件中各节区之间、各节区内部、节区与PE头之间存在的对齐填充区域,并对该区域进行随机填充,得到新的PE文件。随后检测新生成的PE文件是否可以绕过查毒引擎,验证猜想是否正确。
具体工作如下:
(1)介绍自主开发的工具以及实现思路。
(2)通过自主开发的工具,对PE病毒样本的空白区域进行填充,生成指定数量的新PE文件。
(3)利用Virustotal网站对填充后的恶意PE文件进行检测,查看是否能够绕过查毒引擎。
(4)总结部分查毒引擎的局限性,提出合理化建议。
实验结果表明,VirusTotal集成的部分查毒引擎,确实存在一定的局限性,通过对二进制文件填充部分的修改可绕过这些引擎。然而同时也有许多引擎经过精心设计,能够检测出修改后的恶意病毒的行为并报毒。
1989年,第一款查毒软件Mcafee的诞生标志着依赖特征码的查毒引擎时代的开始。依赖特征码的查毒技术分为单一特征码查毒技术、多重特征码查毒技术。
这两者的区别在于,单一特征码查毒只需要检测到待检测文件存在一段特征与指定特征码匹配就报毒,而多重特征码查毒需要检测到待检测文件存在许多段特征都与指定的一组特征码匹配才报警,减少误报。
查毒引擎厂家通过收集病毒样本,病毒工程师通过逆向等方法找到恶意文件独一无二的一段二进制恶意代码,也就是特征码。将特征码的偏移量和特征码本身写入引擎的病毒库。电脑在开机的时候,病毒库中特征码被读到内存中,例如当用户从网络下载了一个文件,引擎会读取该文件内容并且与特征库中的所有特征码“关键词”进行匹配,如果命中了特征码,就进行报毒。
这种技术,尤其是多重特征码查毒技术,在如360的系统修复查毒引擎中依旧有使用。为了避免误报,查毒引擎往往使用多重特征码查毒技术。这样的检测逻辑也为本文“随机填充一段对齐填充区域绕过查毒引擎”的方法提供了实现的可能性。
启发式分为“行为启发”和“静态启发”两种,行为启发利用监测恶意文件的动态特征,即借助cpu模拟器来监测程序恶意行为,决定是否报毒;静态启发利用静态特征进行监测,例如如果一段程序包含“MOV AH,5/INT”,也就是调用格式化盘操作的功能,就值得引起警觉。
该技术是一种具备人工智能查毒的一些特点的查毒手段,但仍然要依赖特征码,比如一些查毒引擎会按“家族”来查杀,例如:腾讯TAV引擎特征库中包含Virus.Win32.DiskGen家族,在该家族多个变种里,都包含有这个家族特有的一段特征码:18 8B 8E 30 0A 00 00 03 C8 40 40 8A 11 F6 D2 88 11 3B 05 3F 3F 3F 3F 7C;这段特征码是该家族病毒的自解密代码。
启发式查毒引擎例如:小红伞、NOD32等。这些引擎依然需要利用特征码查毒,因此在一定情况下,本文的绕过手段也可以绕开一些启发式查毒引擎。
人工智能查毒引擎通过从大量的病毒样本中归纳形成决策树与向量机,无需手动更新,同时完成摆脱了对特征码依赖,查毒速度很快,例如新一代的360产品QVM引擎就是人工智能查毒引擎。
人工智能引擎对于新出现的病毒有很好的检测以及学习的能力,配合白名单手段,能够有效地避免误杀误查。
PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL格式文件、EXE格式文件、SYS格式文件等,PE文件的具体结构如图1所示。
图1 PE结构示意图
DOS头是用来兼容MS-DOS操作系统的,其中的e_lfanew成员指明了NT头在文件中的位置,本文中的工具就是读取这一成员确定NT头的位置;DOS存根作用是当文件在MS-DOS上运行时显示文字,没有DOS存根,文件也能正常运行。
NT头中包含PE签名(通常为“P”、“E”两个字母)、文件头、扩展头。
PE文件头定义了PE文件的一些基本信息和属性,本文中工具读取其成员NumberOfSections来确定节区的数量;PE可选头是一个可选结构,由于PE文件头结构不足以定义PE文件属性,因此可选映像头中定义了更多的文件属性,如操作系统版本号等。
节表包含每个节区在文件中的信息,其中成员分别指向不同的节区实体,本文中的工具读取节表信息来获取各节区的大小、位置等信息。
其余部分是各个节区,PE文件至少会有两个节区:代码块和数据块。每一个节区都有不同的名字,这个名字主要是用来表达节区的用途,例如.text节区是默认的代码区块,其内容为指令代码;.rsrc节区包含文件资源,如图片、菜单等,是一个只读节区。
图2 PE加载机制示意图
这里简单介绍一下与本文中工具相关的PE加载机制。
PE文件的结构在磁盘文件中和载入内存后基本相同,但在载入内存中时又不是完全复制,因为有些数据在载入前会被预先处理,载入后,数据之间的相对位置可能发生改变。因此,一个节区的偏移和大小在装入内存前后可能是完全不同的。
如图2所示,在加载入内存之后,PE文件各个节区之间往往会添加对齐填充区域,内容为NULL。
猜想一:是否会有查毒引擎为了查毒效率的提升,减少人工分析病毒的成本,仅使用病毒样本全文哈希值对待检测文件进行匹配,如果完全匹配才进行报错。
猜想二:为了避免误查误杀,是否有部分查毒引擎会仅在特征码与待检测文件中的某些字段完全匹配时才会进行报错。
下面将结合图1介绍猜想的验证思路。
首先验证查毒引擎是否仅使用病毒库中文件的哈希或者二进制全文对文件进行匹配,验证思路为:寻找一个带有恶意行为的PE文件,读取PE头结构中的内容,进而确定PE头与第一个节区之间的空白、各个节区之间的空白、最后一个节区到结尾之间的空白的位置和大小。对空白中任意长的区域进行随机填充,生成新的PE文件,并测试文件是否能够正常运行,如果能够正常运行,使用查毒引擎进行查毒,如果能够绕过查毒引擎,则猜想成立。
其次验证能否通过空白填充绕过部分特征码匹配模式。在节区内部,往往也存在着一些NULL填充的部分,如图3所示。
图3 内存中节区内部的空白区域
图4 工具版本一流程图
图5 工具版本二流程图
这些部分在PE文件执行过程中可能会用作暂存区域,并不会用做指令被执行。如果查毒引擎的特征码中包含这种不会影响PE文件正常行为的空白区域,则可以对该区域进行随机填充绕过查毒。
因此计划使用程序遍历文件,设定一个阈值,如果在节区内部包含大于这个阈值的空白区域,则进行任意填充,生成新的PE文件,并测试文件是否能够正常运行。如果能够正常运行,使用查毒引擎查毒,如果能够绕过查毒引擎,则猜想成立。
工具整体设计思路流程图如图4和图5所示。
首先利用工具版本一填充选定恶意文件中的空白,填充内容为“0x90”,不会影响程序执行。生成4个可以正常运行的PE文件。
随后利用VirusTotal网站进行检测,检测结果如表1、表2所示(只列出部分查毒引擎)。
表1 工具版本一结果(上)
AlibabaBaiduComodoYandex报毒引擎数量 原文件√X√√54/70 文件1XXXX47/70 文件2XXX√48/70 文件3XXX√48/70 文件4XXX√48/70
注:√表示该引擎将该文件识别为有害,X表示该引擎识别文件为无害,54/70表明共使用70个引擎检测,其中54个报毒,下同。
表2 工具版本一结果(下)
TencentQihoo-360KingsoftMicrosoft报毒引擎数量 原文件√√√√54/70 文件1√√X√47/70 文件2√√X√48/70 文件3√√X√48/70 文件4√√X√48/70
通过上面的实验可以看出,大多数查毒引擎依然能够将填充后的文件检测为恶意,但是也存在一些查毒引擎(Alibaba、Kingsoft等),通过改变一部分空白区域就能绕过查杀。这样的局限性可能是由于特征库不完整,或者是如同猜想中提出的,引擎仅使用病毒库中文件的全文哈希值或者二进制全文对文件进行匹配,如果没有完全匹配就不会进行报错。
其次利用工具版本二对上述恶意文件源文件进行填充,这次会填充文件中节区内部的空白区域。共生成10个可以正常运行文件,将阈值设定为16,填充内容为“0x90”,当节区里空白大于16时才进行填充。VirusTotal网站检测结果如下:
表3 工具版本二结果(上)
AlibabaBaiduComodoYandex报警引擎数量 原文件√X√√54/70 文件1XXXX41/69 文件2XXXX43/70 文件3XXXX41/69 文件4XXXX42/69 文件5XXXX46/70 文件6XXXX48/70 文件7XXXX46/69 文件8XXXX45/69
表4 工具版本二结果(下)
TencentQihoo-360K7GWZillya报警引擎数量 原文件√√√X54/70 文件1√√XX41/69 文件2√√XX43/70 文件3√√XX41/69 文件4√√XX42/69 文件5√√√√46/70 文件6√√√√48/70 文件7√√√√46/69 文件8√√√√45/69
从上述实验中可以看出,相比较于单纯填充节区之间的空白,填充节区内部的空白能够绕过更多的查毒引擎,且在本例中,填充文件前两个节区,也就是.text和.rsrc节区能够绕过更多的引擎。验证了猜想:部分查毒引擎不是利用样本全文哈希值简单匹配或者二进制文件整体简单匹配,而很可能是利用特征码与待检测文件中的某些字段匹配,完全匹配时才会进行报错。
通过上述实验,可以得出结论,部分查毒引擎存在一定的局限性,主要体现在可以通过对文件的简单修改填充绕过查毒。本文中使用的仅仅是最简单的填充手段,作为实验用,真正的攻击绕过手段会比文中所使用的复杂许多,因此简单的病毒样本全文哈希值特征匹配、长期未更新的特征码匹配会给使用查毒引擎的用户带来很大安全隐患。
解决本文中绕过的方法也并不复杂,第一种解决方法是增加一个填充绕过过滤器,过滤器完成工作与本文中工具“版本一”相反,文中工具是通过PE头获取对齐填充区域的位置并随机填充,过滤器要做的是确定对齐填充区域的位置,使用NULL填充该区域以防止该区域中有被篡改的数据。
当然这种方法存在局限性,正如前文中描述的PE文件加载机制,首先,PE文件被加载存储到内存中和存储在文件中各部分的偏移是不同的,在PE文件中,PE头中记录的节区大小,指从节区开始到在文件中下一个节区起始位置之间的大小,是包含两节区之间NULL填充区域的,并不是非NULL区域的大小,因此这种方法不能复原在存储在文件中的情况下节区之间的对齐填充部分,能复原的是PE头与第一个节区之间的NULL填充区域。
第二种方法是迭代查毒引擎,采用更先进的技术,例如启发式查毒、人工智能查毒等。
[1]亓胜田. 基于启发式杀毒的智能移动终端安全研究[J].计算机光盘软件与应用,2012.
[2]资讯实习三. 杀毒技术哪家强?看25年三代杀毒引擎的演变[R].中国网,2014.
[3]王海峰. 基于智能特征码的反病毒引擎设计[J].计算机工程,2010.
[4]邸宏宇,张静,于毅等. 一种基于改进模糊哈希的文件比较算法研究 [J]. 信息网络安全,2016.
[5]小金. 杀毒软件引擎技术分析安全的动力源泉[J].新电脑,2007.
[6]史瑀. 脱掉"马甲"抓病毒瑞星杀毒软2007VUE引擎详解[J].电脑爱好者,2007.
[7]陈渝,韩利,董毅明. 杀毒软件继续使用意愿影响因素及调节效应实证研究[J].科研管理研究,2013.
[8]胡昕明. 计算机装杀毒软件的杀毒误区分析[J].电脑知识与技术,2018.