查看: 6554|回复: 58
收起左侧

[技术原创] 解析启发式杀毒

  [复制链接]
B100D1E55
发表于 2017-1-2 12:18:48 | 显示全部楼层 |阅读模式
本帖最后由 B100D1E55 于 2017-1-2 15:04 编辑

前一段翻ESET的文章的时候发现了这篇12年的短文,觉得里面举的例子挺有意思的就顺手翻译了一下。原文基本没涉及到详细的技术细节,但作为科普了解一下还是很有意思的。方括号里是我自己加的注释,可能有错,轻拍
原文(图片等都来自这文档):http://www.welivesecurity.com/media_files/white-papers/Understanding_Heuristics.pdf
我没有逐字翻译,并裁掉了解释加密和压缩为什么会让特征检测失效的部分(内容比较冗长),核心意思上是完整的

何为“启发式(Heuristic)”
现今几乎所有的反病毒软件都在使用“启发式查毒”,然而大部分人并不知道这个词是什么意思。在牛津词典中对于“启发式”的解释是“使一个人能自主发现并学习某个东西”,而美国传统英语词典中对此的解释是“能调查或解决一个问题的一种推测性的构想”。当然这两个解释在描述“启发式”的重要性和工作原理上并没多少帮助……
在这里笔者使用一个类比来解释这个概念。假设读者被要求从下图的众多照片种识别出一种从没听说过的犬类的照片(例如卡塔胡拉豹犬),以下是可能的推理过程:
2017-01-01_220404.jpg
因为要找的是哺乳动物,首先有人会把鱼类照片排除掉。排除鱼类照片下方的杜宾犬照片则类似,因为不少人都熟悉杜宾犬这个品种。排除熊的照片则有意思得多:试想如果一个人从未见过熊,怎样才能不错把熊认成犬类?在这样的情况下通过“启发式”来识别相当艰难,而对电脑来说则更是这样,因为给电脑编程需要描述非常精确的执行步骤。
可能有些人会被猫的照片迷惑,因为卡塔胡拉豹犬的卡塔胡拉(Catahoula)这个词种包含了“cat(猫)”。但也有不少人应该会去寻找带斑点的狗,因为犬种的名字中包含“豹”这个字,从而联想到豹纹。通过排除掉大多人知道的小猎犬(右上图),最后找出的应该会是右下图身上有斑点的犬类照片。
在病毒侦测过程中,如果文件中包含完全未知的威胁,那么基于特征码侦测的方法将会失效。在这种情况下则可以通过启发式来识别这些未知的威胁。用最通俗易懂的话来说,启发式侦测就是:通过一系列规则来解决一个问题。

我们要解决什么问题?
反病毒厂商面临的挑战即让自己的产品检出最新的、从未见过的病毒。虽然保护电脑免受恶意威胁的方法还有很多,大部分方法都没达到“判识”的目的:沙盒和虚拟化可以将实机和未知文件进行隔离,但并无法真正得出这些文件是否有害的结论;另一方面,白名单通过仅让已知文件通行而实现保护,但恶意文件同样也有被误加白名单的可能性。

基于特征码的检测
特征码侦测类似于如下图的找单词游戏,这种方法虽然往往简单有效,但也有相应的局限性。例如叫一个人寻找下图中他/她不认识的单词(例如“WINT”),这就强人所难了。此外特征码也有误报的问题。
2017-01-01_220707.jpg
人们常常认为使用启发式的杀毒软件误报往往比较严重,但实际上特征码也有误报的问题。理由很简单:特征码仅通过某个文件的一小部分特征来判断恶意与否,就如同在搜索引擎中通过关键字“大象”来搜索某只特定的大象一样,返回的结果中错误答案远多于正确答案。为了筛选结果,可以考虑给关键词增加细节来减少误报(例如“一直叫Rudy的非常粗暴的大象”),但如果关键词太长则会导致效率底下。总之,特征码的提取是个权衡效率和准度的问题。
[译者注:很多人纠结扫描速度或者杀软体积其实和这个就息息相关,特征过长会导致字符串搜索耗时增加并增大特征库体积,过短就呵呵了]

