When GPT Meets Program Analysis: Towards Intelligent Detection of Smart Contract Logic Vulnerabilities in GPTScan(当GPT遇到程序分析:实现GPT扫描中智能合约逻辑漏洞的智能检测)
01
摘要
智能合约容易出现各种漏洞,随着时间的推移,会导致巨大的经济损失。现有漏洞分析工具主要针对控制流或数据流模式固定的漏洞,如重入、整数溢出等。然而,最近一项针对Web3安全缺陷的研究表明,由于缺乏特定领域的属性描述和检查,约80%的Web3安全缺陷无法通过现有工具进行审计。鉴于生成式预训练Transformer (GPT)的最新进展,值得探索GPT如何帮助检测智能合约中的逻辑漏洞。本文提出了GPTScan,第一个将GPT与静态分析相结合的智能合约逻辑漏洞检测工具。不完全依赖GPT来识别漏洞,可能导致高误报,并受限于GPT的预训练知识,而是将GPT作为一种通用的代码理解工具。通过将每个逻辑漏洞类型分解为场景和属性,GPTScan用GPT匹配候选漏洞。为了提高准确性,GPTScan进一步指示GPT智能地识别关键变量和语句,然后通过静态确认对其进行验证。对约400个合同项目和3Ksolididity文件的不同数据集进行评估表明GPTScan对令牌合约实现了很高的精度(超过90%),对像Web3Bugs这样的大型项目实现了可接受的精度(57.14%)。它有效地检测了真实逻辑漏洞,召回率超过70%,包括人工审计遗漏的9个新漏洞。GPTScan是快速且划算的,扫描每千行Solidity代码平均需要14.39秒和0.01美元。此外,静态确认有助于GPTScan减少三分之二的误报。
02
模型背景
智能合约已经成为去中心化金融(DeFi)的基石,为执行金融交易提供了可编程和自动化的解决方案。然而,由于各种安全漏洞,这些智能合约的安全性已经成为一个主要的问题。这些入侵事件已经导致了数十亿美元的经济损失。这种情况对DeFi服务提供商来说是一场灾难,对整个DeFi生态系统和用户资产安全构成重大威胁。尽管有许多分析工具可用,他们通常关注具有固定控制流或数据流模式的漏洞,例如可重入性,整数溢出以及访问控制漏洞。然而,Zhang等人最近进行的一项研究表明。在Web3上,现有的工具无法发现其中80%的安全漏洞。这些未检测到的漏洞主要与智能合约的业务逻辑相关。传统的静态和动态分析方案,如Slither,由于它们不旨在理解智能合约的底层业务逻辑,也没有对智能合约的功能进行建模,也没有考虑各种变量或函数的角色,因此未能有效解决智能合约中的这些漏洞。
本文探讨了生成式预训练Transformer (GPT) 的最新进展如何帮助检测智能合约中的逻辑漏洞。最近的一份技术报告试图通过为项目范围内的“是或否”查询提供高级漏洞描述来使用GPT,这已经比典型的函数级漏洞检测更容易了。然而,这种方法存在96%左右的高假阳性率,并且需要GPT的高级推理能力,因此需要使用GPT-4而不是GPT-3.5。本文将GPT作为一个通用的、强大的代码理解工具,并研究如何将这种能力与静态分析相结合,创建一个智能的逻辑漏洞检测系统。
为此,本文提出GPTScan,第一个将GPT与静态分析相结合的工具,用于检测智能合约中的逻辑漏洞。
03
模型
图1说明了GPTScan的高级工作流,蓝色块表示GPT任务,绿色块表示静态分析。给定一个智能合约项目,它可以是一个独立的Solidity文件或包含多个Solidity文件的基于框架的合约项目,GPTScan首先进行合约解析,调用图分析确定函数可达性,综合过滤提取候选函数及其对应的上下文函数。GPTScan然后利用GPT将候选函数与预先抽象的场景和相关漏洞类型的属性进行匹配。对于匹配的函数,GPTScan通过GPT进一步识别其关键变量和语句,随后将其传递给专门的静态分析模块以确认漏洞。
将漏洞分解为场景和属性。GPTScan采用了一种不同的方法,将漏洞类型分解为代码级的场景和属性。具体地,我们使用场景描述逻辑漏洞可能发生的代码功能,使用属性来解释易受攻击的代码属性或操作。表1展示了我们如何将10种常见的逻辑漏洞类型分解为场景和属性。这些漏洞类型是从最近的一项研究中选择的关于需要高级语义oracle的智能合约漏洞。
04
实现
GPTScan在Python中使用3640行代码(LOC)实现,在Java/Kotlin中使用154行代码。
05
数据集
如表2所示,实验在从真实世界的智能合约中收集的三个数据集上进行。这些数据集由大约400个合同项目,3Ksolididity文件,472K行代码组成,并包括62个ground-truth逻辑漏洞。
06
实验
我们将GPTScan对Top200的分析结果呈现在表3中
结合Web3Bugs和defhacks的结果,我们计算了每个被测试漏洞类型在函数级别的准确性指标。例如,如果一个项目已经用五种漏洞类型进行了测试,那么这个项目的所有真阳性、假阳性、真阴性和假阴性的总和应该是5。更具体地说,我们计算四个准确度指标:TP是真阳性的数量。当GPTScan成功地检测到被测试漏洞类型的ground-truth漏洞函数时,就计数出一个真阳性。TN是真负数的个数。当GPTScan正确地没有报告任何被测试的漏洞类型的漏洞函数时,就会计算一个真负。FP是假阳性的数量。当GPTScan错误地报告了一个或多个被测试的漏洞类型的脆弱函数,而在被测试的项目中没有对应的真实漏洞时,就会计算出一个假阳性。FN是假阴性的个数。当GPTScan无法检测到被测漏洞类型的ground-truth漏洞函数时,将统计一次漏报。根据这些指标的计算,GPTScan为Top200数据集报告了13FPs和283 TNs,如表3所示。因此,GPTScan在分析Top200等非脆弱top合约时的误报率为4.39%。此外,我们发现GPTScan在分析Top200和defhacks时具有相似的精度,二者都是每个项目大约有2个Solidity文件的令牌契约(见表2)。当分析像Web3Bugs这样的大型项目时,准确率从大约90%(defhacks的90.91%)下降到60%(Web3Bugs的57.14%)。精度的下降主要是因为Web3Bugs中的每个合同项目平均有大约36个Solidity文件(见表2),这是defhacks和Top200的18倍
07
总结
对约400个合同项目和3Ksolididity文件的不同数据集进行评估表明GPTScan对令牌合约实现了很高的精度(超过90%),对像Web3Bugs这样的大型项目实现了可接受的精度(57.14%)。它有效地检测了真实逻辑漏洞,召回率超过70%,包括人工审计遗漏的9个新漏洞。GPTScan是快速且划算的,扫描每千行Solidity代码平均需要14.39秒和0.01美元。此外,静态确认有助于GPTScan减少三分之二的误报。
在ChatGPT (GPT-3.5) 出现之前,大多数基于nlp的漏洞检测方法都涉及将代码送入二分类或多分类模型。现在,随着指导GPT和其他提供少样本学习能力的研究的发展,交互式解决方案可以用于代码修复和漏洞检测等任务。然而,根据David等人的研究, GPT-4模型本身并不能准确地检测漏洞。Chen等人[34]对GPT-3模型进行了微调,以提高GUI图形界面测试任务中的性能,并将其用于Android应用程序的自动化测试。此外,PentestGPT和ChatRepair利用执行结果的反馈来增强GPT模型在交互过程中的性能。
原文地址:https://arxiv.org/pdf/2308.03314.pdf
原文始发于微信公众号(梅苑安全学术):当GPT遇到程序分析:实现GPT扫描中智能合约逻辑漏洞的智能检测
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论