基于遗传编程的恶意代码自动逃逸分类
今天分析的这篇论文在2016年于NDSS会议发表,题目是《Automatically Evading Classifiers: A Case Study on PDF Malware Classifiers
》,其发布信息在这里。
论文主要针对恶意PDF样本,使用遗传编程算法,提出了一种使机器学习产生错误分类的方法。文章对知识积累的要求不高,听说过遗传算法、了解机器学习的基本概念即可。下面开始介绍文章内容。
概述
机器学习被广泛应用于开发安全领域的分类器。但是,这些分类方法在面对有目的的攻击者时,其稳定性是不能确定的。文中提出了一种评估分类器在攻击中稳定性的方法。其关键思路是,随机操纵一个恶意样本,来寻找一个保留恶意行为的变种,但这个变种被分类器分类为良性。文中提出了一种寻找逃逸变种的一般方法,并利用这个技术对两个恶意PDF分类器:PDFrate和Hidost,进行了实验。对于实验的500个恶意样本,此方法可以全部自动地找到针对两个分类器的逃逸变种,由此对分类器的有效性提出了严重的质疑。
背景知识
论文提出一种自动化的方法,来模拟攻击者试图为一个目标分类器检测到的恶意样本寻找一个逃逸的变种。攻击者的目标是找到一个恶意变种,它保留原始样本的恶意行为,但被目标分类器错误地归类为良性。
恶意PDF文档
PDF(Portable Document Format,便携式文档格式)是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式。因为PDF的文件格式性质广泛用于商业办公,引起众多攻击者对其开展技术研究。在一些APT(Advanced Persistent Threat)攻击中,可以针对特定目标投递含有恶意代码的PDF文档,安全意识薄弱的用户只要打开PDF文档就会受到攻击。
PDF文件是一种高度结构化的文件,这一定程度上方便了检测与使用遗传算法进行变异。恶意PDF文件往往嵌套有JavaScript代码,通过解析漏洞或堆溢出实现攻击。
机器学习分类器
机器学习是从数据中学习和预测的。基于机器学习的分类器试图找到一个假设函数$f$,它将数据点映射到不同的类。例如,一个恶意软件分类系统会找出一个假设函数$f$,它将一个数据点(一个恶意样本)映射到为“良性”或“恶意”。
训练机器学习系统的过程从特征提取开始。由于大多数机器学习算法不能对高度结构化的数据进行操作,数据样本通常在专门设计的特征空间中表示。例如,一个恶意软件分类器可以提取文件大小和函数调用跟踪作为特征。每个特征都是特征空间中的一个维度。因此,每个样本都被表示为一个向量。在分类算法中,当特性的数量太大时,可以进行额外的特征选择,以减少特征的数量。
在安全任务中,使用最广泛的机器学习算法使用的是监督学习,其中训练数据集带有标识每个训练样本类的标签。假设函数$f$的训练目标是使得训练集上的预测误差最小化。这个函数通常会导致较低的错误率在平稳性假设下的运营数据分布的数据点在未来将会遇到一样的训练集的分布。
机器学习已经产生了许多令人印象深刻的成果,并被广泛部署用于特定的安全任务,包括恶意软件分类。如果不检查真实系统中可疑恶意软件的行为,恶意软件分类器通常使用静态属性来预测恶意软件,如文件结构、文件大小、元数据、令牌或系统调用。尽管这种方法在验证测试中经常达到很高的精度,分类器学习的属性可能只是训练数据的表面特征,而不是与恶意软件内在相关的属性。这是因为训练数据中的恶意软件样本很可能与良性样本不同,在许多方面它们的恶意行为特征并不重要。
攻击方式
攻击模型
假设攻击者从一个被目标分类器(正确地)分类为“恶意”的恶意样本开始,希望创建一个具有相同恶意行为的样本,但它被错误归类为良性。攻击者可以在许多方面操纵恶意样本,而且很可能对那些(正确地)分类为良性的样本有所了解。
假设攻击者能够以黑盒方式访问目标分类器,并且可以向该分类器提交许多变种。对于每个提交的变种,攻击者了解其分类分数。分类分数是一个在0与1之间的实数,表明分类器对恶意的预测,在某些阈值之上(比如0.5)则被认为是恶意的,分类分数较低的样本被认为是良性的。文章不假设攻击者有任何关于分类器的内部信息,只是将它作为一个获得样本分类分数的黑盒。假设对分类器进行的操作不使分类器适应所提交的变体(许多分类器具有自学习能力,但如果攻击者离线访问分类器,则必须是这种情况)。
寻找逃逸样本
文中介绍的方法使用遗传编程技术来对可能的样本空间进行定向搜索,以找到那些在保留所期望的恶意行为的同时避开分类器的样本。
遗传编程(Genetic programming,GP)是一种进化算法,最初是为自动生成针对某一特定任务的计算机程序而开发的。它本质上是一种随机搜索方法,利用计算模拟生物的突变和交换来产生变异,并使用用户定义的适应度函数对达尔文自然选择进行建模。具有更高适应度的变体将被选择继续演化,并且这个过程会持续数代,直到找到一个具有所需属性的变体(或者搜索过程在超过资源利用范围后终止)。遗传编程算法已经在多个领域显示其高效,例如修复旧有软件的错误、软件逆向工程与软件再工程(re-engineering)。
基于遗传编程寻找逃逸样本的过程如果所示。
这个过程从一个显示恶意行为、并被目标分类器分类为恶意的种子样本开始。目的是寻找一个逃逸样本,它保留恶意行为,但被目标分类器错误地分类为良性。
首先,我们通过对恶意样本进行随机操作来初始化一个种群(population)。然后,每个变体由目标分类器(target classifier)和先知(oracle)评估。目标分类器是一个黑盒,输出的数字代表对输入样本恶意的预测。有一个规定的阈值用来决定它是恶意的还是良性的。先知用于确定给定的样本是否具有特定的恶意行为。在大多数实例中,这将涉及开销巨大的动态测试。
一个由目标分类器分类为良性、但实际上具有恶意的变体,是一个成功的逃逸样本。如果在种群中没有发现任何逃逸样本,就会根据一项适合于寻找逃逸样本的适应性措施,为下一代选择生成变种的一个子集。由于不太可能将恶意行为重新引入到一个变体中,已经丢失了恶意行为的被损坏的变体将替换为其他变体或原始样本。
接下来,被选中的变种被遗传演算随机操纵,以产生下一代的种群。这个过程一直持续下去,直到找到一个逃逸样本,或者达到阈值。
为了提高搜索的效率,文中收集了所使用突变操作的追溯(trace),并重用有效的追溯。如果搜索结果发现了任何逃逸变体,那么在逃逸变体上的突变将被存储为成功的追溯。否则,将存储一个具有最高适应度值变体的突变追溯。这些追溯随后被应用到其他的恶意样本,以生成它们的种群初始化的变种。由于PDF的结构和突变操作的性质,相同的突变序列通常可以有效地应用于许多初始样本。
结语
与神经网络类似,遗传算法是非常“仿生学”的一个思路,并在许多领域产生了惊人的效果。对结构性较强的数据进行分析时,不妨试试这个算法。同时,要广泛阅读各领域的书籍资料(不局限于计算机),也许某个领域极其普通的思路,在计算机行业就是翻天覆地的创新。