不同类别的启发式侦测

基因特征识别
基因特征识别通过衡量某个未知的文件和已知恶意文件的相似度来进行判别。如果一个未知文件在关键的地方和已知恶意威胁高度相似则判为有害。例如下图中,假设读者已经熟悉了左边的黑褐色长毛猎犬,那么即使没见过右图的犬种,也能通过相似度推断出是某个品种的长毛猎犬。
2017-01-01_220920.jpg
假设有一种病毒的特征是:
添加三条特定的注册表项
包含一个SMTP引擎
下载邮件列表
发送一封内容为“World Ends Tonight – Film at 7”的邮件

此时你在一个未知文件中也发现了如下特征:
添加三条特定的注册表项
包含一个SMTP引擎
下载邮件列表
发送一封内容为“You won 10 Million Ueros”的邮件

由于未知文件和已知病毒特征高度相似,因此很有可能是同种威胁。此外细心的读者可能会发现上文中Euros拼成了Ueros——对的,写病毒的人拼写往往很差~
以下这个误报的例子展示了安全研究者们通过启发式判毒的一个常用方法:收集大量的黑文件和白文件,提取它们的特征并进行比对并筛查出恶意软件独有的特征。然而当笔者在扫描如下这个批处理文件的时候出现了误报(批处理文件无毒)
2017-01-01_221004.jpg
通过进一步查找发现是如下两行触发了报毒机制
2017-01-01_221041.jpg
报毒的原因是因为之前提取特征的白文件集中并未有rem后跟六个连字符的情况出现。这说明研究人员需要更大的白样本库来减少误报——这在理论上很简单,在现实中却不一定容易实践。
[译者注:从上文描述来看,很多病毒引擎的原理的确是基于这种原则。例如之前我曾经在kafan看到avast用kNN算法收纳新病毒的文章,kNN(k个最近邻居)本质上就是一个判识未知数据和已知数据(例如恶意特征)亲缘度的算法,虽然原理简单,但实际应用往往挺有效。又例如360的QVM引擎,个人认为本质上也是通过提取特征并检测亲缘度来判识。这类方法往往需要非常大量的黑白样本,QVM中SVM模型hyperplane的划分自然是样本越多越好,虽然也要避免过拟合等问题……较为先进的NIDS中这类手段往往反过来用于评估和正常网络流的相似度]

静态启发式检测
静态启发式检测通过扫描文件的潜在行文来判识病毒,以下这个误报的案例展示了被动启发式侦测的原理:
下图这个文件是微软的一个目录文件(DEFAULT.CAT)。目录文件是用来在不改变文件的前提下对文件进行签名的一个数据库,因此既不可执行也无害。
2017-01-01_221211.jpg
在这个例子中扫描引擎发现了CD26这个字符串。对于DOS下.COM文件来说这代表了对磁盘直接写入的行为。虽然这个例子是一个误报,但静态启发式引擎的确正确的侦测了这个潜在行为——如果.CAT后缀名被重命名为.COM并在一个DOS环境下执行,这个文件可能的确有害。
[译者注:个人认为这和特征侦测本质区别不大,可能最大的区别在于特征码往往是字符串层级的识别(例如一些shellcode injection特征,只要找到了八九不离十就是毒),而被动启发注重于侦测行为(找到了相应特征也要进一步通过打分才能判别)]

动态启发式检测
不同厂商对于这个类别的启发式有着不同的命名。有些称之为“沙盘”,有些则称之为“虚拟化”或“模拟执行”。这类检测手段会构造一个安全的虚拟化执行环境,通过真实执行代码并观测行为来判识是否有害。对于一些通过自压缩或自加密来免杀的病毒来说,这是一个很好的对抗方式;而对于一些会自主变形的病毒来说这也相当有效,因为变形往往只涉及到文件二进制层级而不会改变具体行为。
动态启发式自然也面临误报问题。微软系统的白文件“Timeserver.exe”一度被某杀毒引擎检测为后门软件,报毒内容如下:
2017-01-01_221323.jpg
虽然这是个误报,但本质上杀毒引擎的确准确的检测出了这个白文件非常类似后门的行为。

