ChatGPT人工智能繁荣背后的基础技术「深度学习」如何应用于网络安全

CertiK
CertiK 机构得得号

Mar 15, 2023 CertiK 专注于区块链安全,被称为区块链安全世界的「普华永道」。

摘要: 我们将对当前深度学习在安全软件方面的应用现状进行梳理和回顾。

ChatGPT话题热度一飞冲天,想必小伙伴们也都尝试了一波人工智能对话。如ChatGPT这种人工智能驱动的工具,在软件开发界引起了很大的关注。这些工具有很多应用,其中包括针对Web3.0平台和智能合约安全的应用。

此前,我们已经总结过了程序功能,同时也探讨了AI帮助发现代码漏洞来改善审计过程的潜力。

详情请见以往文章:《ChatGPT的Web3.0安全审计艺术:有点东西,但是……》

作为机器学习(Machine Learning)的一个子集,ChatGPT和类似的模型使用了深度学习(Deep Learning )作为其基础技术。在过去十年中,深度学习作为提高软件安全的一种手段被广泛研究。

虽然使用像ChatGPT这样的“机器人”来剖析代码是提高软件安全的一种方法,但还有许多其他更值得研究和关注的方法可以应用于深度学习。

现今通过深度学习提高软件安全的研究刚刚起步,人们的态度和想法也才开始步入测试阶段。在本文中,我们将对当前深度学习在安全软件方面的应用现状进行梳理和回顾。

深度学习

深度学习是机器学习的一种类型,通过训练一个系统来识别数据中的模式。人们给该系统提供不同相应分类的一些输入(可以理解为灌输知识),让系统进行学习、识别并区分不同输入的模式(可以理解为让系统自己学习并进行分类)。

一旦经过训练,该系统就可以对它从未见过的数据输入进行分类。强大的模型可以识别数据中的复杂模式,包括定位bug或理解一些程序等。

软件安全技术

目前用来帮助保护程序安全的一些方法有:启发法、静态分析、形式化验证和模糊测试等方法。

启发法(Heuristics),是根据经验法则或基于经验的技术来识别不安全编码模式的方法。

常见的启发式算法包括避免使用不安全的函数、正确处理输入、避免使用硬编码密码以及在处理输入之前验证所有输入等,还可以使用在源代码和字节码层面进行静态代码分析的工具来检测代码错误。静态代码分析工具有能力找出易受攻击的代码模式,并创建可视化的表示,以帮助理解智能合约。随着时间的推移,这些工具的准确性和有效性也将随着存储风险的漏洞数据库内容增加而增强。

除了静态分析,CertiK会还对代码进行形式化验证,以确保其符合安全要求。形式化验证是一个数学过程,通过将程序属性和预期行为表达成为数学公式,并使用自动工具进行验证,以证明程序的功能符合预期。

模糊测试(Fuzzing),是一种用于软件测试的技术。测试过程是向程序中注入无效、非常规或任意数据,然后观察软件是否有任何崩溃及assertions failures,或由于这种输入而可能产生的潜在漏洞。

深度学习如何增强

传统软件安全

尽管目前的漏洞识别技术有其优势,但在进行大规模智能合约审计时,会遇到很多挑战。

例如,数据库的人工审计报告有6万多个曾被发现的代码漏洞,使用人工审查来对CertiK数据库中的漏洞进行分类显然是不可行的,除了bug的数量庞大之外,用于描述bug自然语言的多样性也会使传统的短语匹配变得无效。

除此之外,静态工具产生的一些风险必须由安全工程师手动检查,以消除误报并提高结果质量。

当静态工具将一个良性或非关键性的问题识别成为一个漏洞风险时,就会产生误报。通常情况下,误报会导致开发人员浪费时间和精力去调查和修复本不存在的问题。在某些情况下,误报也会导致某些漏洞风险被忽略,因为开发人员可能对工具产生的大量误报变得不敏感。

大型项目也给形式化验证带来了挑战。通常白皮书和设计文件是用来描述智能合约的功能或其应该做什么。但是从白皮书、设计文件和程序中提取出数学规则是一个困难且耗时的过程。此外,智能合约的复杂性也会导致大量的可能执行路径。而对于较庞大的系统,想要模糊测试所有可能的路径,几乎是不可能的。

由于目前技术的局限性,我们必须找到新的和更有效的方法来提高智能合约和程序的安全性,而深度学习则刚好可以部分解决现有漏洞检测技术相关的挑战。深度学习已经被应用于漏洞分类、规范推理、自动解析bug、预测程序属性、减少传统工具报告的误报数量,以及增强模糊处理。

现在我们将研究如何利用深度学习来改进一些现有的技术。

💻 代码分类

代码分类的目的是将代码片段分为不同类别。这种分类可以是对一段代码中存在的风险类型(如编码风格、逻辑问题、数学问题等)或其功能(如排序算法等)的分类。在使用深度学习代码分类领域目前有着大量的研究,可以极大地帮助我们浏览和分析大型数据库的漏洞。

💻 代码克隆检测

软件项目内部或之间发现了相同或相似的源代码或字节码片段,称为克隆。克隆匹配可以帮助安全工程师在检查类似的项目和功能时发现克隆代码的一些漏洞。

为了实现克隆检测,首先要对代码片段进行相似性测量;如果分数超过一定的阈值,就会认为这对代码是相似的。糖衣语法(Syntactic sugar,计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。)和编码风格的多样性会给计算相似性分数方法带来问题。

