CASFinder:检测软件通用攻击面
1. 概率通用攻击面指标
在评估软件应用程序的安全性时,通用攻击面是一个重要的考量因素。开发者通过将一个软件应用与其他多个应用进行比较,能在漏洞发现和安全补丁管理方面从比较结果中获得有用的见解。
为了评估两个软件应用之间的通用攻击面,我们引入了对称的概率通用攻击面指标。这里使用了 Jaccard 指数,其通常定义为 ( J(A, B) = \frac{|A \cap B|}{|A \cup B|} ),用于分析两个集合之间的相似性和多样性。
在定义两个软件应用攻击面的交集和并集时:
- 交集定义 :采用标准的多集交集操作。给定两个多集 ( A = \langle A, f \rangle )(其中 ( f ) 是多重性函数,对于任意 ( a \in A ),( f(a) ) 给出 ( a ) 在多集中的出现次数)和 ( B = \langle A, g \rangle ),它们的交集 ( A \cap B ) 是多集 ( \langle A, s \rangle ),其中对于所有 ( a \in A ),( s(a) = \min(f(a), g(a)) )。例如,假设 ( U = {a,a,a,b} ) 和 ( V = {a,a,b,b} ),应用上述多集操作,可得 ( U \cap V = {a,a,b} )。
- 并集定义 :两个软件应用攻击面的并集定义为 ( AS_A \cup AS_B = AS_A + AS_B - cas(B | A) \cap cas(A | B) )。
基于此,概率通用攻击面指标定义如下:
给定两个软件应用 ( A ) 和 ( B ),其攻击面分别为 ( AS_A ) 和 ( AS_B ),通用攻击面分别为 ( cas(B|A) ) 和 ( cas(A|B) ),则 ( A ) 和 ( B ) 的概率通用攻击面定义为:
( pcas(A.B) = \frac{| cas(B | A) \cap cas(A | B) |}{| AS_A \cup AS_B |} )
例如,Simple - Webserver 和 SSHBen 的攻击面大小分别为 16 和 182,且 ( cas(SSHBen | SimpleWebserver) \cap cas(SimpleWebserver | SSHBen) ) 的大小为 5,则 ( pcas(SSHBen.SimpleWebserver) = \frac{5}{16 + 182 - 5} = 2.6\% )。这表明在所有 I/O 函数调用中,约 2.6% 是这两个软件应用共享的。将此结果应用于网络内的所有软件应用对时,管理员可以从安全角度估计网络中软件的多样性程度。
2. CASFinder 工具的设计与实现
为了自动评估软件应用之间的通用攻击面,我们设计并实现了 CASFinder 工具。该工具的架构主要由三个组件组成:
- 克隆检测模块 :选择 CCFinder 作为克隆检测模块的基础。在 Linux 环境下使用时,仅应用 CCFinder 的后端。具体操作步骤如下:
1. 由于默认的 Linux 版 CCFinder 设计用于 Ubuntu 9,许多较新的库版本对其不再有效,因此需要单独安装一些库,如 libboost - dev 和 libicu - dev,这些库的具体版本可根据 CCFinder 产生的警告和错误来确定。
2. 可以在 CCFinder 中微调各种参数以定制其执行模式。重要参数包括:
- ( b ):检测到的代码克隆的最小长度,根据大量实验经验选择 ( b = 20 )。
- ( t ):涉及的最小令牌类型数,选择 ( t = 8 )。
- ( w ):用于确定 CCFinder 是否执行文件内克隆检测,为了专注于文件间克隆,将 ( w ) 设置为 f - w - g +。
3. CCFinder 的默认输出存储在扩展名为 .ccfd 的二进制文件中。由于未安装 CCFinder 的前端,使用命令 ./$PATH/ccfx -p name.ccfd 将 .ccfd 文件转换为人类可读版本。
4. 转换后的文件仅包含令牌信息,无法直接映射回源代码文件,因此开发了脚本 post - prettyprint.pl 将令牌信息转换为源代码中的相应行号。
- 源代码标记模块 :CCFinder 的转换输出仅提供克隆段的文件名和行号,缺乏将其映射回原始源代码所需的信息。此模块的作用是根据 CCFinder 的结果自动从源代码中检索克隆代码段,建立克隆段行号与源代码之间的映射,以生成带有源代码片段的可追溯输出。
- 可视化和通用攻击面计算模块 :可视化模块生成克隆段的结果,包括克隆 ID、文件路径、函数名、克隆段、起始行号和结束行号。可视化输出组织为带有标签的 XML 树,其中标签内容包含 CCFinder 输出的源克隆段, funcname 标签显示与克隆段对应的函数名, io 标签包含通用 I/O 函数。为了计算通用攻击面,首先从 GNU C 库(glibc)获取 I/O 函数列表作为检查入口/出口点的数据库,该数据库中共存储了 256 个 I/O 函数,如 memcpy 或 strcpy 等,这些函数可能会导致严重的安全漏洞。最终的通用攻击面结果根据所有软件应用共享的 I/O 函数计算得出,并可存储在文件或数据库中。
3. 实验数据集
为了研究现实世界软件应用之间的通用攻击面,需要大量的开源软件。为此,开发了一个脚本,用于自动解析开源软件托管平台上的下载链接。通过 GitHub 提供的定制 API,用户可以根据定制要求搜索开源软件应用并自动下载。在实验中,将参数 language 设置为 C 程序,并使用参数 q 、 sort 和 order 指定查询条件和定制结果顺序。脚本自动解析 GitHub 的 json 格式输出,并将软件下载链接、作者、发布时间、大小和其他描述信息存储到本地数据库。由于 GitHub 在一定时间内对最大请求数有限制,每次查询后会让进程休眠一段时间。
实验环境为运行 Ubuntu 14.04 的虚拟机,配备 Intel core i3 - 4150 CPU 和 8.0 GB 的 RAM。实验共应用了 293 个不同的软件应用,分为七个类别:
| 类别 | 数量 |
| ---- | ---- |
| 数据库 | 32 |
| Web 服务器 | 62 |
| SSH 服务器 | 25 |
| FTP 服务器 | 79 |
| TFTP 服务器 | 41 |
| IMAP 服务器 | 6 |
| 防火墙 | 48 |
总共测试了 ( \binom{293}{2} = 42,778 ) 对软件应用。
4. 跨类别通用攻击面实验结果
将提出的两个通用攻击面指标应用于 42,778 对现实世界软件。
- 通用攻击面的存在性 :通过将 CASFinder 报告的通用攻击面绝对值按软件大小进行归一化,结果表明所有类别组合中都存在通用攻击面。例如,DB 类别在其自身类别内的通用攻击面水平最高,为 27.9%,并且与其他任何类别共享的通用攻击面都超过 9%。
- 具体趋势分析 :
- 累积软件应用对与通用攻击面关系 :在绝对通用攻击面值方面,累积的软件应用对数在通用攻击面值达到约 12 之前迅速增加,之后趋于平缓。约 20% 的软件共享通用克隆段,56% 的克隆段至少包含一个通用攻击面。
- 通用攻击面与软件大小关系 :随着软件大小的增加,通用攻击面的值通常会增加,这是因为 I/O 函数的数量大致与软件大小成正比。
- 通用攻击面随时间变化趋势 :平均通用攻击面值随时间呈现明显的下降趋势,2010 年左右发布的软件的通用攻击面值比近年来发布的软件高得多,这表明代码复用在通用攻击面中起着重要作用。
- 概率通用攻击面指标与软件大小关系 :概率通用攻击面指标的值随着软件应用中 I/O 函数数量的增加而下降,因为 I/O 函数数量的增加速度快于通用攻击面的增加速度。
这些结果与现有的漏洞发现模型相匹配,通常较大的软件应用有更多的漏洞,但单位软件大小的漏洞概率较低。例如,Google Chrome(代码行数为 14,137,145)在九年中有 1,453 个漏洞,而 Apache(代码行数为 1,800,402)在 19 年中有 815 个漏洞,但 Chrome 单位软件大小每年的漏洞概率为 ( 1.15 \times 10^{-3}\% ),Apache 为 ( 2.4 \times 10^{-3}\% )。
graph LR
A[实验数据集] --> B[跨类别通用攻击面实验]
B --> C[通用攻击面存在性分析]
B --> D[具体趋势分析]
D --> D1[累积软件应用对与通用攻击面关系]
D --> D2[通用攻击面与软件大小关系]
D --> D3[通用攻击面随时间变化趋势]
D --> D4[概率通用攻击面指标与软件大小关系]
5. 同一类别内通用攻击面实验结果
研究同一类别内软件之间的通用攻击面趋势:
- 与软件大小的关系 :以 WebServer 和 FTP 类别为例,两个类别内的通用攻击面趋势都随软件大小增加而增加,与跨类别结果趋势相似。但 WebServer 类别的趋势增长速度比跨类别趋势快,而 FTP 类别的趋势增长速度比跨类别趋势稍慢,这可能是因为 FTP 与 WebServer 和 TFTP 共享大量的通用攻击面。
- 随时间变化趋势 :同一类别内的通用攻击面值比跨类别结果更高。概率通用攻击面指标与软件大小的关系趋势与跨类别结果相似,但同一类别内的趋势从约 0.20 开始,而跨类别指标从 0.06 开始。
6. 相关工作
在克隆代码检测方面,有多种方法和工具:
- 基于文本的克隆检测 :如 Dup 工具,如果两行代码在去除所有空格和注释后相同,则被视为克隆代码,输出最长的行匹配结果,且可根据不同需求定制报告代码的最小长度。还有通过应用指纹识别来识别源代码子字符串冗余的方法,使用 KARP - Rabins 字符串匹配方法计算所有 ( n ) 子字符串的长度。Ducasse 开发的 duploc 是一种无需解析、独立于语言的工具,它先读取源文件和行序列,去除所有注释和空格创建一组压缩行,然后根据哈希结果进行比较,通过散点图可视化克隆结果。
- 基于令牌的克隆检测 :代表性工具如 CCFinder,检测过程是先对源代码进行令牌化,然后使用后缀树算法比较令牌。Bakers Dup 实现了类似的方法,但不应用转换,而是一致地重命名标识符。Raimar Falke 开发的 iclones 使用后缀树在抽象语法树中查找克隆,可在线性时间和空间内操作。CP - Miner 使用频繁子序列挖掘算法检测令牌化段,RTF 使用字符串算法进行高效检测,采用更节省内存的后缀数组。
- 基于 AST 的克隆检测 :如 Baxter 开发的 CloneDR 可通过应用哈希和动态算法检测精确和近似克隆。Bauhaus 开发的 ccdiml 在处理哈希和代码序列方面与 CloneDR 类似,但在比较过程中应用 IML 算法。
- 基于 PDG 的克隆检测 :如 Komondoor 和 Horwit 提出的 PDG - DUP 等工具,能识别克隆并保留源代码的语义以反映软件。
- 基于指标的克隆检测 :Mayrand 等人使用 Darix 工具生成指标,克隆识别基于名称、布局、表达式和控制流四个值。Kontogiannis 使用马尔可夫模型通过应用抽象模式匹配计算代码的不相似度。还有一些方法应用混合克隆检测,如使用后缀树在 AST 中查找克隆。
攻击面的概念最初是为特定软件(如 Windows)提出的,需要特定领域的专业知识来制定和实施。后来,该概念通过形式化模型得到推广,适用于所有软件,并进一步细化应用于大规模软件,其计算可借助自动生成的调用图辅助。攻击面多年来受到了广泛关注,被用作评估 Android 消息传递系统、内核跟踪的指标,也是移动目标防御的基础,旨在随时间改变攻击面,使攻击者的工作更加困难。此外,还有研究致力于自动化攻击面的计算,如 COPES 使用字节码的静态分析来计算攻击面并保护基于权限的软件,利用用户崩溃报告的堆栈跟踪自动近似攻击面。
CASFinder:检测软件通用攻击面
7. 克隆检测方法对比
为了更清晰地了解各种克隆检测方法的特点,下面对不同类型的克隆检测工具进行详细对比:
| 检测类型 | 工具名称 | 特点 |
| ---- | ---- | ---- |
| 基于文本 | Dup | 去除空格和注释后判断代码是否相同,可定制报告代码最小长度 |
| 基于文本 | 指纹识别法 | 使用 KARP - Rabins 方法计算子字符串长度识别冗余 |
| 基于文本 | duploc | 无需解析、语言独立,通过哈希结果比较并可视化 |
| 基于令牌 | CCFinder | 先令牌化,用后缀树算法比较令牌 |
| 基于令牌 | Bakers Dup | 类似 CCFinder,但不转换,重命名标识符 |
| 基于令牌 | iclones | 用后缀树在抽象语法树中查找克隆,线性时空操作 |
| 基于令牌 | CP - Miner | 使用频繁子序列挖掘算法检测令牌化段 |
| 基于令牌 | RTF | 使用字符串算法和后缀数组高效检测 |
| 基于 AST | CloneDR | 通过哈希和动态算法检测精确和近似克隆 |
| 基于 AST | ccdiml | 处理哈希和代码序列类似 CloneDR,用 IML 算法比较 |
| 基于 PDG | PDG - DUP | 识别克隆并保留源代码语义 |
| 基于指标 | Darix | 基于名称、布局、表达式和控制流四个值识别克隆 |
| 基于指标 | Kontogiannis 方法 | 用马尔可夫模型计算代码不相似度 |
从这个表格可以看出,不同的克隆检测方法各有优劣。基于文本的方法简单直接,但可能不够精确;基于令牌的方法在处理代码结构上更有优势;基于 AST 和 PDG 的方法能更好地保留代码语义;基于指标的方法则从不同的维度对代码进行评估。
8. 攻击面概念的发展与应用
攻击面概念的发展历程可以用以下流程图表示:
graph LR
A[特定软件(如 Windows)] --> B[形式化模型推广]
B --> C[适用于所有软件]
C --> D[细化应用于大规模软件]
D --> E[借助自动生成调用图计算]
E --> F[多领域应用]
F --> F1[评估 Android 消息传递系统]
F --> F2[内核跟踪]
F --> F3[移动目标防御]
F --> F4[自动化计算研究]
攻击面概念最初是针对特定软件提出的,需要专业领域知识来实施。随着技术的发展,通过形式化模型将其推广到所有软件,并进一步细化应用于大规模软件。在计算方面,借助自动生成的调用图辅助,使得攻击面的计算更加高效。
在应用领域,攻击面发挥了重要作用。它被用作评估 Android 消息传递系统的指标,帮助开发者了解系统的安全性。在内核跟踪中,攻击面的概念有助于发现潜在的安全风险。在移动目标防御中,通过不断改变攻击面,增加攻击者的攻击难度。同时,关于攻击面自动化计算的研究也在不断推进,如 COPES 使用字节码的静态分析来计算攻击面,利用用户崩溃报告的堆栈跟踪自动近似攻击面。
9. 实验结果总结与启示
综合上述实验结果,我们可以总结出以下几点:
- 通用攻击面普遍存在 :无论是跨类别还是同一类别内的软件应用,都存在一定程度的通用攻击面。这表明在软件开发过程中,代码复用是一个普遍现象,但也带来了安全隐患。
- 软件大小与通用攻击面关系 :软件大小与通用攻击面呈正相关,较大的软件通常有更多的 I/O 函数,从而可能存在更多的通用攻击面。但单位软件大小的漏洞概率较低,这提示开发者在开发大型软件时,要更加注重整体的安全设计。
- 代码复用影响通用攻击面 :平均通用攻击面值随时间下降,说明代码复用在通用攻击面中起着重要作用。开发者应该谨慎复用代码,尤其是旧代码,避免引入潜在的安全漏洞。
- 不同类别软件特点 :不同类别的软件在通用攻击面的表现上有所不同。例如,WebServer 类别的通用攻击面增长速度较快,而 FTP 类别与其他类别共享大量通用攻击面。开发者可以根据不同类别的特点,有针对性地进行安全防护。
对于软件开发者和安全管理员来说,这些结果具有重要的启示意义。开发者在开发过程中应尽量减少不必要的代码复用,加强对代码的安全审查。安全管理员可以利用 CASFinder 工具,定期评估软件应用的通用攻击面,及时发现潜在的安全风险,并采取相应的措施进行防范。
10. 未来研究方向展望
基于本次研究,未来可以从以下几个方面展开进一步的研究:
- 更精准的攻击面计算方法 :虽然现有的攻击面计算方法已经取得了一定的成果,但仍有提升的空间。可以研究更加精准的计算模型,考虑更多的因素,如代码的执行环境、用户行为等,以更准确地评估软件的攻击面。
- 跨语言的克隆检测 :随着软件开发中多语言的使用越来越普遍,开发跨语言的克隆检测工具具有重要意义。可以探索如何将不同语言的代码进行有效的比较和分析,发现其中的克隆代码和通用攻击面。
- 实时监测与预警系统 :开发实时监测软件攻击面的系统,当攻击面发生变化时及时发出预警。这样可以让安全管理员及时采取措施,应对潜在的安全威胁。
- 与其他安全技术的结合 :将攻击面分析与其他安全技术,如入侵检测、漏洞扫描等相结合,形成更加完善的安全防护体系。通过多种技术的协同作用,提高软件系统的安全性。
总之,软件通用攻击面的研究是一个不断发展的领域,未来还有许多工作值得深入探索,以保障软件系统的安全稳定运行。
CASFinder:检测软件通用攻击面
超级会员免费看
51

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