如何减少启发式的误报
减少启发式误报的关键在于制定非常精确且精巧的规则,并且给这些规则赋予权重。正如同你观察一个走入银行的人是否是个罪犯,从服饰判别自然是可以的,但比起通过穿某种花纹的T恤来判别,是否带面罩更能说明问题。相应的,虽然持枪的是罪犯可能性相当高,但也不排除他们是这个银行的警卫的可能性……

文件打分的简单例子如下:
文件是否加密?1.5分
加密的文件往往很可疑,但别忘了一些正常软件防盗版措施也会进行加密
是否打开一个端口并监听?2分
这类行为可能比加密更可疑(需注意这里的分值只是一个例子用来展示打分的概念)
是否对一个已经存在的文件进行写入操作?3分
根据写入对象的不同这个分值也可能不同
是否有写入注册表行为?1分
……
是否有解析临时文件夹中文件的行为?5分
这种行为大多情况下极为可疑,邮件蠕虫有时候就有这种行为

当打分结束后,根据分值落入的不同阈值区间,一些文件可能被识别为记录器,一些可能则是潜在具有威胁的程序,等等。

[译者注:打分在机器学习中极为常见,又被称作ensemble learning,例如投票或者权重判别(weighted majority voting)。算法学界关于这些权重怎么设置已经有较为深入的研究。我猜是提取大量规则,然后用自动化的方法将规则比对大量测试黑白文件确定最终权重。当然这些权重会根据当时云收集的病毒流行比例进行不断优化。这也意味着杀软学习过程是在开发者端实现,而客户端接收的就是一些学习的结果,因此并不太消耗计算资源。由于学习过程仰赖于厂商,这也是杀软厂商部署云以及用户积极上报样本的必要性所在。]

常见报毒规则
基于特征码识别的报毒往往内容很具体,例如“Win32/Stration.YQ worm”。而带.gen的往往是通过基因码检测。另一些通过启发式报毒的则往往会注明“probably a variant of …”,其他的还包括“a variant of …”, “Probably unknown NewHeur_PE virus”等等。简而言之纯粹基于特征码的识别不会出现“可能”“变种”“潜在”的字样。
[译者注:大概和ESET本家报毒规则比较吻合……]

启发式有效吗?
在独立测试中,一些产品单单通过启发式就可以侦测高达86%的野生恶意病毒。而在包含了各类病毒、蠕虫和木马的大测试集中,一些产品单靠启发式就可以侦测50~60%的威胁。这说明了启发式的确可以有效侦测最新的病毒,但也说明其并不可能检出所有威胁。长久以来,学界都在不断研究进一步提高启发式侦测率并降低误报的方法。时至今日,一些有着优秀的启发引擎的产品在误报率上已经能和那些更加倚重特征码侦测的产品相匹敌。

评分

参与人数 14原创 +1 人气 +13 收起 理由
a110 + 1 版区有你更精彩: )
zdhsjs2011 + 1 技术贴点赞
杀软小白鼠 + 1 赞一个!
狐狸糊涂 + 1 版区有你更精彩: )
linzh + 1 版区有你更精彩: )

查看全部评分

本帖被以下淘专辑推荐:

引领四基生活
发表于 2017-1-2 12:20:47 | 显示全部楼层
谢谢分享
MENGXIUYUAN
发表于 2017-1-2 13:00:01 | 显示全部楼层
听说ESET的启发独步武林,真的吗
B100D1E55
 楼主| 发表于 2017-1-2 13:24:24 | 显示全部楼层
MENGXIUYUAN 发表于 2017-1-2 13:00
听说ESET的启发独步武林,真的吗

或许吧,软件本身体积能做这么小说明很多侦测是不靠特征库的……然而杀软发展到今日还停留在启发式扫描防御上真有点说不过去了,搞个沙盒也好啊
jefffire
发表于 2017-1-2 13:26:50 | 显示全部楼层
本帖最后由 jefffire 于 2017-1-2 13:31 编辑

