爆资讯爆资讯爆资讯

C++源代码漏洞静态扫描系统

C++源代码漏洞静态扫描系统

1. 项目意义

C++是目前最流行的编程语言之一,在浏览器、游戏引擎等大型软件中广泛使用。C++源代码漏洞静态扫描是指在不运行程序的情况下,使用语法分析、数据流分析等技术挖掘 C++源代码中潜在的漏洞。漏洞静态扫描技术具有低时间成本、全代码覆盖、无编译依赖、高可扩展性等优点,因此被开发者广泛采纳。随着软件规模变大、复杂度变高,静态扫描系统会忽略控制流、上下文来提升扫描效率,并保证漏报率在可接受范围内,但这样做会导致漏洞报告中误报数量增多,开发者审核报告成本提升,降低了静态扫描系统可用性。

对于开发者而言,在使用 C++源代码漏洞静态扫描系统时,面对包含大量误报的漏洞报告,审核漏洞会消耗大量时间,甚至会因为无法发现真实漏洞失去耐心,放弃使用扫描系统。但是软件中依然存在真实漏洞,虽然真实漏洞数量较少,但是危害性高,不及时解决会被恶意开发者利用,造成巨大的经济损失。为改善开发者漏洞审核流程,降低漏洞审核难度,本文实现了低误报率的 C++源代码漏洞静态扫描系统来协助开发者交付更健壮的代码。

2. 项目内容

为向用户提供低误报率的 C++源代码漏洞静态扫描服务,本系统使用代码分析技术提取语法和语义信息,特征工程技术提取语法和语义特征,机器学习技术过滤漏洞报告中的误报。误报漏洞过滤本质上属于机器学习领域中的二分类问题,因此将机器学习技术应用到误报过滤是可行的。如图 1 所示,该系统从功能上分为四个主要模块。漏洞扫描模块使用多个开源工具对源码进行扫描,将漏洞报告映射到 CWE 漏洞数据库并融合漏洞报告。特征提取模块对漏洞代码进行代码表示,并使用特征提取技术提取漏洞代码的语法和语义特征。误报过滤模块使用由带标签漏洞数据结合 DNN 模型训练得到的误报过滤器,对漏洞报告进行误报过滤,获取过滤后漏洞报告。审核反馈模块使用相似度算法搜索漏洞专家审核出的误报漏洞,并用相似漏洞再训练误报过滤器,提升误报过滤准确率。

C++源代码漏洞静态扫描系统

图 1 系统架构图

漏洞扫描模块。此阶段,获取到用户上传的待扫描 C++项目后,系统会进行格式检查,判断项目中的 C++文件格式是否符合 C99 标准,并对符合标准的源代码文件进行漏洞扫描。系统使用开源工具 Cppcheck 和 TscanCode 进行漏洞扫描,并将两款扫描工具输出的漏洞报告进行融合。因为两款扫描工具没有参照统一的标准,在融合之前需要先将漏洞报告映射到统一的标准。本系统选择映射到 CWE 漏洞数据集,是因为该数据集漏洞覆盖率高且使用广泛。具体融合方法如下,Cppcheck 漏洞项包含对应到 CWE 漏洞项的 ID,直接进行映射即可,而 TscanCode 漏洞项需要进行人工匹配,将每一个漏洞项映射到 CWE 漏洞数据项,该匹配在系统研发时完成。同时对相同位置的相同漏洞项去重,获取融合漏洞报告。

特征提取模块。此阶段,系统对融合漏洞报告中的漏洞代码进行后向程序切片,切片起点为漏洞代码行,终点为函数入口。程序切片首先通过 C++代码分析工具 Joern 提取漏洞函数的 CFG(控制流图)和 DFG(数据流图),然后从漏洞代码行对应节点开始,遍历 CFG 和 DFG,去除与漏洞代码行无数据流关联节点,最终获取切片代码。对于语法特征,系统首先使用 Joern 获取切片代码 AST(抽象语法树),并先序遍历 AST 获取标识符序列,接着使用 Word2Vec 进行词嵌入获取标识符对应特征向量,最后进行平均池化获取切片代码语法特征向量。对于语义特征,使用 Graph2Vec 对 CFG 进行图嵌入,获取切片代码语义特征向量。不同漏洞的切片代码长度可能不一样,但是对应的语法和语义特征向量均为系统设置固定长度,便于训练误报过滤模型。

