前记

最近有一个项目需求,需要将恶意样本的厂商描述给汇聚成一组统一的标签,然后后续需要对恶意样本的流量及行为进行特征提取和机器学习来实现恶意样本的检测。
简单点来讲所做的恶意样本家族分类其实就是一个数据清洗和打标签的过程。
数据样本量有90000多条,主要采集于virusshare,这里就以virustotal为例,实际效果其实是一样的

这里大概有大概几十家厂商,但是各家厂商的标签都不一样,甚至连标签描述有时候都不一样,举一个例子,这里Alibaba的样本标签为Trojan:Win32/Agent.5b6e44b1,而CMC的样本标签为Trojan-Dropper.Win32.Flystud!O,那么在输出最终标签时如何进行汇聚和统一成了本文的一个核心要点。

实践思考

入手总是最难的,这里在前期经过比对和一些论文的恶意样本标签参考后,其中标签描述最为规范的是Kaspersky,上图当中Kaspersky的标签描述为“Trojan.Win32.Agent.td”,这里按照顺序进行识别,第一个Trojan为样本类型,这个类型包括Worm、Backdoor、Exploit等具体的攻击类型
第二个Win32则表示样本文件格式类型,这个类型包括Win32、HTML、DOS、AndroidOS等具体的文件格式
第三个Agent则表示具体的家族类型(这里理解上可能有误),在对所有样本进行了汇总后发现第三个家族类型包括CVE-2010-0188、Miner、Mirai等具体的家族类型
最后一个td在比较多家厂商后认为是厂商独有的标记,所以略去,在进行考虑和样本对比后决定对上述三个标签进行提取,最终对每一个样本hash输出一个三元组的标签值['Trojan','HTML','Miner'],即为样本标签。

文本相似度

基于前面的考虑,Kaspersky的样本描述最为规范,所以第一个想到的做法就是对各家厂商做分词,然后对分词结果计算与Kaspersky样本描述的相似度,最后对相似度做累加计算其平均值。
这里的分词其实做法很简单,一般来说对于文本分词可能要用到jieba或者tfidf模型等,但是这里所分词的对象其实就是很简单的一段字符串,所以对特殊符号进行分词即可,如Microsoft厂商的样本描述Trojan:Win32/Randrew!rfn,那么最终经过分词,获得的结果为['Trojan','Win32','Randrew','rfn']

点击收藏 | 3 关注 | 2
登录 后跟帖