译者很专业啊 对几个算法都有了解
被动启发翻译成 静态启发  主动启发翻译成动态启发  可能更接地气一些。前者把对象当作数据  后者把对象当作代码。

评分

参与人数 1人气 +1 收起 理由
xiaofeizei + 1 好久不见

查看全部评分

B100D1E55
 楼主| 发表于 2017-1-2 14:01:59 | 显示全部楼层
jefffire 发表于 2017-1-2 13:26
译者很专业啊 对几个算法都有了解
被动启发翻译成 静态启发  主动启发翻译成动态启发  可能更接地气一些。 ...

已修正,一直觉得动态静态应该是dynamic和static,却没想到要这样翻。面向数据和面向代码的概括也很有道理。
最初本来想在eset官博或者数据库找几篇文章猜猜近几年threatsense改变的,没想到几乎没有什么收获,连专利都没看到几个……

评分

参与人数 1人气 +1 收起 理由
jefffire + 1 原创内容

查看全部评分

小小瞻
发表于 2017-1-2 14:05:52 | 显示全部楼层
本帖最后由 小小瞻 于 2017-1-2 14:08 编辑

感谢楼主的翻译,同时还要感谢文章作者的生动例子,我受益颇多。另外,5楼说翻译成静态和动态启发是符合大多数人的共识的。
fireherman
发表于 2017-1-2 14:08:20 | 显示全部楼层
本帖最后由 fireherman 于 2017-1-2 14:26 编辑
B100D1E55 发表于 2017-1-2 13:24
或许吧,软件本身体积能做这么小说明很多侦测是不靠特征库的……然而杀软发展到今日还停留在启发式扫描防 ...




我觉得:目前ESET最大的缺陷是不看重“云”。

同样以启发作为主打的红伞,同样没有严格意义上的主防;其云启发(其实叫做云端检测会比较好)APC立竿见影。

ESET的Live Grid其实也是云检测,结合其自身的HIPS模块,冠以“高级内存扫描(AMS)”的称呼,其实就是用云(文件信誉)+自身引擎(ThreatSense)去判断程序即将执行的行为(指令)。

实际上,ESET的AMS,我觉得……我觉得……和BD的ATC有点相似(我没用过BD,单纯看卡饭各位用户、毒组在样本区的测试);所不同的是:Live Grid的“起付线”低,而ATC的“起付线”就比较高,并且可以设置等级(ESET无法设置)。

名词解释:起付线

引用来自“医保”的名词,受保额的下限。


假设同一个可执行文件,如果100分是满分(绝对安全),0分是已经入库的病毒(绝对危险):

ESET的起付线是20分给予“危险”警告(红三角),扫描不杀,但AMS不能通过;10分则是“高危程序”,虽然未入库,但ESET把其当成病毒处理,实时防护直接删除。

那么……

BD的ATC起付线就是:

50分为“警戒级别”,扫描不杀,双击ATC无法通过。

30分为“高危程序”,作为病毒处理。

ESET做得不好的地方就是完全交由引擎判断,且不让用户设置级别。

以上为个人观点,并无数据印证,欢迎探讨。

小小瞻
发表于 2017-1-2 14:17:34 | 显示全部楼层
给楼主一个小建议。这篇文章是楼主原创翻译的,所以楼主可以修改一下分类,将讨论改为原创,这更能体现出文章的价值。
ysj963
发表于 2017-1-2 14:37:27 | 显示全部楼层
fireherman 发表于 2017-1-2 14:08
我觉得:目前ESET最大的缺陷是不看重“云”。

同样以启发作为主打的红伞,同样没有严格意义上的 ...

这么说你不玩双击就是没展示出AMS的实力啊。ams\atc\和卡巴的受信任应用程序模式看来都是看颜值,ESET口味最重!
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛|优惠券| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.3( 苏ICP备07004770号 ) GMT+8, 2017-5-26 19:13 , Processed in 0.138129 second(s), 10 queries , MemCache On.

快速回复 返回顶部 返回列表