误报过滤模块。此阶段,系统训练误报过滤器。Juliet 是一个用 C++语言编写的测试用例集合,它包含 118 类 CWE 漏洞示例代码,64099 个独立测试用例。本系统使用 70%数据进行模型训练。首先,系统对 Juliet 数据集进行漏洞扫描,获取漏洞报告,并根据数据标签将漏洞报告中的漏洞项判定为正报和误报。接着,系统对漏洞项进行特征提取,提取每一个漏洞项对应的语法特征和语义特征向量。然后,系统将漏洞项的语法和语义特征向量以及正报或误报标签作为训练集,用于 DNN 模型训练。最后,系统将训练得到的误报过滤模型存入到 MongoDB,进行持久化存储。之后对漏洞报告进行误报过滤时,只需要提取切片代码对应的语法和语义特征向量,即可使用已有的误报过滤模型进行误报过滤。

审核反馈模块。此阶段,系统进行相似漏洞搜索,以及误报过滤模型反馈训练。漏洞专家审核准确率很高,但是相比于漏洞静态扫描技术存在扫描效率低、经济成本高的不足。系统从每一种漏洞类型中随机选择部分漏洞,并交给漏洞专家进行人工审核。对于漏洞专家审核出来的误报漏洞,使用相似度算法搜索与误报漏洞相似的漏洞,并将其标记为误报。这里的相似度算法和现有算法不同,该算法使用漏洞代码对应的语法和语义特征作为相似性分类模型的输入,将相似度计算问题转化为机器学习中的二分类问题。该模型使用 OJClone 数据集进行训练,数据集包含 103 份克隆代码,。使用相似度算法搜索相似漏洞,将这些漏洞数据作为误报过滤模型输入,进行误报过滤模型再训练。

3. 项目效益

通过上述步骤,用户在开发 C++项目时对源代码进行漏洞静态扫描,系统提取 AST 和 CFG 代码表示,并使用词嵌入和图嵌入技术获取语法和语义特征向量,接着使用误报过滤器进行误报过滤,将过滤后的漏洞报告返回给用户。用户还可以选择发布专家审核,漏洞专家审核出漏洞报告中的误报漏洞,接着系统使用相似度算法搜索误报相似漏洞,并进行标记,最后将该漏洞报告返回给用户。

为了验证系统提出基于机器学习的迭代反馈式误报过滤机制的有效性,对模型训练剩余 30%的 Juliet 数据集进行漏洞静态扫描,分析扫描结果验证系统有效性。实验在一台 Ubuntu 18.04 64 位操作系统,8G 内存服务器进行。如图 2 所示,本文提出方法应用于漏洞静态扫描,从结果来看相比开源工具 Cppcheck 和 TscanCode,在 precision 上提升了超过 20%,同时 recall 值也未降低很多,并且 F1 值也提升了 22%。因此本文提出的方法对于降低误报率是有效的。为验证迭代反馈有效性,首先系统选择 CWE476 空指针解引用进行专家审核,审核出 8 个误报。接着,系统使用相似度算法搜索到 11 个相似漏洞,经专家审核确为误报。最后,系统使用扩增数据进行误报过滤模型再训练,经验证新模型可以过滤这些误报。因此,本文提出的迭代反馈机制是有效的。

C++源代码漏洞静态扫描系统

图 2 漏洞扫描结果对比统计图

本系统已正式投入使用。本系统通过特征提取和机器学习技术,将误报漏洞过滤问题转换为分类问题,通过学习漏洞代码特征,训练误报过滤模型,并结合专家审核和相似度算法持续提升模型准确率。该系统提高了 C++源代码漏洞静态扫描器的可用性,减少了误报数量,减轻了开发者审核漏洞负担,为交付高可靠的代码提供保障。

致谢

本文由南京大学软件学院智能软件工程实验室 2018 级硕士生史洋洋撰写。

感谢国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)和中央高校基本科研业务费专项资金资助项目:基于群智协同的众包测试技术(14380021)支持!

未经允许不得转载:爆资讯 » C++源代码漏洞静态扫描系统

相关推荐