不过,深度学习模型可以用代码片段或二进制文件的复杂语义来计算分数。甚至还有可能检测出不同编程语言之间的代码匹配。

💻 漏洞检测

使用静态分析进行漏洞检测的另一种或补充方法是通过神经网络查找漏洞:即使用深度学习查找漏洞。一般来说,漏洞检测可以被看作是一个分类问题,可以用有漏洞和无漏洞的代码训练深度神经网络来解决。研究人员已经提出了这种技术的各种实例,包括CodeTrek这样的框架。

CodeTrek组合了传统静态分析和关系数据库,并集成到了深度学习中,以识别大型项目中的漏洞。不过,有些传统的基于逻辑分析的bug却无法被检测的。例如,滥用变量的bug不能用逻辑规则来定义,因此即使是最强大的静态分析框架也不能发现该问题,而各种神经网络在发现这类漏洞风险方面或许能发挥关键作用。

使用深度学习进行漏洞检测的一个重大挑战是目前我们仍缺乏由人类专家产生的高质量真正数据。事实上,一些漏洞检测模型是使用数据集进行训练的,而这些数据集并不一定能描绘出现实世界的漏洞状况。不过,CertiK的大型数据库中曾发现的漏洞,为开发这样的漏洞检测工具提供了一个颇有潜力的数据集。

💻 确定漏洞的优先次序

在软件开发中,对漏洞进行优先排序有助于代码所有者将其资源集中在需要首先修复的那些最关键的漏洞上。深度学习可以通过分析错误报告和识别表明问题严重性的模式,来协助对错误进行优先排序。这样的模型可以在已经被排查过的漏洞风险报告数据集上进行训练,并且可以学习识别数据中与高优先级错误相关的模式。

为了确保模型的准确和有效,必须使用高质量的数据进行训练和测试。这包括确保风险漏洞的报告被正确标记,数据集包括一系列以严重程度分级的代表性漏洞样本。在CertiK,安全工程师在人工审计后,会将漏洞发现按照严重级别进行打分。这些分数将按序进行排名,同时这种高质量数据的收集对于训练一个有效的模型非常有价值。

💻 解析漏洞风险

深度学习可以通过分析日志文件以及识别表明问题根源的模式来解释软件中的漏洞。这种方法可以帮助开发人员更快且更准确地诊断和修复漏洞,节省时间并提高软件的质量。

一个基于深度学习的模型可以通过从大量的漏洞修复中学习,为软件错误生成自然语言解释。为了给一个漏洞生成自然语言解释,模型必须利用关于程序和错误模式的结构和语义信息。

这在大型且复杂的软件系统中尤为有用,因为在这些系统中,手动诊断和修复每一个漏洞既困难又费时。此外,一个漏洞检测模型如果可以提供合理的漏洞解释,那么其将能够在现实世界和高风险条件下提高透明度,以此建立安全工程师和安全专家社区的信任。

💻 减少误报

漏洞查找工具面临的常见挑战是误报。

正如上文所述,如果一个静态工具将良性或非关键性的问题识别为一个漏洞时,即被定义为误报。

深度学习可以用来帮助降低这些工具的误报率。为了确定一个新的漏洞报告是否是误报,可以用基于深度学习的模型来发现静态工具中提供误报的程序结构。深度学习技术可以被用于发现此类相关性,并建立一个真实报告或误报的分类器。

💻 规范推理

应用形式化验证有一个挑战性的步骤:以逻辑或数学公式的形式化验证方式,通过软件的源代码或文档来提取其预期行为。

自动推断这种行为,也就是所谓的规范推断,可以适当解决该问题。研究人员已经提出了各种规格推断的方法,例如推断循环不变量。

在一项研究(https://arxiv.org/abs/2301.12284)中,作者提出了一种方法。该方法基于深度神经网络的使用,并在检测真实世界的软件漏洞方面体现出了有力的价值。

而CertiK的联合创始人顾荣辉教授和哥伦比亚大学的其他研究人员提出了另一项研究结果(https://arxiv.org/abs/2003.07959):通过一种深度神经网络的方法来推断循环不变量,该方法也是从程序执行轨迹中建立循环行为模型。作者表明,相比于目前最领先的技术,这一方法的准确性和效率更优。

💻 改进模糊测试

深度学习可以通过利用其学习模式和从大量数据中提取特征的能力来改进程序模糊测试。

深度学习能够通过将输入的生成引导到更有可能触发崩溃但也更有意思的实例中,来增强模糊测试。

模型可以被训练来学习哪些输入参数或输入序列更有可能导致崩溃或触发缓冲区溢出。这有可能通过运行程序的不同部分来提高模糊器的覆盖率,帮助发现可能被传统模糊技术遗漏的错误或漏洞。

写在最后

在改善软件安全方面,深度学习具备相当大的潜力。

目前该技术已经在多个领域展示并证明了它的能力,包括漏洞检测、代码分类、克隆代码检测等。

传统的软件安全技术,如启发法、静态分析、形式化验证和模糊测试,有其优势,但也面临着难以大规模化的挑战。

深度学习可以提供更高效和有效的方法来应对这些挑战,增强智能合约和程序的安全性。虽然深度学习在软件安全方面的应用研究仍处于起步阶段,但这一领域的持续创新和发展仍是一片存在无数机会的蓝海。

随着行业的不断发展和壮大,软件安全和深度学习技术的融合将发挥越来越关键的作用。我们将能以此来大幅提高软件系统的安全性和可靠性。

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 CertiK 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信