原文标题:When GPT Meets Program Analysis: Towards Intelligent Detection of Smart Contract Logic Vulnerabilities in GPTScan
原文作者:Yuqiang Sun, Daoyuan Wu, Yue Xue, Han Liu, Haijun Wang, Zhengzi Xu, Xiaofei Xie, Yang Liu
发表状态:preprint
原文链接:https://arxiv.org/abs/2308.03314
主题类型:Sec-LLMs
笔记作者:IzaiahSun
主编:黄诚@安全学术圈
智能合约的漏洞类型与传统软件不同,并不存在内存安全或者任意代码执行等问题。而根据已有研究,智能合约中约80%的漏洞是无法使用机器检测的(Machine Undetectable Bugs)。这些漏洞大多与业务逻辑相关,而传统的分析方法并不考虑业务逻辑,因此无法检测出这些漏洞。
在上述案例中,实现了一个存款(deposit)的操作。当流动性池的余额为0时,share
会被设置成存款总数。因此,第一个存款人可以存入很少的钱并占据所有的share
,之后转入一大笔使share
价格通胀,从而获取不正当利益。对于静态分析的检测方法来说,难点在于如何判断业务场景并识别出关键变量。
这篇文章的方法分为三个步骤:
首先,作者使用了静态分析的方法,要求所有被分析的函数都是用户可达的,即存在一条调用路径,并且没有onlyOwner
等权限修饰符。其次,作者使用了若干个基于文本和调用图的过滤规则,用于筛选每一条规则对应的潜在漏洞函数。对于每个漏洞函数,作者根据调用链关系,对其和其上下文函数进行组合,以确保语义完整性。经过了过滤和组合之后,一定程度上降低了候选项范围,并保证了一定的语义完整性。
作者使用了GPT-3.5-turbo模型,对于每个候选项,包括了两条自然语言描述,分别为scenario
和property
。针对每一个候选函数,模型会依次确认scenario
和property
是否匹配,如果匹配则认为该函数有较大概率存在漏洞,并进入到下一步。当认为函数有较大概率存在漏洞时,模型会进一步提取关键信息,包括vulnerable variable
和vulnerable statement
。这两项信息会交给最后一步,漏洞确认,用于确认漏洞是否存在。
漏洞确认采用了静态分析的方法,一共有四个内置分析器。包括了静态数据流追踪,变量比较检查,执行顺序检查和函数调用参数检查。这些分析器可以有效去除误报,以提升准确率和精确度。
作者一共总结了10条规则,共对应了9个漏洞类型,包括授权未被清除、不安全的第一个存款人(案例中展示的漏洞)、基于AMM的价格操纵、基于购买或交换代币的价格操纵、投票操纵、抢跑、错误执行顺序、滑点和未经授权的转账。每一条规则包含四个部分,即两条自然语言描述,一些静态过滤器和一条静态确认器。
该论文共使用了三个数据集,分别是:
作者在三个数据集上进行了实验,结果如上图所示。在Top200上,误报率为4.39%;在Web3Bugs上,精确度为57.14%;在DefiHacks上,精确度为90.91%。
作者在两个有漏洞的数据集上进行了实验:在Web3Bugs上,召回率为83.33%;在DefiHacks上,召回率为71.43%。作者在文中分析了所有漏报案例及其原因。
作者进行了一个消融实验(ablation study),对比了静态漏洞确认的重要性。实验发现,静态漏洞确认可以有效地去除误报,提升精确度。但同时,对于召回率影响非常有限。
作者使用了GPT-3.5-turbo模型,在三个数据集共472K行代码上进行了实验。总耗时约6793秒,平均每千行代码耗时14.4秒;总共花费约5美元,平均每千行代码花费10.6美分(0.0010589美元)。相比于人工审计来说,AI辅助的漏洞检测可以大大降低成本。
作者在Web3Bugs数据集上发现了9个新的漏洞,其中5个是不安全的第一个存款人,3个是基于AMM的价格操纵,1个是抢跑。
@misc{sun2023gpt,
title={When GPT Meets Program Analysis: Towards Intelligent Detection of Smart Contract Logic Vulnerabilities in GPTScan},
author={Yuqiang Sun and Daoyuan Wu and Yue Xue and Han Liu and Haijun Wang and Zhengzi Xu and Xiaofei Xie and Yang Liu},
year={2023},
eprint={2308.03314},
archivePrefix={arXiv},
primaryClass={cs.CR}
}
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com