【竞赛分享】第三届阿里云安全赛季军-0day

【竞赛分享】第三届阿里云安全赛季军-0day

去年和几个小伙伴组队参加了阿里云组织的安全赛,现场排名第四名最终成绩季军。本篇文章将会分享这次参赛的经历和感受。

1 赛题分析

第三届安全赛以病毒API检测为主题,比赛提供了win32程序在沙箱中运行的API序列信息,赛题本质任务是根据程序序列进行多分类任务。

tianchi.aliyun.com/comp

2 数据分析

比赛提供的数据非常规整,根本不需要进行其他的预处理操作。

如图所示赛题数据按照文件file_id进行组织:每个文件file_id对应一个文件标签,即文件的病毒标签;每个文件file_id可能由一个或者多个线程tid组成。每个线程tid由一个api或者多个api组成,每个api对应一个返回值,api的次序关系由index表示。

赛题数据中,不同线程tid之间没有顺序关系,同一个tid里的index由小到大代表调用的先后顺序关系。index是单个文件在沙箱执行时的全局顺序,由于沙箱执行时间有精度限制,所以会出现一个index上出现同线程或者不同线程都在执行多次api的情况,可以保证同tid内部的顺序,但不保证连续。

初赛的训练数据大概是,训练集11w条程序记录,测试集5w条程序记录。6类程序中正常程序特别多,病毒程序偏少。这个赛题是一个分类问题,使用logloss进行评分。

3 特征工程

但我最初拿到赛题时,我先是抽取了一些结构化的特征到LGB进行训练,发现人工特征工程得分并不是很好。后来在查阅资料的过程中发现赛题任务在学术界有对应的问题,而相关论文的解决方案都是用ngram+树模型进行解决的。

于是我们将本次赛题视为一个文本分类问题,即通过API序列和API返回值序列来对程序进行分类,判断其是否为病毒程序。因此我们在构建特征工程的过程中借鉴了文本分类的思路,通过API序列和API返回值序列来构建模型。如果将一个程序记录是为一篇文章,则每个tid记录为一个段落,每个API序列和API返回值为一个词语。

但在探索数据的过程中,我们从病毒程序API的分析过程中发现:程序的api序列与文本分类数据有一定差异性,其中也代表了程序序列的特征:

  • 程序API序列中API存在多次重复和反复调用的过程;
  • 程序API序列中API的返回值反应了api的执行结果;
  • 程序API序列执行有一定并发性和随机性;

综上所述,我们将从三个角度提取特征:

  • 统计特征:统计API的出现次数、类型统计以及API返回值的统计特征;
  • 图模型特征:将API序列转换成API图的边,统计有向图的相关的特征;
  • 时序特征:API序列的出现次数等时序特征,API返回值的时序特征;

3.1 统计特征

根据我们对数据的理解,我们从三个维度提取的了统计特征:file_id维度、tid维度和api维度。按照此种思路我们提取了的以下特征:

特征维度特征含义file_id维度tid个数file_id维度tid长度file_id维度 tid维度tid中api个数tid维度tid中api取值数tid维度 api维度api范围值非零的个数api维度api范围值非零的比例api维度

同时我们将API进行了分类,从功能上将API分类:注册表、网络、内存、文件、服务、进程、DLL、加解密、搜索文件、控制台、设备、套接字、错误异常、Ldr、资源、Hook、系统信息和Buffer等类别。进而统计了file_id的功能使用情况,并做了相应的统计特征。

  • 注册表api:RegOpenKeyExW、RegQueryValueExW、RegCloseKey等
  • 网络api:InternetOpenW、InternetConnectA、InternetReadFile等
  • 内存api:NtAllocateVirtualMemory、WriteProcessMemory、CryptProtectMemory等
  • 文件api:NtCreateFile、NtWriteFile、NtQueryAttributesFile等
  • 进程api:CreateThread、Thread32First、Thread32Next等
  • 服务api:OpenServiceA、CreateServiceA、DeleteService等
  • 加解密api:CryptAcquireContextW、CryptProtectMemory、CryptUnprotectMemory等
  • COM组件api:CoCreateInstance、CoCreateInstanceEx、CoGetClassObject等
  • Hook api:SetWindowsHookExA、SetWindowsHookExW、UnhookWindowsHookEx等

3.2 时序特征

在分析病毒API的工程中,我们发现不同的病毒的API一定的周期性。因此我们抽取每种病毒的公共API序列作为特征,并提取了序列的重合程度等特征。

其次还可以对API序列提取TFIDF特征,提取API的ngram特征。这也是本次赛题的关键特征,前排队伍都有相应的操作。ngram可以表征API序列的出现次数,比如高频特征以及长尾特征。


在提取ngram过程中,可以截取ngram,也可以不进行截取。如果截取则ngram可以保证维度比较低,有效保证特征维度较低;如果不进行截取,则可以保留长尾特征,但特征维度较高。因此ngram可以用不同的参数提取,得到不同的结果,用来进行stacking。

这里的ngram特征是比赛中最为关键的特征,通过取3-gram、4-gram、5-gram、N-gram可以提取到不同的特征,进而可以训练得到不同的模型。此外还可以根据是否截取进行华为:如3-gram不进行截取,10-gram进行截取等。

在分析病毒API序列的工程中,我们发现病毒的API序列同时也存在较为明显的重复规律。因此我们抽取每种文件的API前后各1000长度序列作为cnn的网络输入特征,这样的特点是便于我们发现以及提取病毒序列在开始和结束的时候调用api的特点。

6 构建模型

模型包括LightGBM和NN两个模型:

  • LightGBM
    • 统计特征+2ngram
    • 统计特征+3ngram
    • 统计特征+4ngram
    • 统计特征+5ngram
    • 统计特征+2ngram+3ngram
    • 统计特征+2ngram+3ngram+4ngram
    • 统计特征+2ngram+3ngram+4ngram+5ngram


  • NN
    • 主线程API2VEC + CNN/RNN
    • 前后API2CEV + CNN/RNN

此外本次赛题stacking收益极大(一部分原因是因为赛题使用logloss评分,因此模型越多结果的偏差越小,其次不同ngram模型的差异性会增加模型的泛化能力),GBM和NN缺一不可。

7 赛后思考

  1. 本次赛题的初赛分数分布差异很大?
  • 一方面是由于stacking的原因,stacking收益大;
  • 另一方面可以通过调分布,获得一定收益;

2. 如何高效提取特征?

    • 可以提前将csv按照程序分到文件,多线程提取;
    • ngram没办法并行,所以需要高配机器;

8 云溪大会-现场赛

现场赛数据和初赛基本一致,唯一的区别是剔除了返回值列。数据量也比较小,但由于现场赛时间比较有效,需要在6小时内跑完单模型,然后进行stacking。

这是我第一次在数据竞赛中参加现场赛,现场写代码debug的感觉还是很爽的。而且这次现场赛每个小时刷新一次排行榜,非常刺激。

现场赛当然是跑着代码,玩手机啦~

魏强和我在现场

以上就是我对本次比赛的总结,并行的特征工程+差异化的模型是取胜的秘诀,最后Have Fun!有任何问题可以直接私信,谢谢!

比赛代码分享:github.com/DueapeCommon

编辑于 2019-08-11

文章被以下专栏收录