代码审计的技术变革和应用实践
随着软件应用的广度和深度不断加大,软件在金融、能源、汽车电子、军工、通讯、零售、政务等领域,已经成为重要的基础设施。因此,软件安全问题也正在成为重要的基础性问题。随着安全左移的概念日渐深入,从源头降低安全风险成为业界共识。软件源代码缺陷检测和漏洞挖掘是实施安全左移的重要工具,受到学术、企业界的关注,成为研究热点。
软件的高复杂性、多样性给软件缺陷检测和漏洞挖掘带来了挑战,现有的方法法由于存在高误报率和高漏报率的问题,已无法满足复杂软件的安全性分析需求。近年来,随着人工智能产业的兴起,特别是以ChatGPT为代表的通用人工智能的出现,给软件缺陷检测和漏洞挖掘带来新的机遇。
软件缺陷检测从技术路线看,分为基于规则的检测、基于机器学习的检测和基于大模型的检测。从运行模式上看, 软件缺陷检测技术可划分为静态分析方法与动态分析方法。静态分析方法无需运行软件, 而是通过扫描源代码分析词法、语法、控制流和数据流等信息来发现缺陷,静态分析技术主要包括基于规则的分析技术、二进制对比技术、静态符号执行技术和静态污点分析技术等; 动态分析方法在软件程序运行过程中, 通过分析动态调试器中程序的状态发现软件缺陷,动态分析技术主要包括模糊测试、动态符号执行技术和动态污点分析技术等。
下面从技术路线演变,探讨软件缺陷检测的机遇和挑战。
(1)从理论模型视角看,现有规则引擎工具的高误报问题难以解决,本质原因是软件缺陷的高复杂性难以通过静态的形式化规则完全描述。
传统的规则引擎是目前产品普遍采用的工具。它基于事先定义的规则集来检测潜在的漏洞。这些规则由安全专家编写,用于检测已知的漏洞模式。规则引擎会扫描程序的源代码或二进制文件,寻找与已定义规则匹配的模式。一旦发现匹配,就会触发警报或报告漏洞。
从人工智能的发展阶段看,规则是领域专家经验总结,是计算机能够理解的形式化表达,事实上,大量的专家系统都是基于规则实现的,现有的软件缺陷检测规则引擎本质上也是安全专家的经验。然而,从图像、智能问答等众多领域的发展证明,规则难以完备性的描述复杂系统的多样性,规则引擎的高误报问题难以解决。举个例子,我们甚至很难用完备性的规则去描述猫和狗的区别(猫和狗的多样性品种导致形态上的巨大差异),从而让计算机能够识别哪一张图片是猫或者狗。
在现有软件缺陷检测中,一般会出现30%以上的误报,此时只能通过专家修改规则来降低误报率,但是由此可能增加新的漏报。随着软件的复杂度和多样性的增加,安全漏洞的种类也不断发展,编写和维护规则集变得困难,且人的主观性会影响误报率和漏报率,这就大幅度降低了工作效率,也是目前企业反馈的焦点。
在动态分析方法中,不仅存在测试冗余、测试攻击面模糊、难以发现访问控制漏洞和设计逻辑错误,还存在路径爆炸、约束求解难等问题,在大型复杂软件系统检测中面临困难。
综上,虽然基于规则引擎的软件漏洞检测是现在产品的主流技术方案,但是存在的高误报和高漏报问题难以在现有的模型基础上克服和解决。
(2)数据驱动的机器学习算法,大幅度提升了软件缺陷检测效率,实现了标准集的高准确率,但是大规模训练数据集仍然是个挑战。
针对复杂软件系统的缺陷检测问题,学术界和工业界开始探索新的智能化软件缺陷检测方法。在图像识别、决策场景已经证明:如果有大量的数据,可以不通过规则,而是通过机器学习算法从海量数据中发现和学习规律。软件缺陷检测被抽象成一个基于数据驱动的多分类问题,以逻辑回归、朴素贝叶斯、随机森林、SVM等为代表的传统机器学习模型开始应用到软件漏洞挖掘。随着深度学习理论在图像识别领域的成功应用,软件缺陷检测模型逐步开始研究基于深度学习的漏洞挖掘方法。
深度学习技术通过构建多样性的神经网络对数据进行训练,使得能够更加自动化和智能化地从复杂数据中提取有效特征信息,以提高软件安全漏洞挖掘的准确率,降低漏洞的误报率和漏报率。基于深度学习的软件缺陷检测包括软件代码表征、模型学习等多个阶段。大量的论文重点研究了代码数据表征,即需要将软件程序数据集解析为合适的表示结构用于模型训练。在模型学习阶段,该部分需要将从数据表征模块抽象出的代码表征映射为向量形式,从而作为训练模型的输入。在多次训练过程中不断调整和优化模型参数,得到一个性能较优的漏洞挖掘模型,并应用于真实数据检测阶段。
虽然基于深度学习的软件缺陷检测在Benchmark上达到了很好的效果,但是由于缺乏像图像领域的大规模标准数据集,基于深度学习的代码漏洞检测模型的泛化能力仍然不高,在标准数据机上训练可以得到超狗90%的准确率,但是换一个数据集,可能准确率大幅度下降。
(3)通用代码大模型提升了软件缺陷检测的智能化水平,是新视角,但是难以解决落地应用最后一公里的问题。
以Chatgpt为代表的大语言模型,成为通用型人工智能新的曙光。从理论模型看,编程语言是连接信息世界和现实世界的桥梁,编程语言和自然语言具有非常相似的统计学特性,甚至编程语言更加具有一定的结构化。所以经过大规模的代码训练,现有的大语言模型也具备了漏洞检测的能力,大量的论文对现有大语言模型在漏洞检测领域进行了评测,探讨大模型在漏洞检测的能力和边界,通用大模型基于开源代码训练,具备了漏洞检测的能力,但是,大语言模型也有缺陷,包括需要较高的算力、Token限制带来的性能约束、准确率不高、复杂漏洞检测检测困难等,带来了新的挑战。通用大模型的漏洞检测的准确率不能满足现有代码审计的要求。
根据《Is GitHub's Copilot as Bad as Humans atIntroducing Vulnerabilities in Code?Aug., 2023)》的论文结果,发现在很多漏洞类型检测准确率不到30%。我们对现有的通用大模型进行了详细的测试,发现现有的通用大模型对代码检测性能较低,包括CWE732、CWE79、CWE20等,并且检测时间较长,平均每个代码文件的检测时长超过30秒,所有通用大模型不能直接用于生产线的代码漏洞检测。
(4)代码专用大模型是实现落地应用的关键
从大模型的落地路径看,针对企业级的细分场景应用,不需要追求千亿级参数的大模型,而是需要具有针对性、高效、适配场景的“小模型”,解决实际问题。基于这一视角,软件缺陷检测需要新一代的技术路线,构建数据驱动、效能优先、兼具泛化性的合适参数规模的“代码安全模型”。我们研发了AISecurity模型,通过新的架构训练软件缺陷检测和修复一体化模型,具备参数规模适中、高准确率、低误报、自动修复、高效率等特点,在公开数据集上取得了较好的效果。
(5)数据源头安全是代码大模型的关键
现有的开源数据集本身包含漏洞,所以训练得到的大模型也很难识别漏洞,AISecurity基于无漏洞的海量代码进行训练,确保源头安全,从而保障了模型安全。事实上,不像图像领域的标签,可以通过低成本方式获得,代码漏洞的专业性导致人工大规模标记的成本很高,我们采用新了对齐方式,即训练一个小模型来对齐大模型,不断提升大模型的准确性。
(6)专用“小模型”实现代码安全检测的高性能
为了提供代码安全检测的效能,需要设计高性能的小模型,通过高质量数据+合适参数实现代码检测的高性能。AISecurity支持高性能代码安全检测,可以部署在消费级显卡上。
综上,大模型时代给软件缺陷检测带来了新的机遇和挑战,基于大模型的代码安全正在逐步落地,AISecurity已经在多个证券、银行落地应用,推动了软件安全大模型的实践。
本文是武汉市教云慧智信息技术有限公司投稿文章。