随着区块链技术的发展,智能合约已成为区块链应用的重要组成部分,并被广泛应用于金融、物联网、供应链等领域。然而,智能合约在编写过程中可能会引入一些漏洞,例如重入、整数溢出等,并导致资产损失等不良后果。以ChatGPT为代表的大语言模型(LLM)作为一种利用神经网络和机器学习等技术进行建模的人工智能技术,可以实现程序设计的相关代码的处理并分析,并具有生成、理解和问答等能力。基于这一技术潜力,蚂蚁安全天穹实验室联合中山大学InPlusLab发布《当AI遇上区块链:用ChatGPT探索智能合约漏洞检测的新路径》,基于ChatGPT开展智能合约源代码的安全漏洞分析与筛查。研究发现,ChatGPT在智能合约漏洞检测场景中具有出色的代码理解能力,同时具备一定的漏洞检测潜力。
1、ChatGPT可检测多种智能合约的常见漏洞,包括但不限于重入、整数溢出、权限控制等。并且与其他主流合约漏洞检测工具相比,ChatGPT在检测整数溢出时具有更好的检测效果。
2、ChatGPT对新型漏洞模式具有一定的学习能力,能够从提示信息中学习漏洞的定义和发生场景等知识,并应用于后续的检测任务中。
3、ChatGPT在检测智能合约漏洞时,可以省去代码编译以及执行的过程,能有效降低了人力成本,并用于更广泛的检测场景。
4、ChatGPT在检测漏洞方面具有良好的时间性能,提升了合约审计的工作效率。
5、ChatGPT用于检测智能合约漏洞时还存在一定局限性,具体表现为输出结果不稳定、长合约检测报错以及代码理解易被注释干扰等等。
6、ChatGPT有着广泛的应用前景,可以扩展到DeFi、NFT等领域中其他与智能合约相关的任务,例如智能合约的自动化生成和测试。同时,ChatGPT还能够适应更多的编程语言和平台,有潜力成为跨平台、跨生态的全能安全漏洞检测工具。
中山大学软件工程学院副院长郑子彬教授表示,
这项研究将时下热门的大型语言模型ChatGPT应用到智能合约安全领域当中,对智能合约的AI漏洞挖掘审计展开了多维度的分析,通过一系列实验,探索了人工智能在智能合约安全领域的潜力,并深入挖掘了其在智能合约漏洞挖掘和审计方面的应用前景,对智能合约的安全审计工作具有重要的启示意义。
1 引言
近年来,随着以太坊等区块链平台的快速发展,以Solidity为主流开发语言的智能合约程序被广泛应用于各大领域。然而,由智能合约漏洞引发的安全问题,也同时造成了巨大的经济损失。智能合约的安全问题不仅会直接损害用户的利益,还会对整个区块链生态系统的发展产生不良的影响。因此,智能合约的漏洞检测成为近年来的一项重要任务。与此同时,OpenAI团队研发的大语言模型ChatGPT横空出世,在各个领域都收获了剧烈的反响。
生成式人工智能模型(Artificial Intelligence Generated Content,AIGC)通过学习海量数据来生成各种内容。相比于传统的规则或逻辑式AI模型,AIGC模型更加灵活自适应,可以在各种任务和场景中表现出色。通用人工智能(Artificial General Intelligence)是一种理论上能够完成类似于人类的各种认知任务的人工智能。与当前的大多数人工智能模型不同,AGI模型可以处理多种不同类型的信息、具有高度自我适应性和创造性,能够在新的环境中快速学习和适应。ChatGPT就是一种AIGC模型,其拥有极高的自然语言处理能力和知识储备,能够回答各种类型的问题、完成各式任务和产生自然流畅的语言输出。这些特点使得ChatGPT成为目前最接近AGI模型的人工智能模型之一。
ChatGPT语言模型在安全漏洞挖掘方面同样具有潜在的能力,其可以通过理解代码的结构和逻辑,帮助安全研究人员更快地发现潜在的漏洞和安全问题,提供更好的安全保障。为了探索ChatGPT在分析、理解智能合约以及检测智能合约漏洞等方面的能力,我们进行了一系列多维度的调查和实验,并从以下几个方面进行了分析:
ChatGPT所掌握的漏洞种类
ChatGPT对已掌握漏洞类型的检测能力
ChatGPT对Solidity版本的兼容性
ChatGPT对DApp的漏洞检测能力
ChatGPT对漏洞模式的学习能力
ChatGPT审计智能合约时的局限性
GPT-4与GPT-3.5的对比
我们对于ChatGPT检测智能合约漏洞的研究开始于2023年3月13日,而GPT-4模型发布于次日,并且仅对ChatGPT Plus用户开放试用,其API尚未发布,因此我们在实验中采用了当时广泛使用的gpt-3.5-turbo模型进行大规模测试,除此以外也对GPT-4的能力进行了小规模的对比实验。一旦GPT-4的API发布,我们将继续对其展开大规模测试。从当前的测试效果来看,ChatGPT在智能合约的漏洞检测方面表现出了不错的能力,其可以作为很好的漏洞检测辅助工具,帮助安全审计人员提高工作效率。
2 漏洞种类分析
根据区块链开源数据平台XBlock中的智能合约漏洞列表[3],现存的合约漏洞类型已经达到了69种。本次研究首先需要弄清的问题是ChatGPT作为一款经过训练的模型,它掌握并且能够检测的漏洞有多少种。为此,我们向ChatGPT抛出问题:“What vulnerabilities can you detect in smart contracts?”,它的回答如图1所示。
图1 ChatGPT对于“What vulnerabilities can you detect in smart contracts?”的回答
为了验证此回答的可靠性,换一种方式再次向ChatGPT抛出问题:“There are many kinds of vulnerabilities in smart contracts. Which of them can you detect?”,然而如图2所示,这一次它的回答与上一次并不一致。从中可以看出ChatGPT对于多次相同语义的输入并不能做到恒定的输出,它的回答是具有波动性的。我们尝试了相同问题的不同问法以及同一问题的多次Regenerate response,从收集到的所有回答中,推测出gpt-3.5-turbo模型的ChatGPT具有检测以下几种智能合约漏洞的能力:重入(Reentrancy)、整数溢出(Integer Overflow)、权限控制(Access Control)、时间戳依赖(Time manipulation)、拒绝服务(Denial of Service)、未处理异常(Unhandled exception)、逻辑错误(Logic errors)。上述漏洞仅是通过统计ChatGPT对于可检测漏洞种类的直接回答而得出的,其实际能够检测的种类可能不止如此。
图2 ChatGPT对于“There are many kinds of vulnerabilities in smart contracts. Which of them can you detect?”的回答
3 漏洞检测能力分析
对于ChatGPT已掌握的智能合约漏洞类型,我们对其检测能力进行了分析。首先给出一份含有漏洞的合约,这份合约是著名的SimpleDAO.sol[4],其中包含了ChatGPT所掌握的重入漏洞。它对于这份合约的分析如图3所示。我们又使用ChatGPT对其他3份包含重入漏洞的示例合约进行漏洞检测(漏洞合约来自区块链开源数据平台XBlock[3]),ChatGPT正确地检测出了其中2份合约所包含的重入漏洞。在此之后,我们尝试让ChatGPT去检测整数溢出漏洞,提供了XBlock中存在整数溢出漏洞的15份示例合约,发现ChatGPT可以正确检测出其中的11份。这表明ChatGPT在检测某些已掌握的漏洞类型时,具备一定的检测能力。
图3 ChatGPT检测一份包含重入漏洞的合约的结果(部分)
图4 ChatGPT检测一份包含整数溢出漏洞的合约的结果
3.2 ChatGPT对Solidity版本的兼容性
传统的漏洞检测工具需要将 Solidity 代码正确编译后才能执行后续的检测操作。然而Solidity迭代更新的速度很快,至今为止已经发布了102个版本[7]。此外,不同版本的Solidity之间存在一定差距,例如0.6.0版本引入了对try-catch语句的支持,可以方便地捕捉和处理异常,0.8.0版本中整数溢出检测已经默认开启,不再需要使用SafeMath库来进行数值运算的安全性保证。目前,很多基于符号执行的智能合约漏洞检测工具需要先将Solidity代码编译为字节码再进一步分析。因此,传统漏洞检测工具可能会因为 Solidity 版本兼容性问题而产生一定程度的困扰。然而,ChatGPT可以通过自然语言理解和生成技术来直接分析 Solidity代码并检测潜在的漏洞,避免了编译的过程。
3.3 ChatGPT在DApp漏洞检测中的优势
DApp是基于分布式技术构建的应用程序[9],具有透明、安全等特点。目前,有多种主流的DApp框架开发可供开发者选择,以提高开发效率,例如Truffle、Brownie等。然而,大部分传统漏洞检测工具只能支持单个可直接编译的合约检测,而DApp通常由多个Solidity文件和若干外部依赖构成。因此,在DApp智能合约漏洞检测方面,只有极少数工具如Slither[11]能够支持直接分析整个DApp。同时,在智能合约中,导入第三方库是一种常见的用于获取可重用的代码模块的方法。然而,由于代码库的多样性和版本更迭问题,代码导入可能会变得非常复杂。上述种种原因都对DApp智能合约的漏洞检测构成了一定阻碍。
与此相反,ChatGPT能够在不编译代码的前提下,理解各种编程语言,包括Python、JavaScript和Solidity等。ChatGPT不需要执行代码,直接对智能合约源代码进行分析和理解,从而发现其中的漏洞。图6和图7是ChatGPT和传统检测工具Mythril[14]检测同一份DApp合约的结果对比。ChatGPT这种不需要编译代码而直接检测代码漏洞的能力,在处理具有复杂依赖关系的DApp时具有优势。
3.4 GPT-4与GPT-3.5的对比
为了对比GPT-4与GPT-3.5模型在检测智能合约漏洞时的表现,我们尝试将多份包含漏洞的合约分别提供给两种模型进行检测。检测结果表明,GPT-3.5具备一定的智能合约漏洞检测能力。然而,GPT-3.5虽然能检测到多种潜在的漏洞,但其中只有少数是正确的,这导致了一定程度的误报和冗余信息的产生,增加了使用者的成本。
与此相反,GPT-4在检测智能合约漏洞方面表现出更高的准确性以及对漏洞更深的理解。它对于一份合约检测出的漏洞数量可能少于GPT-3.5,但GPT-4不仅能够精准地识别出存在的漏洞,而且能够对检测结果进行更加详细的分析和论述,提供更有效的针对性解决方案以帮助修复这些漏洞。图8和图9是GPT-3.5和GPT-4对同一份智能合约modifier_reentrancy.sol[12]的检测结果对比。相较于GPT-3.5,GPT-4在检测结果中包含的冗余信息较少,更加精确和实用。综上所述,GPT-4在检测智能合约漏洞方面相较于GPT-3.5表现出更高的准确率和更深入的分析能力。这使得GPT-4成为智能合约安全性分析的更加有效和可靠的工具。
此外,根据GPT模型的官方文档,GPT-4的对话tokens限制得到了明显的提升。本次研究中主要使用的gpt-3.5-turbo模型的tokens限制为4,096,而gpt-4-32k模型的tokens限制提升了很多,达到了32,768[10]。这意味着GPT-4在处理长合约时的表现相较于GPT-3.5将得到显著提升。
3.5 漏洞模式学习能力分析
ChatGPT是一款经过预训练的大型语言模型,其掌握的智能合约漏洞种类是有限的。于是,我们尝试人为告知它一些新的漏洞种类,并在后续的对话中要求它运用所学的知识去检测这些漏洞,以此来测试GPT模型的学习效果。这里,我们给出包含Short Address Attack[6]漏洞的合约代码,并在提供代码前,人为地告知了ChatGPT关于Short Address Attack漏洞的定义[6]以及一些漏洞发生的场景。提示信息和学习前后的检测结果分别如图10、图11、图12所示。
图10 Short Address Attack漏洞的定义[6]
这里可以看到,ChatGPT成功地学习了Short Address Attack这一漏洞类型,并顺利地将它应用在后续的智能合约漏洞检测中。除此以外,它甚至还给出了该漏洞的解决方案,并提供了相关代码。
代码1 Short Address Attack漏洞合约
图11 学习Short Address Attack漏洞前ChatGPT的检测结果
图12 学习Short Address Attack漏洞后ChatGPT的检测结果
此外,我们同样尝试了让ChatGPT学习Shadowing State Variable(CWE-710)漏洞,给出的提示信息为区块链开源数据平台Xblock中对该漏洞的定义。学习前后的检测结果分别如图13、图14所示。结果表明ChatGPT同样学会了Shadowing State Variable这一漏洞模式,并能够将其运用于后续的检测任务中。
图13 未学习Shadowing State Variable漏洞前ChatGPT的检测结果
图14 学习Shadowing State Variable漏洞后ChatGPT的检测结果
从上述实验可以看出,ChatGPT在漏洞模式的学习方面具备一定能力。ChatGPT可以有效分析并处理一段对话中人为告知的内容,并将其应用于后续的任务中。
4 检测结果评估
模型:gpt-3.5-turbo
提示:“Help me detect vulnerabilities in smart contracts.”
环境:Python API
数据集:smartbugs-curated[5]
在利用ChatGPT做漏洞检测时,我们通过对话事先声明了DASP10[6]中前九种漏洞的名称(九种漏洞类型都包含在数据集当中),以及DASP10官方文档中提到的它们的一些常见别名,通过这种方式限定了ChatGPT所检测的漏洞类型。
用于测试的每种漏洞名称以及对应的简写如表1所示。
此外,我们通过在与ChatGPT的对话中加入要求来尽可能地限定它的内容输出:“Check the following smart contract for the above vulnerabilities. The presence or absence of each vulnerability is indicated by true and false, respectively. Output your conclusion in a similar manner: ‘Reentrancy: true’ ”,通过这种方式可以实现让ChatGPT的输出格式如图15所示,以此来使ChatGPT工具化运行。
此外,为了减少ChatGPT输出的不稳定性对实验结果的影响,我们进行了五次实验,发现每一次的实验结果略有差别。因此,我们选择所有实验数据的平均值进行评估。在本次实验中,我们使用七项数据来评估检测效果,即真阳性(TP)、真阴性(TN)、假阳性(FP)、假阴性(FN)、准确率(Precision)、召回率(Recall)、F1值(F-measure)。TP和TN分别表示ChatGPT正确检测到的存在某种漏洞的智能合约以及不存在某种漏洞的智能合约。FP和FN指示ChatGPT错误检测到存在某种漏洞的智能合约以及不存在某种漏洞的智能合约。Precision、Recall、F-measure可以按如下方式计算:
smartbugs-curated[5]是一个由Smartbugs[13]项目团队提供的包含142份智能合约的数据集,每份合约代码中标注了一种漏洞类型。这些合约具有一定的代表性和重要性,可用于测试和验证静态和动态分析工具的有效性。数据集中的合约有多个来源,包括以太坊和其他公共区块链的应用程序等,整个数据集的平均长度约为50行左右。ChatGPT在smartbugs-curated[5]数据集上的检测结果如表2所示,表中的第一列代表各种待检测的漏洞类型,中间三列分别代表五次实验的precision平均值、recall平均值以及F-measure平均值,最后一列代表F-measure的标准差。
表2 ChatGPT在smartbugs-curated数据集上的检测结果
需要补充说明的是,在进行实验时,有5份(3.5%)智能合约是无法被正常检测的,因为它们的代码长度较长,使得与ChatGPT的对话超出了tokens限制。分析表2的数据可以看出,ChatGPT对于Arithmetic Issues这种漏洞的检测能力较强。
上述实验对ChatGPT所给出的提示信息是有限的,即需检测的漏洞类型。我们试图向ChatGPT提供更多信息,并观察它的检测效果是否会发生改变。于是在上述实验基础上,我们又尝试了一种多轮对话的漏洞检测方式,即与ChatGPT进行九轮对话,每一轮对话都告诉ChatGPT一种漏洞类型的名称及其定义。图16是其中某一轮对话为ChatGPT提供的Reentrancy漏洞相关信息。多轮对话结束后,再向ChatGPT抛出一份合约源码令其检测。多轮对话实验结果与上述实验的对比如图17所示。
实验结果表明ChatGPT的检测效果并没有得到明显提升,这某种程度上表明交互模式对于ChatGPT的漏洞检测能力影响不大。相比于之前的实验,多轮对话的对话内容中增添了对漏洞的具体定义,其实提供给了ChatGPT更多的信息。然而观察图中的数据可以发现,Reentrancy、Access Control等多组漏洞的检测效果得分不增反减。究其原因,可能是对话当中明确提及了漏洞的具体定义而限制了ChatGPT作为一款人工智能模型其功能的发挥。除此以外,在这次实验中token超限的合约比例由3.5%上升到了6.3%,有两个原因:1. 对话内容包括了漏洞的定义,长度更长。2. 对话轮数更多,所占用的token也更多。这表明,日后若想要通过让ChatGPT学习漏洞的形式去审计智能合约,合约长度和提示内容是必须考虑的两大问题。
图17 单轮对话与多轮对话的F-measure对比
4.3 与其他工具的检测结果对比
为了实现ChatGPT与其他工具的对比,我们选择了Slither、Oyente等九种常见的漏洞检测工具,并分别在smartbugs-curated[5]数据集上进行实验,得出的数据如表3所示。
表3的每一行分别代表相应工具在smartbugs-curated上测评的F-measure,每一列分别代表漏洞种类(此处缩写)。由于每款工具所针对的漏洞类型有别,对于该工具无法检测的漏洞在表3中用“/”表示。此外,Bad Randomness和Short Address Attack这两种漏洞是其他工具都无法检测的,因此在表3中略去。
从表3可以看出,与其他工具相比,ChatGPT在Arithmetic Issues和DoS的漏洞检测上展现了不错的检测能力,尤其是Arithmetic Issues,ChatGPT的检测效果领先其他工具较多。然而在其余的几种漏洞当中,ChatGPT的检测能力稍显逊色。这说明了ChatGPT与其他众多漏洞检测工具一样,在某些方面也是存在缺陷的。
4.4 时间性能分析
-
为了对比时间性能,我们记录了每个工具在数据集上检测漏洞的总时间,结果如表4所示。第一列表示检测工具,第二列表示该工具在数据集上进行检测的总时间,第三列表示该工具在数据集上检测失败的文件个数。从表4可以看出,ChatGPT平均总检测时间(包含API调用的网络时延)为9分21秒,具有良好的时间性能,但是由于token数量的限制,其检测失败的文件比例也相对较高。
4.5局限性分析
我们发现在大规模的实验过程中,ChatGPT对于智能合约的漏洞检测仍然存在一定的局限性。具体表现在以下三个方面:
✪ 4.5.1. 稳定性问题
ChatGPT对于一个相同或者类似的问题会有多种不同的输出。我们尝试多次给ChatGPT相同的合约源码,让其检测合约中存在的漏洞,然后观测它多次提供的检测结果。以SWC(Smart Contract Weakness)官方文档[8]中的一段示例代码举例。这段代码中包含一个Access Control类型的漏洞。ChatGPT在第一次检测这份合约时,准确地报告出其中存在的漏洞类型及发生位置,然而第二次的检测结果却声称这份合约是安全的。这表明了ChatGPT对于同一份合约的检测结果是具有不稳定性的。因此在使用ChatGPT去审计智能合约时,单次的测试结果并不具有高可信度。
✪ 4.5.2. 注释问题
代码2中的withdrawWinnings()函数下包含了一句注释,“// Winner if the last 8 hex characters of the address are 0.”如图18所示,在这份合约的第二次检测结果中,ChatGPT的分析是着重围绕这句注释而展开的,并未提及Access Control的问题。在实际编码过程中,注释的作用主要在于帮助开发人员更好地理清代码逻辑,并不实际执行,而ChatGPT在这次回答当中显然是被注释所干扰的。这给了非法人士更多恶意行为的机会。例如,他们可以在一段具有攻击性的代码前有意图地增加注释,来干扰ChatGPT对于这段代码的理解。
图18 ChatGPT对SWC-100示例代码的错误分析
✪ 4.5.3. 代码长度问题
在大规模漏洞检测的过程中,我们发现基于GPT-3.5架构的模型对于tokens的限制在ChatGPT审计智能合约时有较大的影响。OpenAI公司在ChatGPT的官方文档中明确表示,无论是gpt-3.5-turbo还是gpt-3.5-turbo-0301(本实验所采用的模型是gpt-3.5-turbo),其对于tokens,即文本长度是有限制的,某次对话最大允许的tokens数目为4096。这一点大大限制了所能提供的智能合约源码的长度。我们通过实验中大量的测试发现,在提供一些漏洞信息(约为220 tokens)之后,ChatGPT在检测智能合约时,所能接受的最大合约长度在400行左右,文件大小为15KB左右。然而在具有审计需求的真实合约中,很多源码的长度是超过这个数值限制的,这一点对于审计工作来说是一大阻碍。
4.6 综合效果分析
基于上述实验,可以将ChatGPT的优缺点进行一些归纳:
-
对某些漏洞的检测效果较好。实验结果表明,ChatGPT在针对某些特定的漏洞类型检测时,如整数溢出,效果优于当下的大多数工具。
-
具备一定的学习能力。ChatGPT作为一款人工智能模型,具备强大的学习能力,这意味着ChatGPT在后续有新漏洞诞生时,它可以通过对话的方式来学习并检测新型漏洞。
-
对Solidity版本的兼容性高。ChatGPT可以直接分析 Solidity 代码并检测潜在的漏洞,避免了不同版本功能差异所带来的干扰。
-
无需编译即可检测漏洞。ChatGPT可以直接对DApp智能合约源代码进行分析和理解,绕开了复杂的代码导入过程。
-
时间成本较小。忽略网络时延,用ChatGPT去检测一份智能合约的平均时间只有1.5秒左右。相比于其他很多基于符号执行的检测工具,ChatGPT的时间成本是相对较低的。在大规模检测智能合约时,这一点很有意义。
-
所掌握的漏洞类型有限。由于用于训练GPT-3.5模型的语料库截至2021年9月,ChatGPT所掌握的漏洞类型是有限的。对于一些新型的漏洞,ChatGPT并不具备自主检测的能力。
-
存在一定的局限性。代码长度、注释以及输出的稳定性问题都对ChatGPT的漏洞检测构成了挑战。
5 结语
经过一系列的实验,我们最终得出结论:目前开放使用的基于GPT-3.5架构的ChatGPT在智能合约的漏洞检测方面表现出了不错的能力。除了可以检测一些常见的漏洞类型之外,它还具备了强大的学习能力,能够在人为的提示下去检测一些新型的漏洞。审计人员可以充分地利用本文中所提到的一些ChatGPT的特点,去辅助进行智能合约的安全审计工作。此外,ChatGPT作为时下备受瞩目的一款AI模型,其迭代更新的速度也非常之快,目前GPT-4已经对部分用户开放试用,其智能合约的漏洞检测能力可能会更上一个台阶。
除文本介绍的内容外,ChatGPT可能还有更多值得探索的应用场景。它可以应用于更广泛的区块链生态系统,例如,在NFT领域中,ChatGPT可以用于优化元数据的生成和管理,以便更好地保护数字资产的所有权和价值。ChatGPT也可以扩展到与智能合约相关的其他任务,例如,智能合约的设计开发过程中,ChatGPT可以根据场景自动化生成需求文档以及相应的代码,以降低合约开发成本,提高开发效率。此外,ChatGPT也可以扩展到更多编程语言和平台,例如Solidity以外的其他智能合约编程语言和其他区块链平台。未来ChatGPT也许可以成为一个跨平台、跨生态的全方位智能合约开发辅助工具,助力区块链技术的发展。
参考文献
[1] C. Metz, “The biggest crowdfunding project ever—the DAO—is kind of a mess,” https://www.wired.com/2016/06/biggest-crowdfunding-project-ever-dao-mess.
[2] “Overflow error shuts down token trading,” http://hiphopworldmagazine.com/homeposts/overflow-error-shuts-down-token-trading.
[3] https://xblock.pro/
[4] http://blockchain.unica.it/projects/ethereum-survey/attacks.html#simpledao
[5] https://github.com/smartbugs/smartbugs-curated
[6] https://dasp.co/
[7] https://github.com/ethereum/solidity
[8] https://swcregistry.io/
[9] https://ethereum.org/en/developers/docs/dapps/
[10] https://platform.openai.com/docs/models
[11] https://github.com/crytic/slither
[12] https://xblock.pro/#/article/53
[13] https://github.com/smartbugs/smartbugs
[14] https://github.com/ConsenSys/mythril