引入
最近仔细通读了Google最新的paper,《Spotlight: Malware Lead Generation at Scale》,这是Google在2020年12月份发表在Annual Computer Security Applications Conference (ACSAC) 会议上的论文。
ACSAC是计算机安全领域的很好的会议,看到有的分析说是计算机安全排第二梯队的顶会。这是个比较有个性的会议,它上面的论文和学术界的其他会议区别很大。这里论文都是以应用为主的,文章内容注重实践性、工程性、经验性,文章中纯算法的比重很低,也花了大量篇幅写框架设计、性能优化等工程问题的解法,对工程师的参考价值非常高。
这篇论文首先抛出了一个痛点
- 做
malware hunting
,就是从海量样本中找出值得关注的 - 这种
malware hunting
的工作,一般是Researcher来进行的(借助于一些信息做关联分析、手工分析样本) malware hunting
的工作,做起来非常耗时间
Google为了解决这个痛点,就设计了Spotlight这个系统,结合了深度学习分类器,无监督聚类,动态静态分析,规则式判断。
下面对论文各个部分进行解读,大家可以参考原文(见博客最后参考中的文献1)来做更好的对照理解。
Abstract解读
这里首先抛出痛点(具体见上节),介绍了Google的Spotlight系统能解决这个痛点,并在六千七百万的数据集上进行测试,准确率能达到99%
在KEYWORDS部分,我们可以看到,这篇论文想解决的是Malware hunting的问题,用什么方法解决呢?用Malware classification(恶意软件分类), Malware clustering(恶意软件聚类), Malware prioritization(恶意软件优先级划定)这些方法来解决。
Spotlight大致的工作流程为:
- Input:大量malware样本
- 移除大量已知family的样本
- Output:少量未知family的样本(人工从中找到新threat)
- 每个样本都有score:根据打分来判断malware对business的影响程度,从而得到人工分析的样本优先级
1. INTRODUCTION解读
这部分首先提出问题:恶意软件数量逐年升高,且由于混淆、加壳、变形等代码混淆技术,恶意软件越来越难以被检测。
然后引入做malware hunting
痛点:每天产生的大量malware样本,researcher该先看哪个?
这个痛点是比较难解决的,一方面需要大量人工检查,另一方面是不同公司对做malware hunting
的关注点不同:比如(1)银行只关注banker;(2)广告公司关注广告欺诈。
所以设计了Spotlight系统:对未知的样本设定优先级,从而最大化researcher的投资回报。
系统的大致工作流程
- 第1步:用ML来筛选出已知family的样本,留下未知family的样本
- 第2步:未知family的样本,根据语义相似度来得到各个cluster
- 第3步:对各个cluster打分
每个公司对malware的关注点不同,本文Spotlight主要关注ad afraud(广告欺诈)。他们动态运行样本来收集ad fraud的证据。
他们给出的样本数量67M(六千七百万)的样本数据集是目前用于malware family分类的最大的数据集。
系统最终有那么几个成果:
- 他们给出的malware family classification的准确率很高,在99%左右
- 用本文的方式,他们找出了3个ad fraud botnet,其中1个是目前virusTotal没能识别出来的
2. MOTIVATION解读
malware hunting是时效性很强的。crawdstrike提供了hunting平台做2B的服务。
Google在2020年做了一个问卷调查,对TOP-100公司的37个malware hunting的专家。得出了这些结论:
- 每个team都只focus在一种特定的的threat上
- browser
- mobile device
- ads
- cloud computing
- 52%的专家认为做malware hunting是很重要的
- 大部分专家做malware hunting需要耗费自己日常工作时间的20%~40%
3. SYSTEM OVERVIEW解读
-
Goal:Spotlight’s goal is to make malware hunting more efficient
目标是提高效率 -
处理流程
系统的整体流程见下图(注意这里比较关键的设计是引入虚线组成反馈):
(1)把每一个malware样本都转换为一个向量
(2)用深度学习,分为多个类别:已知family,未知的family
(3)unknown的样本,会被聚类算法聚类(使用分类器生成的embedding vector,是32个浮点数,本文称之为compact embedding)
(4)最后,人工查看top-priority的聚类结果。人工检查得出的经验,也可以反馈到feature vector中,比如增加新的动态分析bitmap作为样本特征,或者出一些signature
3.1 Input Features解读
用feature来表示一个样本,这是深度学习/机器学习的通用做法。Spotlight的特征来源主要是如下3个方面,
用样本的3方面信息,组成一个vector,作为feature:
-
动态分析的输出结果
-
静态分析的输出结果
-
VT上vendors的输出结果(这个Google的优势,可以在VirusTotal获取到50多个杀软厂商的输出)
这样得到的原始特征(raw-feature),做了one-hot encoding后,有212361个特征。维度太高,有做了如下降维处理:
- 对于文本类型的特征,做如下处理
- 分词
- 转小写
- 移除分隔符
- 去除重复字段
- 去掉一些特征(去掉出现次数太多,或者太少出现的)
- 超过20%的样本上特征都一致的特征
- 过小样本集上才有的特征
最终将特征维度从212361降低到121947。
关于特征的细节,Google没有公开(the features we use come from non-public
analysis platforms, whose implementation details we cannot share)。但给出了一张表,对所用到的特征类型进行了描述
通过这个表格,我们可以看到,特征的来源主要是个地方
-
Google自己的动态、静态分析输出的结果,有 1115 个
-
VirusTotal的输出做成的特征,就是其他杀软动态/静态输出的结果,有 211246 个
特征主要是下面几种类型
-
漏洞利用,CVE相关的特征
-
样本行为特征
-
样本类别特征:挖矿类、勒索类样本特征
-
样本文件本身的一些基础特征:比如文件类型、编译器信息
-
可疑的但是非恶意的样本行为:比如禁用操作系统的某些功能,沙箱逃逸
本博客博主对这种特征的一些个人看法:
-
这种高维度的feature,才适合用deep learning
-
特征中最终要的部分,是采用了多家杀毒软件的动态、静态分析引擎的结果综合
-
那么高维度的特征,应该是比较稀疏的向量
3.2 Known-Family Classification解读
这部分讲的是,如何用深度学习模型,把一个恶意软件样本,分类到某个具体的类别,或者unknown。
这里用到的深度学习模型,是多层感知器模型,具体如下图
模型本身比较简单,只有那么几个点值得关注
-
模型中用了两个hash-buckets,作用是把对输入维度比较大的稀疏vector做降维
-
weighted cross-entropy loss,这个loss,对样本不平衡的问题,得到的结果更好。因为这个loss,对样本数相对少的family分类错误,会受到更大的惩罚。
-
模型中间层输出的16+16个浮点数,一共32位,作为样本的embedding,这个32位的向量会被抽出来给后续聚类使用
3.3 Unknown Malware Clustering解读
这部分说的是,通过上面部分的分类器,可以得到family unknown的样本。把所有family unknown的样本,都拿去聚类。聚类算法用的是高度并行化的层次聚类算法,并且用欧式距离作为距离准则。
聚类算法有一个参数需要设置:距离阈值(epsilon值)
- 阈值表示何时停止聚类
- 阈值是人工选取的
- 更大的阈值,得到的类簇更小,类簇也更大
论文中这里也提到,作者之前也尝试过直接用input vector做聚类(就是上面提到维度为121947的特征),但因为vector稀疏,且feature有噪声,所以聚类结果不好。所以后来改用compact embedding(32位的向量)来做。
为了加速聚类,做了预聚类。也就是做两次聚类,第一次聚类做粗聚类,第二次再把上一次输出的类簇拿去做更精细的聚类。两次聚类的过程如下:
- 先降低compact embedding的精度,把每个浮点数转换为4位十进制表示。即浮点数转换为整数,先损失一点精度
- 根据转换为整数后的embedding进行聚类
- 聚类结果再进行二次聚类,二次聚类结果才是最终结果
3.4 Prioritization解读
这部分讲的是,如和对聚类得到的类簇,进行打分和排序。
根据各个team的scenario来打分。比如这里选定广告欺诈,就要把样本放到honeypot里跑,来尽量触发它的广告欺诈行为。如果嫌动态分析costly,可以用静态分析,比如在二进制文件里找到可疑的字符串,或者api调用。
本文做了两个打分器:
- ad fraud
(1)运行yara signature来扫描。检查可疑的字符串、url、api
- Yara signature是一种pattern的描述语言,网上有很多用yara写的打CVE和各种不同平台病毒的pattern
(2)如果有1个yara signature能打到样本,则运行这个样本,并监测它的网络行为,以此来找到广告欺诈的证据
对每个样本都运行打分器后,取平均分作为类簇的最终得分。
- botnet-size:直接根据类簇中样本数量来打分,越多样本,得分越高
3.5 Investigation and Feedback解读
最后一个步骤,人工检查打分后的top-cluster。人工检查的结果可以有两个产出:
- create pattern
- add label
人工检查的结果又能给将来的过程提供支持,形成闭环。
4 EVALUATION解读
这部分主要讲数据集,评估模型的方式,以及最终结果。
4.1 Data sets解读
数据集1:11.8M,都是windows平台下的恶意软件。
- 有label:1.8M(1800000个恶意软件样本),26个family
- 无label:10M,unknown family
- 80%训练,20%测试
数据集2:67M
数据集中,各个类别的样本占比是不同的,有的family的样本很多(比如Pony这个family的样本数量占总数的28.5%),有的很少(比如Slave这个family的样本数量占总数的0.001%)。
4.2 Performance Metrics解读
这部分讲用什么指标来衡量聚类结果的好坏。当然这个衡量只能是在有label的样本上进行。
本文使用了3个指标:
- 同质性(homogeneity):分的准不准
- 完整性(completeness):分的散不散
- v-measure:上两个指标的调和平均值
关于h,c,v这三个指标的细节公式及说明,可以参考博客最后列出的文献2。
4.3 Pipeline Performance解读
这部分给出了具体的测试结果数据。
图3讲的是,不同family数量,不同epsilon值(3.3部分讲到这个值的具体作用),对聚类同质性(准确率)的影响。
从图中可以看到
-
epsilon的值越小,同质性结果越好,也就是准确率越高
-
epsilon的值在0.13~3.0之间,对结果影响不大,所以这个值的选取是不需要特别精确的
-
known family的数量增加,对聚类准确率影响不大,所以family数量是可以根据实际情况动态增加的
图4讲的是,不同epsilon值(3.3部分讲到这个值的具体作用),对聚类v-measure的影响。
从图中可以看到
- epsilon的值越小,v-measure结果越低,也就是聚类结果越散
completeness值太低也不行,最极端的情况就是每个样本作为一个cluster,这样同质性是最高的,但没有意义。
本文认为completeness的值在0.5~1之间都是可以接受的
综合这两个图,可以得出结论:
-
蓝色那条线,同质性非常好,但v值很低,说明其完整性不好,聚类的结果太散了
-
epsilon的不同值对最终结果影响区别不大,所以这个值的设置可以不用特别精确
(中间有一块讲如何评估系统对人工效率提升的部分,没太看懂,这里就跳过了)
最终,Family分类的准确率:
- precision=0.997(对family数量大于18来说)
- unknown family分类的准确率是0.99
- 作者的结论
- precision=0.996
- recall=0.99
Family分类的准确率
(1)precision=0.997(对family数量大于18来说)
(2)unknown family分类的准确率是0.99
(3)作者的结论
- precision=0.996
- recall=0.99
4.4 Efficiency at Scale解读
这部分讲系统性能:Spotlight处理六千七百万的新样本,花了34分钟,硬件配置是7核的CPU,12G的内存。
对性能影响,最大的是层次聚类。层次聚类有一个最大的问题,worst-case run time会很大,所以用了两种方法来避免这个问题,从而提高效率:
-
用32个浮点数组成的embedding向量来进行聚类
-
通过预聚类,将67M样本数降低到2.8M个类簇,再对每个类簇进行二次聚类
个人总结
博主读完论文后的收获如下:
-
不是全库样本聚类,而是只对malware中的未知family样本聚类
-
用深度学习做多分类,过滤掉已知family的样本
-
VT各个vendors的输出可以作为样本的特征
-
pre-cluster结合二次聚类,可以提高性能
-
动态行为分析输出的结果可以用来对未知cluster的样本打分
-
cluster结果好坏的评价,用同质性和完整性
-
训练DNN时, weighted cross-entropy loss可以改善样本不平衡问题
-
paper第7部分提到的用于做Malware family classification的paper值得参考
参考
-
- 原文论文,https://research.google/pubs/pub49626/
-
- 同质性、完整性、v-measure的公式,https://www.jianshu.com/p/b9528df2f57a