内容来源于:
[1] Analyzing and Recognizing Android Malware via Semantic-BasedMalware Gene .IEEE Xplore Digital Library.2018-01-11[引用日期2018-12-29]
[2] MCSMGS: Malware Classification Model Based on Deep Learning .IEEE Xplore Digital Library.2018-01-11[引用日期2018-12-29]
[3] 基于软件基因的Android恶意软件检测与分类 .中国知网.2018-04-08[引用日期2018-12-29
[4] 编码软件的基因https://gitbook.cn/books/5c9d61a840b9387dbe95ddb3/index.html
计算机发展至今,产生过的漏洞不尽其数,不论是站在攻击者的角度,还是防御者的角度,人们最直观的需求就是:这是一个什么漏洞,攻击者怎么利用这个漏洞,防御者怎么修补这个漏洞。而作为攻击者/防御者,知道了这是一个什么漏洞,就应当有一套对应的利用模式/应对模式。
然而漏洞的种类繁多,看似独立,但是它们相互之间又紧密联系。
图1 漏洞分类
通过上图,我们可以知道漏洞分类相当复杂,而在具体到某一个漏洞的时候,例如缓冲区下溢出漏洞,由于它包含了多个属性,人们没有办法将其准确地划分到上述分类中的任何一个。即使人们知道这是一个缓冲区下溢出漏洞,也需要经过详细的机理分析才能得出想要的结论,并不能很直观地知道利用模式,也不能迅速地知道问题出在哪里。
目前常见的漏洞库,如CVE(Common Vulnerabilities & Exposures,公共漏洞和暴露)可以在一定程度上解决这个问题,CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。使用一个共同的名字,可以帮助用户在各自独立的各种漏洞数据库中和漏洞评估工具中共享数据,这个漏洞库,极大程度上解决了漏洞命名杂乱和漏洞名称不直观的问题,但是,现有的漏洞库仍旧存在一些问题。例如CVE仅仅只是字典,并不能很快速地返回用户所需要的信息,仍需要大量的时间去研究机理和开发利用模式,并且CVE针对同型漏洞的表现性也只是差强人意。目前由于部分计算机工作者和软件厂商对于安全的认识尚浅,导致部分的高危漏洞未被收录进漏洞库,且收录的漏洞也有相当一部分未给出解决方案。
针对上述情况软件基因应运而生。软件基因是软件体上具有功能或承载信息的二进制片段,其概念的灵感来源于生物基因,并借鉴生物信息学中关于基因分析的研究思路分析和度量软件,解决现今软件工程领域的分析难题。通过软件基因的原子性、表意性、稳定性、进化性我们可以更好地描述一个漏洞成因、利用模式以及和同型漏洞的关联及其演化的规律。
正如上文所说,一个漏洞因其具有多个属性而使得它的名称并不能很直观地反映问题所在,而且因为属性繁杂,使得可能拥有类似名称的漏洞,所表现的机理是不一样的。以医生诊病为例,每种疾病拥有不同症状,而同一种症状可能对应多种疾病,医生不能根据疾病名称对应病人的症状,但是可以从症状入手,推断病人所患的疾病并对症下药。同理,如果我们能将之前所提及的漏洞分类中的各个属性作为“症状”,通过漏洞机理分析,将这些“症状”通过软件基因可视化出来。就像医生看病一样,通过软件的“症状“来判断该软件是何种漏洞,再根据这些“症状”,去开出对应的“药方“,也就是防御手段和利用方法。而实现这一过程的媒介就是软件基因,软件基因可以由内至外地展现一个漏洞的成因、特征、利用模式以及同类型漏洞关联信息。
软件基因就和生物基因一样,可以将软件的所有特征可视化。类比生物基因,软件基因的形式化表现如下:
图2 基因的形式化表示
其中包含基因头、基因尾、基因段:基因头作为开始标识,基因尾作为结束标识,中间的基因段便是信息部分,基因段包含了该段基因所对应的软件信息。
软件基因的表现形式是一段具有功能或承载信息的二进制片段。
图3 基因的工作流程
如上图,这一段二进制码就是一个软件基因,它通过反汇编形成可读的汇编代码,再由多个相同的过程组成一个软件流程图,而流程图可以体现软件具体的功能。这一过程如同DNA转录形成RNA,RNA生成蛋白质,蛋白质去完成各种生物功能的过程一样。
正如基因能够展现生物性状一样,软件基因同样的可以表现出一个软件的“性状“。以SQL注入漏洞为例,从SQL注入被发现至今,从关键词过滤,到使用正则表达式,再到进行预编译,开发者与攻击者一直在进行攻防博弈。可不论再怎么进行攻防演化,在基因的层面,它始终是有一个“输入数据”、“处理数据”、“构造SQL查询语句”、“返回结果”的过程。这一过程便可以作为SQL注入漏洞(输入验证)的其中一个特征。我们将多个基因片段组合形成“染色体”,便可以作为一个漏洞的基因。使用相同的方法便可以从漏洞分类下的各个子集中提取出对应的基因,将漏洞特征可视化,并建立相应的基因库。通过基因库,软件工作者可以更好分析漏洞成因和漏洞的利用模式。
那么软件基因要如何提取呢?要解决这个问题,首先要明确一点,基因是一段二进制片段,但是人无法理解二进制片段,所以就像生物学中给染色体命名、标记位置一样,我们同样需要将软件基因可读化,也就使用伪代码级别的汇编指令去理解软件基因。否则不但没法达到我们的效果,还会增添难度。其中一种可行的方法是将软件体上的一段一致执行代码定义为一个软件基因。一致执行代码是指在任何用户输入条件下,其中包含的每条指令要么全部被执行,要么全部不被执行。这与事务(Transaction)的概念十分类似,体现了软件基因的原子性。总结来说,基因的本质虽然是二进制码,但我们以指令作为基因的最小单位,更进一步,在接下来的分析中,我们会将以一行或多行伪代码作为一个基因,其本质就是多条汇编指令,这样便于人理解,也具有更高的操作性。
一个软件中含有大量的基因,但总有一些基因是我们需要重点关注的对象,这些缺一不可的基因被称为“元基因”。元基因其实就是映射了属性、方法、数组、对象的四元属性。其中属性基因对应了包含某段程序代码中变量或数组的类型,数组长度的信息,但也不仅限于此。方法基因包含某段程序代码中定义的函数信和执行的跳转等指令。数组基因其实就是其中所有的操作变量,数组的代码。对象基因除了包含了对对象的操作,更重要的一点是在必要条件下,他会记录对堆栈进行操作的指令,甚至在动态分析下会记录堆栈的情况。下图是元基因在一个软件模块中的分布。
图4 元基因在软件模块中的分布实例
根据前文所说,每一条代码都是一个软件基因,它们相互组合形成元基因,对应起来就可以得到图中的属性基因、对象基因、方法基因、数组基因、以及内含子(低频且低关联度的指令)。而这些元基因再进行组合形成一个染色体,这个染色体包含了软件中对应模块的信息。同时仔细观察我们也可以发现这是一个拥有字符串漏洞性征的软件基因。
出于对安全的考虑,有些软件开发者会在系统层面或是软件层面甚至是代码层面开启各种保护机制,在拥有保护机制的前提下,即使一个软件拥有某一种漏洞的性状,攻击者也无法利用这一漏洞。在这种情况下,这一保护机制便称为这个漏洞的抑制因子。事实上,提取单个软件基因的作用非常之小,若要将其利用起来,就必须加入抑制因子等防御者/攻击者可利用的信息。这种插入抑制因子和利用模式过程称为杂交。其中利用模式是攻击者所需要的信息,抑制因子是防御者所需要的信息。
图5 基因杂交
我们可以通过一定数量的样本使用pintool等工具生成软件基因库,在库中产生元基因和致死因子,之后再通过libfuzzer之类的工具,获取该样本中的漏洞的利用模式,杂交形成一个软件基因样本(如上图),再使用大量的样本构建一个知识图谱。这样之后再进行漏洞分析时,使用者只需要生成含有漏洞性状和致死因子的软件基因,并将这个基因放入知识图谱,预测补全关于漏洞利用模式和漏洞信息的部分,并针对已有的信息,优化致死因子,便可以获取一个完整的漏洞分析、挖掘、利用链。
本文介绍了关于软件基因的定义、提取方案以及可能利用模式。对于软件基因的提取工具仍处于优化阶段,因此并未提及。关于文中提出的基因对象和利用模式均处于研究阶段,欢迎批评指正。
关于 天 方 夜 “谈”
天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。
方班人有自己的浪漫,
我们探讨知识,谈论理想,
采摘科研的繁星,
脚下是星辰大海。
天:代表我们的理想犹如天空般浩荡
方:代表方班
夜:代表代码人的冷静与静谧
谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”