当前,信息技术处于高速发展阶段,大量应用软件在丰富人们生活的同时,其中的源代码缺陷也会导致难以估量的安全风险。准确地检测出源代码中的可能含有的缺陷如敏感函数误用、恶意代码等,对于保证用户信息安全,防范黑客的恶意攻击具有重要意义。
深度学习已在多个领域如图像分类、目标跟踪、机器翻译等取得优异的成果,因此信息安全领域的众多研究者开始尝试应用深度学习算法来实现源代码的缺陷检测。而已有的基于深度学习的源代码缺陷检测方法中,所使用的训练数据和测试数据大多来源于仅供学术研究的测试源码如软件防护参考数据集(SARD)[1]、美国国家漏洞数据库(NVD)[2]等,缺少高质量的源码缺陷数据,无法为深度学习模型的训练提供足够的数据支撑。
本文提出了一种源代码缺陷检测数据生成及标注方法,包含源代码语义信息提取、切片数据预处理和数据标注3方面。语义信息提取是对源代码进行解析并生成代码属性图和控制流图;切片数据预处理是应用字符串检索或匹配算法来完成代码语句的整理和补全;切片数据标注是结合深度学习算法模型和商业工具实现源码切片标注。本方法能够生成直接用于深度学习的源代码缺陷检测数据集,为基于深度学习的源码缺陷检测提供了数据支撑。
1 相关工作现有的基于深度学习的源代码缺陷检测方法主要包括2部分:1) 源代码缺陷数据的生成;2) 设计深度学习算法来实现源代码缺陷检测。
1.1 源代码缺陷数据的生成在早期的源代码缺陷检测方法中,研究人员将每行源代码看作是字符或词碎片的组合,并采用检索-匹配的策略来实现缺陷代码的检测与定位,如代码克隆检测[3-6]、缺陷预测[7-9]、缺陷定位[10-11]等。然而,该类方法的缺点在于,源代码中复杂的句法信息和语义信息无法通过简单的词碎片组合来表达。因此,Büch等[12]尝试构建用于表征源代码信息的抽象语法树,并设计基于抽象语法树的递归神经网络来实现代码克隆检测。Dam等[13]则尝试在源代码文件的层次上构建抽象语法树,即每个源代码文件都有一个与之相对应的抽象语法树。由于基于源代码所生成的抽象语法树是一种对源码中多种句子信息、语义信息的集合,其结构较为庞杂,在应用深度学习算法进行特征提取时,容易造成重要语义信息的损失。因此,Allamanis等[14]应用图来表征源代码中的语法信息和语义信息。Harer等[15]则尝试在函数层次上进行源代码控制流图的构建。在这些研究中,源代码抽象语法树和图形表征主要用于源代码缺陷数据的生成,为源代码的缺陷检测提供训练数据。
1.2 基于深度学习的源代码缺陷检测Büch等[12]提出了基于抽象语法树(AST)的递归神经网络,用于源代码克隆检测。Zhang等[16]提出基于AST的双向循环神经网络来整合序列化的源代码特征。Harer等[15]在源代码缺陷分析过程中,同时应用了基于文本卷积神经网络模型(TextCNN-based)和传统机器学习领域的随机树算法。Li等[17]探索了利用双向长短时记忆网络(BiLSTM)来提取源码缺陷的模式,并将其应用于源代码缺陷分析。为了确定影响源代码缺陷检测的因素,Li等[18]比较了不同深度学习模型的缺陷检测效果,以及数据样本不均衡的影响等。
1.3 源代码缺陷检测数据集已有研究中所使用的源代码缺陷检测数据大多来自于NVD或SARD。
1) NVD。
NVD创建于2000年,以通用漏洞和风险(CVE)列表为基础,并与之完全同步。本质上,NVD是对已发布到CVE列表中的漏洞进行分析。因此,对于CVE列表中的任何更新,都能够立即在NVD中显示。
2) SARD。
SARD由美国国家标准与技术研究院(National Institute of Standards and Technology, NIST)发布,能够为研究者提供一些已知的软件安全缺陷,可用于源码缺陷检测模型的训练。SARD中的源代码主要包括三大类别:1) “good”程序,表示其中的源代码不包含漏洞;2) “bad”程序,表示其中的源代码含有漏洞;3) “mixed”,表示相关源码中不仅包含漏洞,同时也含有相应的补丁程序。已有研究[17, 19]中所使用的源代码切片数据大多来自于SARD。
2 源代码缺陷检测数据生成及标注方法本文提出的源代码缺陷检测数据生成及标注方法如图 1所示。
|
| 图 1 基于控制流的源代码缺陷检测数据生成及标注方法示意图 |
2.1 源代码语义信息提取
本文采用开源工具Joern[20]对C/C++源代码进行解析,并将生成的代码属性图存储在高性能图形数据库Neo4j中。代码属性图是一种新颖的联合数据结构,同时将抽象语法树、数据流图和控制流图进行了整合。基于已生成的代码属性图,即可提取对应于源码中各个函数的控制流图,如图 2所示。
|
| 图 2 (网络版彩图)源代码控制流关系示意图 |
2.2 切片数据预处理
在源文件中,由于书写规范不同,较长的代码会被写成多行,而所生成的切片中同样会保留这种情况,如图 3a中红色部分所示。在代码向量化过程中,该问题的存在会导致添加部分噪声信息。因此,本文主要通过图 4的算法1来解决上述问题,处理后的切片数据如图 3b所示。
|
| 图 3 (网络版彩图)源代码切片数据预处理 |
|
| 图 4 切片数据预处理算法 |
通过对比图 3a和3b不难发现,算法1能够较好地解决代码行号缺失的问题。需要注意的是,本文对预处理后的所有源码切片已进行随机确认,所有多行书写的代码语句均被整合成单行代码,实现了代码行号的添加。
2.3 切片数据标注源代码切片数据的标注同时依赖于已训练的深度学习算法模型和商业源代码缺陷检测工具如checkmarx等。本文中所使用的源代码数据主要分为2类:已知是否含有缺陷的SARD、NVD数据;未知是否含有缺陷的其他真实源码。
图 5中,这2类源代码在语义信息提取和切片数据清洗后,均会生成无标签的源代码切片数据。但是,在标注切片数据的缺陷时两者有所区别:
|
| 图 5 源代码切片数据标注示意图 |
1) SARD、NVD的数据是否含有缺陷是已知的,由此可提取源码切片数据的标签集(缺陷、非缺陷、CWE信息等),与无标签切片数据共同构成源代码缺陷切片数据集;该源代码缺陷切片数据集将用于深度学习算法模型的训练和测试。
2) 其他真实源码是否含有缺陷则通过已训练的深度学习算法模型和商业源代码缺陷检测工具进行判断。一方面,将真实源码的无标签切片数据输入到已训练的深度学习算法模型中,得到缺陷预测结果;另一方面,使用商业工具直接对真实源码进行缺陷检测,得到缺陷检测结果。最后,对预测结果和检测结果进行综合分析,即可判断真实源码是否含有缺陷,生成标签集;该标签集与真实源码的无标签切片数据相结合,共同构成新的源代码缺陷切片数据。该方法在实现切片数据标注的同时,能够对源代码缺陷切片数据集进行增量更新。
3 实验分析采用本文方法进行源码缺陷数据集的生成,真实源码包括Ffmpeg、Domoticz智能家居系统等。涉及的源代码语言类型为C/C++。商业的源代码缺陷检测工具为Checkmarx,已训练的深度学习算法模型为TextCNN、LSTM等。
生成的源代码切片数据包括4种:敏感API调用、指针语句、数组语句、敏感表达式语句[17],如表 1所示。对于不同的源代码数据,均会生成上述4种切片数据。
| 源代码 | 敏感API | 数组 | 指针 | 表达式 |
| SARD | 192 347 | 27 227 | 97 695 | 3 422 |
| NVD | 4 553 | 3 354 | 15 206 | 2 582 |
| Ffmpeg | 6 809 | 12 149 | 41 454 | 13 990 |
| Domoticz | 4 718 | 1 900 | 1 089 | 442 |
表 1中4种源码切片数据相互独立,能够直接汇总并用于基于深度学习的源代码缺陷检测方法的训练。表 2为应用商业工具和深度学习模型进行切片数据标注的结果,目前已标注的数据样本仍在持续增加。
| 数据标注 | SARD | NVD | Ffmpeg | Domoticz | 总计 |
| 缺陷样本 | 173 321 | 4 792 | 6 487 | 3 836 | 188 436 |
| 非缺陷样本 | 147 470 | 5 808 | 6 809 | 4 313 | 164 400 |
实验结果表明,本文所提出的源代码缺陷数据集生成方法具有多个优势:1) 在源代码切片数据的生成方面,无需搭建源代码执行所需的编译环境,增强了该方法的使用范围;2) 在源代码切片数据的标注方面,结合了商业工具和基于深度学习的源代码缺陷检测方法的优势,降低了标注的误差;3)在源代码切片数据的使用方面,通过该方法能够生成大量的源代码切片数据,为基于深度学习的源代码缺陷检测方法提供数据支撑。
本文所提出的方法仍有不足之处:在提取源代码的语义信息时,未提取源代码文件间的源代码控制流关系和数据流关系;由于未对源代码进行编译,也无法获知二进制代码的控制流信息和数据流信息是否有助于源代码缺陷位置的准确定位。
4 结语本文提出了一种源代码缺陷检测数据生成及标注方法,实现了C/C++源代码的语义信息提取、切片数据预处理及切片数据标注。使用该方法在公开数据集SARD、NVD及真实源码Ffmpeg和Domoticz上进行切片生成及标注,结果表明该方法能够在一定程度上解决当前研究中缺少适用于深度学习的源码缺陷数据集的问题,对于实际的源代码检测具有重要的应用价值。下一步,将详细分析不同深度学习算法的应用场景。
| [1] |
National Institute of Standards and Technology. Software assurance reference dataset [DB/OL]. [2020-08-15]. https://samate.nist.gov/SRD/index.php.
|
| [2] |
National Institute of Standards and Technology. National vulnerability database [DB/OL]. [2020-08-15]. https://nvd.nist.gov/.
|
| [3] |
KAMIYA T, KUSUMOTO S, INOUE K. Ccfinder: A multilinguistic token-based code clone detection system for large scale source code[J]. IEEE Transactions on Software Engineering, 2002, 28(7): 654-670. DOI:10.1109/TSE.2002.1019480 |
| [4] |
WHITE M, TUFANO M, VENDOME C, et al. Deep learning code fragments for code clone detection [C]//2016 31st IEEE/ACM International Conference on Automated Software Engineering. Singapore: IEEE, 2016: 87-98.
|
| [5] |
SAJNANI H, SAINI V, SVAJLENKO J, et al. Sourcerercc: Scaling code clone detection to big-code [C]//Proceedings of the 38th International Conference on Software Engineering. New York, NY, USA: IEEE, 2016: 1157-1168.
|
| [6] |
WEI H H, LI M. Supervised deep features for software functional clone detection by exploiting lexical and syntactical information in source code [C]//Proceedings of the Twenty-Sixth International Joint Conference on Artificial Intelligence. Melbourne, Australia: Elsevier, 2017: 3034-3040.
|
| [7] |
TANTITHAMTHAVORN C, MCINTOSH S, HASSAN A E, et al. An empirical comparison of model validation techniques for defect prediction models[J]. IEEE Transactions on Software Engineering, 2017, 43(1): 1-18. |
| [8] |
D'AMBROS M, LANZA M, ROBBES R. Evaluating defect prediction approaches: A benchmark and an extensive comparison[J]. Empirical Software Engineering, 2012, 17(4): 531-577. |
| [9] |
王晓萌, 张涛, 辛伟, 等. 深度学习源代码缺陷检测方法[J]. 北京理工大学学报, 2019, 39: 1155-1159. WANG X M, ZHANG T, XIN W, et al. Source code defect detection based on deep learning[J]. Transactions of Beijing Institute of Technology, 2019, 39: 1155-1159. (in Chinese) |
| [10] |
ZHOU J, ZHANG H, LO D. Where should the bugs be fixed? More accurate information retrieval-based bug localization based on bug reports [C]//2012 34th International Conference on Software Engineering. Zurich, Switzerland, IEEE, 2012: 14-24.
|
| [11] |
曲泷玉, 贾依真, 郝永乐. 结合CNN和文本语义的漏洞自动分类方法[J]. 北京理工大学学报, 2019, 39: 738-742. QU L Y, JIA Y Z, HAO Y L. Automatic classification of vulnerabilities based on CNN and Text semantics[J]. Transactions of Beijing Institute of Technology, 2019, 39: 738-742. (in Chinese) |
| [12] |
BUCH L, ANDRZEJAK A. Learning-based recursive aggregation of abstract syntax trees for code clone detection [C]//2019 IEEE 26th International Conference on Software Analysis, Evolution and Reengineering. Hangzhou, China: IEEE, 2019: 95-104.
|
| [13] |
DAM H K, PHAM T, NG S W, et al. A deep tree-based model for software defect prediction [Z/OL]. (2018-02-03). https://arxiv.org/abs/1802.00921.
|
| [14] |
ALLAMANIS M, BROCKSCHMIDT M, KHADEMI M. Learning to represent programs with graphs [C/OL]. ICLR 2018. (2018-05-04). https://arxiv.org/abs/1711.00740.
|
| [15] |
HARER J A, KIM L Y, RUSSELL R, et al. Automated software vulnerability detection with machine learning [Z/OL]. (2018-08-02). https://arxiv.org/abs/1803.04497.
|
| [16] |
ZHANG J, WANG X, ZHANG H, et al. A novel neural source code representation based on abstract syntax tree [C]//Proceedings of the 41st International Conference on Software Engineering. Montreal, QC, Canada: IEEE, 2019: 783-794.
|
| [17] |
LI Z, ZOU D, XU S, et al. Sysevr: A framework for using deep learning to detect software vulnerabilities [Z/OL]. (2018-09-21). https://arxiv.org/abs/1807.06756.
|
| [18] |
LI Z, ZOU D, TANG J, et al. A comparative study of deep learning-based vulnerability detection system[J]. IEEE Access, 2019, 7: 103184-103197. DOI:10.1109/ACCESS.2019.2930578 |
| [19] |
LI Z, ZOU D, XU S, et al. Vuldeepecker: A deep learning-based system for vulnerability detection [Z/OL]. (2018-01-05). https://arxiv.org/abs/1801.01681.
|
| [20] |
YAMAGUCHI F, GOLDE N, ARP D, et al. Modeling and discovering vulnerabilities with code property graphs [C]//2014 IEEE Symposium on Security and Privacy. Berkeley, CA, USA: IEEE Computer Society, 2014: 590-604.
|


