arXiv:2210.15973
VirusTotal 目前每天要处理超过 200 万个样本文件,自从 2004 年开始面对公众服务总共收集了超过 24 亿个样本文件。目前,VirusTotal 的商业授权提供对过去七天内样本文件无限制的下载权限,并且能够下载所有提交的分析报告。
VirusTotal 可以作为一个用于寻找新威胁的数据集,但由于数据流过大不得不考虑许多具体的问题,相同的场景下还有安全厂商收集的文件数据流。
从 VirusTotal 报告中直接提取 23 个特征,间接提取 4 个特征,如下所示:
选用了三类哈希值:
加密哈希:MD5、SHA-1、SHA-256、imphash、richpe_hash、cert_thumbprint、authentihash、icon_hash。
模糊哈希:tlsh、ssdeep
结构哈希:vhash
与恶意样本相关的各种哈希函数
Avenger,公众号:威胁棱镜狩猎样本的哈希游戏
特别的,研究人员认为 vhash 考虑了样本的属性(如导入函数、导出函数、段信息与文件大小等),是支持不同文件类型的结构哈希的统称。例如 PE、APK、PDF、Office 文档这几种类型的文件格式都支持计算 vhash,而 JPEG 和 PNG 等文件格式并不支持。
选用了四个时间戳:
扫描时间:scan_date
首次上传时间:fseen_date
证书有效期:cert_valid_from 与 cert_valid_to
检出引擎数量:vt_score
检出结果列表:detection_labels
Android 应用程序的包标识符:package_name
最有意义的文件名:vt_meaningful_name
VirusTotal 并没有给出单独的类型字段,多个来源间可能是互相矛盾的。使用 trid_file_type、vt_tags 和 vt_meaningful_name 三个字段的值进行多数表决进行文件类型判断。
利用 AVClass2 提供如下三个特征:
标签列表:avc2_tags
最可能的家族:avc2_family
是否为 PUP:avc2_is_pup
从 2020 年 12 月 21 日到 2021 年 12 月 20 日,研究人员收集了近一年的 2.35 亿个样本文件共计 3.28 亿份分析报告。这些样本中,有 2.096 亿个(89%)样本文件对 VirusTotal 来说是新的。注:前十一个月,只保留至少一个引擎检出的文件对应的分析报告,这大概是所有报告的一半。最后一个月,保留所有的分析报告。
比对同时期诺顿的全球遥测数据,覆盖数千万台 Windows 终端。
实验环境使用 40 核的 Xeon(R) CPU E5-2660 v3 @ 2.60GHz 与 128G 内存的服务器。
每天从 VirusTotal 收集到的去重样本数量、生成报告数量以及新发现的样本数量,如下所示。注:在年底收集的量大是由于收集方式改变,而不是 VirusTotal 的原因。
大概每天有近 170 万份分析报告,去重样本大约 150 万个,其中新样本约为 100 万。更改收集方式之前,这三个数量大概会下降一半。这意味着,上传给 VirusTotal 的文件中有大概一半都是零检出。
更改收集方式后,一共收集了 3980 万个样本的分析报告。同期,遥测服务接受了 6.865 亿样本的查询请求。诺顿在 90.5 万台机器上检出了 190 万个恶意样本,VirusTotal 检出了 1480 万个恶意样本。注:先前的研究表明,安全厂商的遥测数据中大部分都是罕见的良性文件(遥测中 94% 的文件都只会在一台设备上出现)。
尽管 VirusTotal 的数据量已经很大,但和安全厂商的遥测数据相比还是少了很多。尽管如此,但 VirusTotal 却有更多的恶意软件,这也确保了 VirusTotal 是恶意样本重要来源的江湖地位。
总体来看,VirusTotal 中 89% 的样本都是新的。具体来说,61% 的 PE 文件、35% 的 APK 文件、81% 的其他文件都是新的。
收集的样本中,VirusTotal 最早上传时间按月分布如下所示。最早是 2006 年 5 月份上传的样本,之后一路上升。
接近九成的新样本比例,每天超过一百万的新样本量,VirusTotal 也是新样本的重要来源。
样本类型的 TOP 20 如下所示,光 PE 文件(EXE、DLL、OCX、CPL 等)一种就占到 66%。
PE、JavaScript、HTML、PDF 与 Android 应用程序占总量的 88.4%,还有 1.7% 的样本无法归类。
在大量样本情况下,文件类型识别是具有挑战性的。在 VirusTotal 中也缺乏统一的文件类型字段。
利用完整收集所有报告的一个月数据进行统计,85% 的报告都没有检出,7% 的报告有一个检出。但是,仍有 960 万份报告中被超过 40 个引擎检出。
换个视角,大概 53% 的样本都是零检出,这里面包含良性程序和不能被检出的恶意软件。如果将恶意的判定比例提高到至少四个引擎检出,比例可以降低到 41%。
AVClass2 为 1.517 亿个(64.3%)样本标记了 74360 个不同的家族名称。56% 的家族其实只有一个样本,19% 的家族有大概十个样本,7% 的家族有大概一百个样本,只有 2% 的家族有超过一千个样本。
超过一百个样本的家族,接近流程都是 PE 文件类型的。VirusTotal 的数据有大量的 Windows 平台与 Android 平台的恶意家族的样本,但是其他文件类型并不多。
只有 9.4% 的样本被标记为未知家族,因为影响较大的未知家族更容易被厂商发现并跟踪。包含超过 100 万个样本的家族里,只有 3% 是未知的;包含超过 10 万个样本的家族里,只有 15% 是未知的。
手动分析未知家族 TOP 一千的情况,89% 的未知家族是不清楚是家族名还是其他标签,11% 的未知家族是因为家族名像是随机的签名标识符或者是变种名称。但是,在随机抽样检查中,这个比例是反转的。这说明,不是流行的家族,AVClass2 很可能会输出一个签名标识符或者变种的名称。尽管这些对分析人员来说用处不大,但是对聚类仍然有用。
六种主要文件格式的 TOP 10 家族如下所示:
尽管 PE 文件中,前十有 4 个蠕虫家族和 3 个病毒家族。但总体来说,数据并没有被多态严重的文件感染类恶意软件和蠕虫类恶意软件支配。
其他三种文件格式如下所示,这三种文件类型对应的家族概念其实很模糊,杀软检出的标签也更偏行为而不是家族。
由于 AVClass2 标记了 62% 的样本为已知样本,其实可以当作过滤器来减少分析人员的负担。
最开始为零检出,后续又存在检出的恶意软件被成为 FUD。满足条件的 63.7 万个样本中,有 3.7 万个文件在五分钟内从零检出反转为至少四个引擎检出。这部分样本需要被排除,15 分钟后反转的大概只有不到一千个,可以认为基本稳定了。
对于 60 万个 FUD 样本,反转的中位数时间为 7 天,平均时间为 23.8 天,甚至有 12% 的样本反转时间都不到一天。
这些 FUD 样本,AVClass2 也标记了 62.5% 的家族,和整体情况类似。至少包含一万个样本的家族 TOP 10 如下所示,部分家族有较大比例的 FUD 样本,说明其更难以检测。
所有样本中有 1330 万个(5.6%)样本包含数字签名,APK 与 PE 文件合计占到了 99% 的比例。分项来看,91.3% 的 APK 文件、3.7% 的 PE 文件、31.4% 的 MSI 文件与 7.6% 的 Mach-O 文件都带有数字签名。
将 VirusTotal 的数据与遥测数据进行交叉对比,交集中大概 380 万个样本文件至少有一个引擎检出,大概 220 万个文件至少有四个引擎检出。说明,VirusTotal 与安全厂商的遥测数据其实重合度相对较低。
交集的 TOP 10 家族如下所示,可以看出 VirusTotal 的家族分布与真实设备上的分布并不相同。
1190 万个样本被遥测检出为恶意,但 VirusTotal 中并没有。随机抽取一百万个样本进行再评估,89.1% 都未提交给 VirusTotal,只有 10.9% 在 VirusTotal 上是存在的。
二者间存在检测交叉点的样本中,61% 是遥测首先发现、39% 是 VirusTotal 首先发现。VirusTotal 延迟发现样本的中位数为 4.4 小时,平均数为 21 天。由于受到厂商的限制,VirusTotal 的实际延迟应该更大。
对 2.357 亿个样本进行聚类,可能是迄今为止最大的聚类工作。选取了 9 个可用于聚类的特征,如下所示:
主要参考三个恶意软件聚类的方法:HAC、HAC-T 与 FVG。
使用如下的两个数据集来进行评估:
在 Malicia 数据集的精度如下所示:
在 AMD 数据集的精度如下所示:
如果在 24 小时内不能完成聚类,那就意味着数据会逐日积压,不具备良好的可扩展性。
样本量大概在 140 万时,HAC-T 耗时 9.7 小时、FVG-vhash 耗时不到 1 小时。而样本量超过 200 万时,HAC-T 就不能在 24 小时内跑完,FVG-vhash 仍然不到一小时。HAC-T 原作者表示能在 2.2 小时针对上千万样本进行聚类,可能是原作者使用 C 版本的代码相比开源的 Python 版本更加高效。
2.357 亿样本一次性聚类,结果如下所示:
对于不是单个样本集群,测算至少一引擎检出量与至少四引擎检出量。
例如 vahsh 为 7a41a7dd4a319c77194ec2a5f6c78aa1 的这个集群,包含 13172 个 APK 样本。其中 99.96% 都至少能够被一个引擎检出,99.85% 都至少能被四个引擎检出。可以看出该集群肯定为恶意,但仍然有 5 个样本没有被任何引擎检出,这可能是值得关注的。
thumbprint 为 0069be5da75d35577a5b1b02810571fc72d43162 的这个集群,包含 12 个 PE 文件,所有样本都包含无效证书。其中 91.67% 的样本都至少能够被四个引擎检出,但有一个样本是零检出。文件名也高度类似,AntiCheatS.exe(7 个样本)、AntiCheat.exe(4 个样本)与 AntiCheattUpdater.exe。
VirusTotal 是一座矿山,其中埋藏着各种宝藏,如何从中挖掘出有价值、更有价值的金子是研究人员锲而不舍的追求。在类似场景下,如何处理、分析海量的样本文件是一个永恒的命题,准确、高效、灵活、安全、可扩展等等在设计时可能不得不需要进行取舍。分析 VirusTotal 的数据、学习 VirusTotal 的处理,也许是一条“正确”的路。