CASFinder:检测软件的共同攻击面
在当今的软件行业中,代码复用是一种常见的做法,它能显著加速开发进程。然而,这种做法也可能引发大规模的安全问题,因为共享的库或代码片段可能使多个不同的软件应用程序存在相同的漏洞。
1. 代码复用带来的安全隐患
代码复用虽然有诸多好处,但也存在潜在风险。以OpenSSL中的Heartbleed漏洞为例,这个漏洞影响了众多流行的Web服务器,如Apache和Nginx,在互联网上引发了广泛的恐慌。此外,现有代码片段的复用也可能导致不同软件应用程序出现类似的漏洞,而且这些复用的代码通常没有官方文档进行追踪,使得理解其安全影响变得更加困难。这种现象还可能削弱依赖软件多样性来保障安全的概念,因为看似无关的软件应用程序实际上可能存在共同的弱点。
目前,识别和表征共享代码片段的安全影响这一问题受到的关注较少。大多数现有的漏洞检测工具主要基于静态和/或动态分析来识别特定软件应用程序的漏洞,而不考虑不同软件是否因共同的库或复用的代码而共享类似的漏洞。现有的软件克隆检测工作主要集中在基于文本或功能相似性来识别复用的代码片段,而没有涉及安全影响。
2. 解决方案:共同攻击面与CASFinder工具
为了解决上述问题,我们定义了共同攻击面的新概念,并开发了自动化工具CASFinder来计算给定软件应用程序的共同攻击面。具体步骤如下:
-
扩展攻击面概念
:将著名的攻击面概念扩展,以模拟一对软件可能共享潜在易受攻击代码片段的相对程度。这种正式模型能够从安全角度量化软件多样性,其结果可作为更高级别多样性方法(如网络多样性和移动目标防御)的输入。
-
开发CASFinder工具
:这是一个自动化工具,它以两个软件应用程序的源代码为输入,并将它们的共同攻击面结果输出到XML文件或数据库中。
-
进行实验验证
:将我们的工具应用于来自Github的大量真实世界开源软件应用程序,分析了超过80,000种软件应用程序组合。实验结果表明,许多看似无关的软件应用程序实际上共享着显著的共同攻击面。
3. 研究贡献
本研究的贡献主要体现在以下三个方面:
-
首次正式建模
:这是首次对复用代码片段的安全影响进行正式建模。共同攻击面模型可以作为基础,并为更高级别的通过多样性实现安全的方法提供定量输入。
-
CASFinder工具的实用性
:该工具使得评估开源软件应用程序之间的共同攻击面成为可能,具有许多实际用例。例如,为安全从业者提供有用的参考,帮助他们选择合适的软件应用程序组合,以最大限度地提高其网络中的整体软件多样性;复用一个软件中现有漏洞的知识,有可能在其他软件中识别类似的漏洞。
-
实验结果的启示
:实验结果证明了不同供应商开发的看似无关的软件应用程序可能共享类似漏洞的可能性。这一发现有助于吸引更多人重新审视软件多样性的概念及其安全含义。
4. 预备知识
4.1 动机示例
考虑一个企业网络,其中Web服务器运行Apache HTTP服务器或Nginx HTTP服务器,还有一个Cyrus IMAP服务器。假设这三个软件应用程序都是受Heartbleed漏洞影响的易受攻击版本。这个漏洞影响了大约24 - 55%的流行网站,使攻击者能够访问受影响服务器上的敏感内存块,其中可能包含加密密钥、用户名、密码等。
该漏洞存在于流行的OpenSSL库中,许多Web和电子邮件服务器软件应用程序使用该库来支持https连接。当软件调用OpenSSL扩展时,漏洞就会出现。攻击者可以通过构造一个具有特殊长度的心跳请求并发送到服务器来利用该漏洞,这会导致不同的软件应用程序在没有任何边界检查的情况下调用相同的库函数memcpy(),从而使攻击者能够从服务器中提取敏感内存块。
这种现象表明,需要识别可能共享此类共同漏洞的软件应用程序,并表征这种共享的程度。这一能力具有许多实际用途,例如开发和应用类似的软件补丁或修复程序来缓解共同漏洞,减少开发这些补丁和修复程序所需的时间和精力;帮助管理员更好地判断其网络中的软件多样性,并选择合适的软件应用程序组合以增加多样性;为移动目标防御提供更精确的方法,因为它可以量化在移动目标防御机制下切换不同软件资源所实现的软件多样性。
4.2 背景知识
为了衡量克隆代码对安全的潜在影响,我们采取了两个步骤:首先找到不同软件应用程序中的相似代码片段,然后表征这些代码片段的安全影响。
-
代码克隆检测
:大多数克隆检测方法基于文本相似性或功能相似性,现有工具主要基于文本、标记、树、图或指标。我们选择了CCFinder,这是一个基于语言的源代码克隆检测工具,用于查找给定软件应用程序中的克隆代码片段。CCFinder是领先的基于标记的检测工具之一,它在2002年获得了克隆奖,支持多种语言,包括C、C++、Java和COBOL。它的工作流程如下:
- 使用词法分析器将给定的源代码分割成标记。
- 通过将标识符、常量和其他基本标记替换为代表其语言角色的通用标记来规范化这些标记。
- 使用基于后缀树的子字符串匹配算法来查找与克隆对和类对应的公共子序列。
CCFinder的一个关键优势是它能够容忍复用代码中的一些小的代码更改,如格式、间距和重命名。
- 攻击面概念 :攻击面是一个众所周知的软件安全指标,用于衡量软件安全暴露的程度。它从三个维度进行测量:入口和出口点(即调用I/O函数的方法)、通道(如TCP和UDP)和不可信数据项(如注册表项或配置文件),然后通过加权求和来汇总计数结果。攻击面衡量的是软件应用程序的内在属性,无论外部因素如何,它都能潜在地涵盖已知和未知的漏洞。
然而,将克隆检测结果与攻击面概念相结合并非易事。例如,在处理入口点时,简单地应用攻击面概念可能会忽略I/O函数调用的具体数量,而这种差异在实际中可能是显著的。因此,我们的模型将采用更精细的方法来解决这些问题。
5. 共同攻击面模型
我们通过两个新颖的安全指标来建模软件应用程序之间克隆代码片段的安全含义,即条件共同攻击面(ccas)和概率共同攻击面(pcas),这两个指标适用于不同的用例:
-
条件共同攻击面(ccas)
:该指标是不对称的,适用于某个软件特别受关注并与其他所有软件进行评估的情况。例如,一家公司开发了一个新的Web服务器应用程序,希望了解其产品与其他现有Web服务器(如Apache和Nginx)之间的相似性。在这种情况下,可以使用ccas指标根据共享攻击面的相对百分比对其他软件应用程序进行排名。
-
概率共同攻击面(pcas)
:在管理员希望了解同一网络中所有软件应用程序之间的软件多样性水平的情况下,pcas指标更为合适。因为在这种情况下,比较的两个软件被认为同等重要,pcas将为任意一对软件提供唯一的共享攻击面测量值。
5.1 条件共同攻击面(CCAS)指标
下面通过一个示例来详细说明条件共同攻击面的计算方法。假设有一个Web服务器应用程序SimpleWebserver和一个ssh应用程序SSHBen,使用CCFinder识别出它们之间的克隆段。
-
定义共同攻击面 :给定两个软件应用程序A和B,在克隆ID i下,A相对于B(或B相对于A)的共同攻击面定义为存在于A在克隆ID i下的克隆段内的I/O函数调用的多重集,记为casi(A|B)(或casi(B|A))。例如:
- cas28(SimpleWebserver|SSHBen) = ⟨strcat, strcat, fopen⟩
- cas28(SSHBen|SimpleWebserver) = ⟨strcat, strcat, strcat, fopen⟩
- cas78(SimpleWebserver|SSHBen) = ⟨fopen, fseek, ftell⟩
- cas78(SSHBen|SimpleWebserver) = ⟨fopen, fseek, ftell, fopen, fseek, ftell, fopen, fseek, ftell, fopen, fseek, ftell⟩
-
计算共同攻击面大小 :由于攻击面概念基于入口和出口点的数量(即调用I/O函数的方法),我们通过计算不同克隆ID下的I/O函数调用数量来计算共同攻击面的大小,不同克隆ID下出现的I/O函数调用只计算一次。例如,对于克隆ID 78,SimpleWebserver有3个I/O函数调用,SSHBen有12个;对于克隆ID 28,SimpleWebserver有3个,SSHBen有4个。考虑到fopen在SimpleWebserver的两个克隆ID下都被考虑,所以只计算一次。最终,SimpleWebserver的两个克隆ID的I/O函数调用总数为5,SSHBen为16。
-
定义条件共同攻击面 :条件共同攻击面定义为一个软件应用程序(相对于另一个软件)的共同攻击面大小与其整个攻击面大小(即该软件内部的I/O函数调用总数)的比率。这个比率表示该软件与其他软件共享类似I/O函数调用(入口/出口点)的程度。计算公式如下:
- (ccas(A | B) = \frac{|\bigcup_{i=1}^{n} cas(A | B)|}{ASA})
- (ccas(B | A) = \frac{|\bigcup_{i=1}^{n} cas(B | A)|}{ASB})
假设SimpleWebserver和SSHBen的攻击面(即I/O函数调用总数)分别为16和182,则:
- (ccas(SSHBen | SimpleWebserver) = \frac{5}{16} = 0.3125)
- (ccas(Simple-Webserver | SSHBen) = \frac{16}{182} = 0.029)
结果表明,SSHBen包含约31%的共享攻击面,而SimpleWebserver仅包含约2.9%。
通过以上步骤,我们可以更准确地评估软件之间的共同攻击面,从而更好地理解代码复用带来的安全风险,并采取相应的措施来保障软件的安全性。
下面是一个简单的mermaid流程图,展示了计算条件共同攻击面的主要步骤:
graph TD;
A[获取软件A和B的源代码] --> B[使用CCFinder识别克隆段];
B --> C[定义共同攻击面casi(A|B)和casi(B|A)];
C --> D[计算不同克隆ID下的I/O函数调用数量];
D --> E[计算共同攻击面大小];
E --> F[计算软件A和B的整个攻击面大小ASA和ASB];
F --> G[根据公式计算ccas(A|B)和ccas(B|A)];
综上所述,我们的研究通过定义共同攻击面概念和开发CASFinder工具,为解决代码复用带来的安全问题提供了有效的方法。未来,我们将继续研究如何进一步完善模型和工具,考虑更多的因素,如通道和不可信数据项,以更准确地评估软件的安全性。
CASFinder:检测软件的共同攻击面
6. CASFinder工具的设计与实现
为了实现计算软件共同攻击面的目标,我们设计并实现了CASFinder工具。以下是该工具的详细设计与实现步骤:
6.1 工具架构
CASFinder工具主要由以下几个模块组成:
-
代码克隆检测模块
:使用CCFinder工具识别两个软件应用程序之间的克隆代码片段。该模块接收两个软件的源代码作为输入,输出克隆段的信息,包括克隆ID和对应的代码片段。
-
攻击面分析模块
:根据克隆检测结果,分析每个克隆段内的I/O函数调用情况,计算共同攻击面。该模块将克隆段信息与攻击面概念相结合,统计不同克隆ID下的I/O函数调用数量,并计算共同攻击面的大小。
-
结果输出模块
:将计算得到的共同攻击面结果输出到XML文件或数据库中。该模块支持用户选择不同的输出格式,方便后续的数据分析和处理。
6.2 工具实现步骤
以下是CASFinder工具的具体实现步骤:
1.
输入源代码
:用户提供两个软件应用程序的源代码作为工具的输入。
2.
代码克隆检测
:调用CCFinder工具对输入的源代码进行克隆检测,得到克隆段的信息。
3.
攻击面分析
:根据克隆检测结果,分析每个克隆段内的I/O函数调用情况,计算共同攻击面。具体步骤如下:
- 遍历每个克隆段,提取其中的I/O函数调用。
- 统计不同克隆ID下的I/O函数调用数量,不同克隆ID下出现的I/O函数调用只计算一次。
- 计算每个软件应用程序的整个攻击面大小,即该软件内部的I/O函数调用总数。
- 根据条件共同攻击面的定义,计算两个软件之间的ccas值。
4.
结果输出
:将计算得到的共同攻击面结果输出到XML文件或数据库中。用户可以根据需要选择不同的输出格式。
以下是一个简单的表格,总结了CASFinder工具的实现步骤:
|步骤|描述|
|----|----|
|输入源代码|用户提供两个软件应用程序的源代码|
|代码克隆检测|调用CCFinder工具进行克隆检测|
|攻击面分析|分析克隆段内的I/O函数调用,计算共同攻击面|
|结果输出|将结果输出到XML文件或数据库中|
7. 工具评估
为了评估CASFinder工具的有效性和实用性,我们进行了一系列实验,使用真实的开源软件进行测试。
7.1 实验设置
我们从Github上选取了大量的开源软件应用程序,这些软件属于七个不同的类别。我们对超过80,000种软件应用程序组合进行了分析,以验证CASFinder工具的性能。
7.2 实验结果
实验结果表明,许多看似无关的软件应用程序实际上共享着显著的共同攻击面。以下是一些具体的实验结果:
-
不同软件之间的共同攻击面
:通过计算不同软件之间的ccas值,我们发现一些软件之间的共享攻击面比例较高。例如,某些Web服务器软件和邮件服务器软件之间存在一定程度的共同攻击面,这表明它们可能共享一些相似的漏洞。
-
软件多样性评估
:我们还使用CASFinder工具评估了软件多样性的程度。结果显示,在一些网络中,选择合适的软件组合可以显著提高软件多样性,从而降低安全风险。
7.3 实验结论
通过实验,我们验证了CASFinder工具的有效性和实用性。该工具可以帮助安全从业者更好地了解软件之间的共同攻击面,选择合适的软件组合,提高网络的安全性。同时,实验结果也证明了不同供应商开发的看似无关的软件应用程序可能共享类似漏洞的可能性,这有助于吸引更多人重新审视软件多样性的概念及其安全含义。
8. 相关工作回顾
在研究软件共同攻击面的过程中,我们对相关工作进行了回顾。以下是一些相关工作的总结:
-
漏洞检测工具
:大多数现有的漏洞检测工具主要基于静态和/或动态分析,用于识别特定软件应用程序的漏洞。这些工具通常不考虑不同软件之间是否共享类似的漏洞。
-
软件克隆检测工具
:现有软件克隆检测工具主要基于文本或功能相似性,用于识别复用的代码片段。然而,这些工具通常没有涉及代码片段的安全影响。
与这些相关工作相比,我们的研究通过定义共同攻击面概念和开发CASFinder工具,填补了现有研究的空白,为解决代码复用带来的安全问题提供了新的方法。
9. 总结与未来方向
9.1 总结
本文通过定义共同攻击面的新概念和开发CASFinder工具,为解决代码复用带来的安全问题提供了有效的方法。我们的主要贡献包括:
- 首次对复用代码片段的安全影响进行了正式建模,为更高级别的通过多样性实现安全的方法提供了定量输入。
- 开发了CASFinder工具,使得评估开源软件应用程序之间的共同攻击面成为可能,具有许多实际用例。
- 通过实验验证了不同供应商开发的看似无关的软件应用程序可能共享类似漏洞的可能性,有助于吸引更多人重新审视软件多样性的概念及其安全含义。
9.2 未来方向
虽然我们的研究取得了一定的成果,但仍有一些问题需要进一步研究。以下是一些未来的研究方向:
-
考虑更多因素
:在目前的研究中,我们主要关注了入口和出口点,未来可以考虑更多的因素,如通道和不可信数据项,以更准确地评估软件的安全性。
-
优化工具性能
:进一步优化CASFinder工具的性能,提高其计算效率和准确性。
-
应用拓展
:将CASFinder工具应用到更多的场景中,如软件供应链安全、云计算安全等,为这些领域的安全评估提供支持。
下面是一个mermaid流程图,展示了未来研究的主要方向:
graph TD;
A[考虑更多因素] --> B[优化工具性能];
A --> C[应用拓展];
通过不断地研究和改进,我们相信可以更好地解决代码复用带来的安全问题,提高软件的安全性和可靠性。
超级会员免费看
45

被折叠的 条评论
为什么被折叠?



