摘要
软件安全漏洞的分类无疑有助于对安全相关信息的理解,并加速了对漏洞的分析。缺乏适当的分类不仅阻碍了对它的理解,而且还影响了为集群漏洞设计缓解机制的策略。现在,软件开发人员和研究人员都认为,软件的需求和设计阶段是安全问题产生最大效益的阶段。在本文中,我们试图设计一个分类器,可以识别和分类设计层面的漏洞。在这个分类器中,首先根据已建立的安全属性(如认证和授权)来确定漏洞类别。漏洞训练数据是从各种真实的来源收集的,如Common W eakness Enumeration(CWE)、Common Vulnerabilities and Exposures(CVE)等。从这些数据库中只包括那些在设计阶段有可能被缓解的漏洞。然后,这些漏洞数据通过各种程序进行预处理,如文本干化、删除停顿词、案例转换。在预处理之后,SVM(支持向量机)被用来对漏洞进行分类。Bootstrap v alidation被用来测试和验证分类器所执行的分类过程。训练完分类器后,对NVD(国家漏洞数据库)设计级别的漏洞进行了案例研究。漏洞分析是在分类结果的基础上进行的。
关键词:安全漏洞,设计阶段,分类,机器学习,安全特性
1.导言
对于今天的软件开发者来说,开发安全的软件仍然是一个重大的挑战,因为他们仍然难以理解现有软件中存在漏洞的原因。能够在SDLC(软件开发生命周期)的早期阶段识别软件安全漏洞是至关重要的,早期检测方法之一是咨询先前已知的漏洞和相应的修复措施[1]。当候选安全漏洞在软件的早期阶段(如需求和设计阶段)被处理时,识别这些漏洞会带来很大的好处[2]。漏洞的分类在更好地理解漏洞方面是很有成效的,分类也有助于减轻漏洞组的影响。识别和减轻安全漏洞无疑是一项艰巨的任务,因此开发了分类法,可以将漏洞分类,这将有助于设计者减轻漏洞群。过去有许多分类法的开发方法,如[3,4,5,6]等,但从来没有人提出任何分类法,在安全属性的基础上对设计层面的漏洞进行分类。我们已经在[7]中提出了一个分类法,如表1.0(a)所示,其中提出了先验分类法,并对漏洞进行手工分类。但是在这种分类法中,有可能出现 "霍桑效应",它也在很大程度上取决于分类器的专业知识。因此,在这里我们要创建一个分类器,可以自动对漏洞数据进行分类。机器学习现在是自动化任务中的一个流行工具。研究人员已经探索了使用机器学习技术,通过首先使用训练集使分类器适应特定文档集的特征集,来自动将文档与类别联系起来[8]。机器学习是一种相对较新的方法,可以用来对漏洞进行分类。因此,这里提出了一个分类器,该分类器在以前识别的漏洞的基础上对漏洞进行分类,并能帮助设计者将漏洞放在基于软件安全属性的预定义漏洞类别中。因此,缓解机制可以适用于整个漏洞类别。在这个分类器中,首先对数据进行了预处理,如文本干化、删除停顿词、大小写转换,然后使用SVM(支持向量机)与回归模型进行最终分类。在应用分类后,得出了几个结论。最后,使用这个分类器对NVD(国家漏洞数据库)的漏洞进行分类和分析。
第一级 | 第二级 | 第三级 | 第四级 |
访问控制 | 过程层面的访问控制 | 认证 | 缺少认证程序 |
不充分的认证程序 | |||
错误的认证程序 | |||
授权 | 缺少授权程序 | ||
授权程序不充分 | |||
错误的授权程序 | |||
审计和日志记录 | 缺少审计和日志记录 | ||
信息记录或审计不充分 | |||
对信息进行错误的审计或记录 | |||
通信层面的访问控制 | 安全的会话管理 | 缺少安全的会话管理 | |
安全会话管理不充分 | |||
错误的安全会话管理 | |||
安全的 信息流 | 传输过程中缺少对敏感数据的加密 | ||
传输过程中对敏感数据的加密不足 | |||
传输过程中对敏感数据的错误加密 | |||
导致访问违规的风险暴露 | 错误信息中的暴露 | 缺少安全的错误信息 | |
不够安全的错误信息 | |||
错误的安全错误信息 | |||
可预测的算法/序列号/文件名 | 随机序列号中的随机性缺失 | ||
随机序列号中的随机性不足 | |||
随机序列号中的错误随机性或文件名的错误选择 | |||
用户警觉性 | 缺少用户提示信息 | ||
用户提示信息不足 | |||
错误的用户提示信息 |
表1.0(a):设计层面漏洞的分类法
在考虑拟议的分类器中的类的数量时,我们只考虑 "进程级的访问控制 "和 "通信级的访问控制",所有其他类型的漏洞都被考虑在 "其他 "类中。由于 "暴露导致访问违规 "类涵盖了一个很大的漏洞领域,需要单独研究,因此在探索了该类的领域后,我们将其从分类器中排除,并将在未来的工作中考虑。
论文的其余部分组织如下,第2节讨论了脆弱性分类中的相关工作,第3节详细说明了脆弱性分类模型的开发过程。在第4节中,使用开发的分类器对漏洞进行分类。第5节讨论了结论和未来的工作。
2. 相关工作
目前有很多使用机器学习技术的分类方法,如[9]提出的使用本体方法来检索漏洞数据并建立漏洞数据之间的关系,并对漏洞产生的原因和影响进行推理。在本体漏洞管理(OVM)中,他们填充了NVD (National vulnerability Database)的所有漏洞,并添加了推理规则、知识表示和数据挖掘机制。脆弱性分类的另一个相关的工作区域是由[10],他们提出了CVE分类框架,将漏洞词典转换为一个分类器,分类CVE(常见的漏洞和风险)对不同分类的特性和评估通用漏洞的演变趋势。[11]在他们题为“实践中的安全软件设计”的论文中提出了一个SODA(面向安全的软件开发框架),这是一个研究项目的结果,该项目的主要目标是创建一个实用技术和工具系统,以创建安全的软件,并特别关注软件的设计阶段。对漏洞进行分类的另一种方法是[12]。在他们的论文[12]中,他们研究了使用SOM对CVE中的漏洞进行分类的可能性。他们提出了一种方法来对CVE存储库中的漏洞进行分类,并提出了一种使用数据聚类算法来标准化漏洞类别的解决方案。[13],提出了SecureSync,一个自动检测和提供建议的解决方案,在多个共享/使用类似代码或API库的系统上重复出现的软件漏洞。还有很多其他的漏洞分类方法,如[14,15,16],但上述所有方法要么在本质上是通用的,要么不能根据软件的安全属性对漏洞进行分类。因此,在本研究工作中,我们提出了一种使用机器学习技术开发的分类器,它非常适合软件的设计阶段。在下一节中,将解释分类器的发展阶段。
3.0 设计级漏洞分类模型
软件漏洞数据库是软件安全知识库的重要组成部分。目前存在大量交换软件漏洞信息的漏洞数据库,但其缺乏分类和泛化功能[10],影响了漏洞分析。要从这些数据库中提取有用的相关信息,需要大量的手工工作。例如,如果软件开发人员想知道当前软件在特定时期中最常见和最严重的漏洞,那么他必须研究在该时期发布的所有漏洞描述,然后他必须根据自己的标准对这些漏洞进行分类,然后他必须检查各个专家提供的严重性评级。这是一项非常不可靠、冗长、耗时的任务。使用提出的分类模型,研究人员和开发人员可以在SDLC的早期阶段轻松地对设计级漏洞进行分类,并以设计模式的形式确定缓解机制。具有严重性等级的分类结果可以进一步用于计算软件设计阶段出现漏洞的风险。
自动文本分类器主要用于对预定义类中的文本进行分类。分类器的抽象视图如图3.0 (a)所示。在本设计级别的漏洞分类器中,首先对文本进行标记化、大小写转换、停止字删除和词干提取等处理,然后使用支持向量机(SVM)对文本进行分类,最后使用bootstrap验证对结果进行测试和验证。分类器的开发过程如图3.0 (b)所示。
[10]提出的漏洞分类框架与该设计级分类器相似。而Chen的框架是在BID、X-force和Secunia的分类类别基础上,对CVE的所有漏洞进行分类的广义分类框架。他们的框架中的训练数据也仅来自这些漏洞数据库。
在我们的设计级漏洞分类器中,只对设计级漏洞进行分类,而在训练数据中,只考虑那些识别出来的、可以在软件设计级减轻的漏洞。并根据软件的认证、授权等安全特性来定义类,这是开发软件安全设计模式时通常要考虑的问题。因此,经过分类后,开发者/研究者可以在选择安全设计模式之前优先考虑普遍存在的漏洞类别。
3.1特征向量的创建
CVE中的漏洞以自然语言的形式定义。因此,利用漏洞描述识别特征向量的唯一方法就是描述中关键字出现的频率。因此,通过描述漏洞时使用的关键字来识别特征向量。为了将漏洞描述转化为机器学习算法可以使用的结构化表示形式,首先将文本转换为标记,然后进行词干和停止删除,以及大小写转换。在特征创建过程中有五个步骤,具体如下:
a).标记化
b).大小写转换
c).停止字消除
d). CVE条目的文本词干生成
e).权重赋值
a).标记化
将类似单词的单元从文本中分离出来称为标记化。在这个过程中,文本流被分解成单词、短语和被称为[17]的符号。这些令牌可以进一步用作信息处理的输入。为了将文本转换为机器学习形式,首先将原始文本转换为机器可读的形式,第一步是标记化。如图3.1 (a)所示,原始文本首先被送入预处理器,将文本转换为符号形式,然后进一步使用形态分析器进行所需的语言分析。
为了在机器学习过程中提供漏洞描述,首先将漏洞文本描述转换为令牌形式。表3.1 (a)中显示了标记化后的漏洞描述。
漏洞ID | 漏洞描述 | token化后的漏洞描述 |
CVE-2007-0164 | Camouflage 1.2.1 embeds password information in the carrier file, which allows remote attackers to bypass authentication requirements and decrypt embedded steganography by replacing certain bytes of the JPEG image with alternate password information. | Camouflage, embeds, password, information, in, the, carrier, file, which, allows, remote, attackers, to, bypass, authentication, requirements, and, decrypt, embedded, steganography, by, replacing, certain, bytes, of, the, JPEG, image, with, alternate, password, information. |
b).大小写转换
当从任何源检索原始文本进行处理时,它既包含大写字母,也包含小写字母。机器学习算法将不同情况下的单词解读为不同的单词。为了转换同一大小写中的所有单词,使用了大小写转换过程。大小写转换器,将文档中的所有字符分别转换为小写或大写。在本例中,我们已将文档中的所有单词都转换为小写。
漏洞ID | 漏洞描述 | 案例转换后的漏洞描述 |
CVE-2007-0164 | Camouflage, embeds, password, information, in, the, carrier, file, which, allows, remote, attackers, to, bypass, authentication, requirements, and, decrypt, embedded, steganography, by, replacing, certain, bytes, of, the, JPEG, image, with, alternate, password, information | camouflage, embeds, password, information, in, the, carrier, file, which, allows, remote, attackers, to, bypass, authentication, requirements, and, decrypt, embedded, steganography, by, replacing, certain, bytes, of, the, jpge, image, with, alternate, password, information |
c).停止字消除
停止词消除是一个去除那些被认为仅用于语法功能的标记的过程,而不会给它们所涉及的句子增加新的意义[18]。停止词列表通常由冠词、大小写助词、连词、代词、助动词和常用介词组成。没有唯一的常用停止词列表。不同的研究人员提出了许多清单。Chen使用了418个停止词[10]。信息检索系统Snowball[19]和Lemur[20]中也使用了类似的停止词列表。删除停止字后的漏洞描述如表3.1(c)所示
漏洞ID | 标记化和案例转换后的漏洞描述 | 删除Stopword后的漏洞描述 |
CVE-2007-0164 | camouflage, embeds, password, information, in, the, carrier, file, which, allows, remote, attackers, to, bypass, authentication, requirements, and, decrypt, embedded, steganography, by, replacing, certain, bytes, of, the, jpge, image, with, alternate, password, information. | camouflage, embeds, password ,information, carrier, file, allows, remote, attackers, bypass, authentication, requirements, decrypt, embedded, steganography, replacing, bytes, jpge, image, alternate, password, information. |
d). CVE条目的文本词干生成
如今,在现代信息检索(IR)系统中使用词干算法是很常见的。词干算法有助于自由文本检索,其中搜索词可以以各种不同的形式出现在文档集合中。词干分析使此类文档的检索独立于查询中使用的特定单词形式[21]。为了从漏洞描述中提取信息,可以使用词干算法,以便将文本轻松转换为机器可读的形式。波特词干算法是信息检索过程中常用的算法之一。波特的算法由5个阶段组成,依次应用。在每个阶段中,有各种选择规则的约定,例如从应用于最长后缀的每个规则组中选择规则。在第一阶段,此约定与以下规则组一起使用[22]:
规则 | 示例 |
SSES → SS | caresses → caress |
IES → I | ponies → poni |
SS → SS | caress → caress |
S → | cats → cat |
应用波特词干算法后的漏洞描述如表3.1(d)所示。
漏洞ID | 漏洞描述 | 文本词干分析后的漏洞描述 |
CVE-2007-0164 | Camouflage 1.2.1 embeds password information in the carrier file, which allows remote attackers to bypass authentication requirements and decrypt embedded steganography by replacing certain bytes of the JPEG image with alternate password information. | camouflag emb password inform carrier file allow remot attack bypass authent requir decrypt embed steganographi replac byte jpeg imag altern password inform |
e).权重赋值
在进行文本词干分析之后,下一步是为漏洞描述的每个单词分配权重。最简单的方法是将权重指定为等于文档“d”中出现术语“t”的次数。该加权方案被称为术语频率,并用下标表示“”,下标表示术语和文档的顺序[22]。通常计算如下。
式中,是频率(文件“d”中术语“t”的出现次数)和(任何术语的最大出现次数)。因此,文件“d”中最频繁出现的术语的TF为1,其他术语的分数为本文件的术语频率。但使用术语频率的缺点是,在这一点上,所有术语都被认为同等重要。为了避免这种偏差,使用术语频率和逆文档频率(tf-idf)加权。一个术语的IDF定义如下[23]。
其中
- |D |:文件总数
- |{d:t∈d}|:出现术语t的文档数(即tf(t,d)≠0)
如[22]中所定义,tf-idf加权方案在文件“d”中为术语“t”分配权重,权重由
换句话说,术语频率逆术语频率赋予术语“t”的权重在文档“d”中为
- •当术语在少量文档中多次出现时,权重较高;
- 当该术语在一份文件中出现的次数较少,或出现在多份文件中时,该值较低
- 当该术语出现在几乎所有的文档中时,最低。
现在,在实现所有上述处理之后,我们将每个漏洞描述作为向量,即使用tf-idf公式计算的权重。表3.1(e)显示了十行的示例集。该向量形式将用于漏洞评分和排名。
3.2 使用支持向量机分类
文本分类是将文本文档分类为一个或多个预定义类别的过程。这种分类结果的差异源于所选择的特征集,该特征集是给定文档与给定类别关联的基础[24]。有许多统计分类方法可以应用于文本分类,如朴素贝叶斯[25]、贝叶斯网络[25]、决策树[26,27]、神经网络[28]、线性回归[29]、k-NN[30]。[31]中介绍的SVM(支持向量机)学习方法在计算科学方面有很好的基础。支持向量机在许多实际学习任务中取得了巨大成功[25]。与其他机器学习方法(包括朴素贝叶斯和神经网络)相比,支持向量机在泛化方面取得了显著更好的性能[32,33]
Vapnik[34]提出的用于解决两类问题的SVM分类算法基于找到由数据类定义的超平面之间的分离,如图3.2(a)所示。
这意味着SVM算法甚至可以在相当大的特征集中运行,因为其目标是测量数据的分离幅度,而不是特征上的匹配[24]。使用预分类文档对SVM进行训练。
如在[34]中所解释的,对于给定的训练数据集T= {.xi,yi}(i=1,…,m),每个数据点 .xi∈Rd具有d特征和一个真实标签yi∈Y= {l1,…,lK}。对于二进制分类器,标签集是Y={l1=−1,l2=+1},它通过寻找分离的超平面将数据点分为正负两类。分离超平面可以表示为等式3.2(a)。
式中,是垂直于超平面的权向量,运算符(·)计算向量w和x的内积,b是偏差。现在我们想要选择“w”和“b”来最大化边距,或者说在分离数据的同时尽可能远的平行超平面之间的距离。这些超平面可以用方程来描述
以及
在标签集Y={l1=1,…,lk=k}和k>2的情况下,在提出的框架中,采用两种方法建立了一个多类SVM学习模型:多类到二进制的约简和多类优化方法[10]。在多类到二值化简方法中,所讨论的学习问题被简化为一组二值分类任务,并使用一对一训练技术为每个标签lk独立构建二值分类器[35]。当涉及两个以上的类时,则使用回归模型。回归模型使用内部操作符指定的回归方法构建分类器。对于每个i类,如果标签等于i,则将标签设置为(+1),如果标签不等于i,则将标签设置为(-1),然后训练回归模型。然后将回归模型组合成一个分类模型。这里我们使用SVM分类模型,因此回归模型被合并到SVM中。为了确定未标记示例的预测,将应用所有模型,并选择属于预测最大值的回归模型的类。
3.3培训数据的识别和准备
有许多公共和私人漏洞数据库,根据不同的原因、发生阶段、特定产品等对漏洞进行分类。列表如表3.3(a)所示。但它们在本质上都太笼统了。CWE(公共弱点枚举)[36]是一个漏洞数据库和门户,其中每个漏洞都指定了其类型、缓解措施、引入阶段及其所属的安全属性。因此,它是根据引入阶段及其所属安全属性收集漏洞数据的最佳场所。图3.3(a)是CWE窗口的屏幕截图,它显示了CWE每个条目包含的信息。在这方面,我们只对那些可以在软件设计阶段缓解的漏洞感兴趣。但在CWE中,漏洞被划分为若干类,每个类的描述中都给出了一些示例。为了从CWE中收集培训数据,我们探索了所需的安全类,然后从每个类中收集漏洞示例。CWE中使用的几乎所有示例都来自CVE(常见漏洞和暴露)。从CWE中为训练集收集尽可能多的示例。
在彻底搜索CWE漏洞类别后,收集的漏洞示例数量如表3.3(b)所示。在从CWE收集数据时,最多要注意只包括引入时间指定为“设计阶段”的漏洞类别
3 .4测试和验证
收集训练数据后,可以建立SVM学习模型。但SVM基本上是一种二值分类器。由于我们有多个|Y|>2的类,学习问题通过多类到二进制的约简方法分解为|Y|二进制分类任务,随后,采用一对一训练方法构建了|Y|二元分类器,该方法通过将训练数据中带有标签li的数据点视为正例,将剩余数据点视为反例,将Y类别li的学习任务本质上转化为两类分类[10]。我们正在使用Rapidminer工具来实现SVM。回归模型用于将数据分类为多个类别。在提供数据回归模型后,使用bootstrap验证来验证分类。图6.2.4(a)显示了rapid miner在实施引导验证时的屏幕截图。
3.5 Bootstrap验证
Bootstrap系列由Efron引入,首次在[37]中描述。在该方法中,对于大小为n的给定数据集,通过从数据中均匀地采样n个实例来创建引导样本。有几种引导方法。一个常用的是0.632引导。正如Han和Kimber在《数据挖掘:概念和技术》一书[38]中所解释的,在这种方法中,假设我们有“d”元组。对数据集采样' d ' / 6次,并进行替换,得到引导样本或d样本的训练集。未包含在训练中的数据元组构成测试集。现在每个元组被选择的概率是1/d,而不被选择的概率是(1-1/d)。我们必须选择d次,所以在整个时间内不选择元组的概率是(1-1/d)d。如果d大,概率接近e-1=0.368。因此,36.8%的元组将不会被选择用于训练,因此最终会进入测试集中,剩下的63.2%将形成训练集。
采样过程可以记录k次,在每次迭代中,我们可以使用当前测试集来获得从当前引导样本获得的模型的精度估计。然后,模型的总体精度估计为:
式中,是自举样本“i”应用于测试集“i”时获得的模型的精度。是将bootstrap样本“i”应用于原始数据元组集时获得的模型的精度。bootstrap方法适用于小数据集。
制造分类器的整个过程如图3.5(a)所示。使用的rapid miner数据挖掘工具以操作员的形式提供了几乎所有可用的数据挖掘过程。首先将训练数据输入到与支持向量机集成的回归模型中,然后使用“应用模型”算子应用所创建的模型,并使用性能算子测量分类器的性能。作为输出,将获得显示分类器精度的混淆矩阵。
应用分类器后获得的混淆矩阵如表3.5(a)所示,混淆矩阵的3D图形表示如图3.5(b)所示。
所有类的类精度值都在90%以上。大约90%的准确率使分类器相当准确(Han和Kamber,2006)。所开发的分类器的总体准确率为94.5%。
如表3.5(a)所示,“身份验证类”的类精度仅为88%,因为身份验证类中使用的关键字对其他类也是通用的。例如,漏洞描述主要由“未经身份验证的用户”、“不允许经身份验证的用户”等词组成,这些词实际上并不表示原因是身份验证,但分类器也会因为在其他类别中频繁使用这些术语而变得混乱,从而影响分类器的性能。但分类器的总体精度是可以接受的,为94.5%。
4.0 分类结果
现在使用这种设计级别的“漏洞分类模型”,漏洞可分为六类。在NVD(国家漏洞数据库)中,截至2009年2月,共有427个漏洞被确定为设计级漏洞。现在,为了在我们预定义的六类中对这些漏洞进行分类,首先需要在分类器中输入漏洞,然后可以使用预测值进行进一步分析。在模型中输入427个设计级漏洞后,获得的预测值示例集如表4.0(a)所示。应用分类器期间Rapidminer的屏幕截图如图4.0(a)所示,最终的分类漏洞数量如图4.0(b)所示。从分类结果可以明显看出,在427个被归类为设计级漏洞的漏洞中,117个实际上不是设计级漏洞。从其余漏洞中,与身份验证和授权相关的漏洞最为普遍,约占总漏洞的53%。
身份验证的百分比为30%,这使得在软件设计阶段减轻身份验证成为最重要的属性。授权占所有漏洞的23.2%,这使其成为第二重要的安全属性
“审计和日志记录”、“安全信息流”和“会话管理”的比例分别为18%、15%和12%,这使得它们几乎同等重要。
这些漏洞分类数据可与严重性评级一起使用,以计算设计阶段漏洞发生的风险。
5.0 结论和未来工作
如前几节所述,对已知漏洞的研究对于开发人员来说是非常有用的工具。我们的方法是识别、分类和学习已知的漏洞。以便在下一代软件中避免这些漏洞。在可用的漏洞数据库中,没有关于漏洞原因或可删除漏洞的SDLC阶段的信息。使用我们提出的分类模型,开发人员将能够从任何漏洞数据库中对任何漏洞进行分类。分类模型将告诉开发人员是否可以在设计级别缓解漏洞?如果漏洞被确定为设计级漏洞,那么它将在安全功能中对已识别的漏洞进行分类。在了解安全特性的类别后,设计师可以调整必要的设计模式,以防止新开发的软件中出现这些漏洞。分类结果的准确性令人满意,可用于对未来的漏洞进行分类。对“暴露导致访问违规”类别的漏洞进行分类是未来可以迅速完成的工作之一。分类结果可进一步用于在软件设计阶段计算安全风险。在风险计算之后,可以确定设计模式形式的缓解机制,因此设计师将能够在softwa的设计阶段缓解安全漏洞