Smart Contract Vulnerability Detection Using Graph Neural Networks
Smart Contract Vulnerability Detection Using Graph Neural Networks
论文题目:(2020-IJCAI)Smart Contract Vulnerability Detection Using Graph Neural Networks ——图神经网络的智能合约漏洞检测
论文引用:ZHUANG Y, LIU Z, QIAN P, 等. Smart Contract Vulnerability Detection Using Graph Neural Networks[C]//2020, 3: 3283–3290.
代码开源:Messi-Q/GraphDeeSmartContract
汇报PPT:基于图神经网络的智能合约安全漏洞检测
一、主要内容
在本文中探索使用图神经网络(graph neural networks,GNN)进行智能合约漏洞检测。构造了一个合同图(contract graph)来表示智能合同功能的句法和语义结构(syntactic and semantic structures)。
为了突出显示主要节点,设计了一个消除阶段(elimination phase)来标准化该图。然后提出了一种无度图卷积神经网络(degree-free graph convolutional neural network,DR-GCN)和时间消息传播网络(temporal message propagation network,TMP),以从归一化图(the normalized graphs)学习漏洞检测。
对300,000多个现实世界的智能合约功能进行了广泛的实验,结果表明,在检测不同类型的漏洞(包括可重入性(reentrancy),时间戳依赖性(timestamp dependence)和无限循环漏洞(infinite loop vulnerabilities)方面,该方法显着且始终优于最新方法。
背景介绍
当前的智能合约漏洞检测方法主要是受编程语言社区现有的测试方法启发,围绕符号执行(symbolic execution)和动态执行方法(dynamic execution methods)。
作者仔细研究了现有方法的已发布实现,并根据经验观察到它们存在两个关键问题。
- 现有方法严重依赖于一些专家定义的硬性规则(或模式)来检测智能合约漏洞。但是,专家规则(expert rules)容易出错,有些复杂的模式也不容易被覆盖。粗暴地使用几个硬性规则会导致较高的 false-positive,FP和false-negative,FN率,并且狡猾的攻击者可能会轻易绕过规则进行攻击。
- 其次,由于规则是由开发检测工具的少数“集中式”专家制定的,因此其可扩展性固有地受到限制。随着智能合约数量的快速增长,少数专家无法筛选所有合同以设计精确的规则,而其他“分散式”专家的知识也无法纳入以改进模型。
二、设计实现
作者根据程序语句之间的数据和控制依赖性(data- and control- dependencies)将智能合约的源代码表征为合约图(contract graph)。图中的节点表示关键函数调用或变量,而边沿则捕获其临时执行轨迹(temporal execution traces)。由于大多数GNN在信息传播过程中本质上是平坦的,因此设计了消除阶段(elimination phase)以对图形进行归一化。作者将GCN扩展为无度GCN(degree-free GCN,DR-GCN),以处理归一化图。同时,考虑到不同程序元素的不同角色和时间关系,并提出了一种新颖的时间消息传播网络(message propagation network,TMP)。
Problem formulation
问题表述:将为每个智能合约函数SC标记为标签,其中$\hat{y} = 1 \hat{y} = 0$表示SC是安全的。在本文中,作者重点介绍了三种类型的漏洞:
- Reentrancy:重入是一个众所周知的漏洞,引起了臭名昭著的DAO攻击。在以太坊中,当智能合约函数F1将资金转移到接收人合约C1时,C1的fallback将被自动触发。 C1可以在其中调用F1以重新进入F1以窃取金钱。由于F1的当前执行等待传输完成,因此C1可以利用中间状态F1来成功进行窃取。
- Infinite loop:无限循环是智能合约中的常见漏洞。函数的程序可能包含没有退出条件或无法达到退出条件的迭代或循环,即无限循环。智能合约中的Infinite loop增加了这种非终止错误的新可能性,即函数与fallback函数之间的循环调用。例如,函数A用错误的参数调用函数B,这将自动触发此合同中的fallback函数的执行。假设fallback函数进一步调用函数A,这将导致A与fallback函数之间的调用循环。
- Timestamp dependence:当智能合约使用块时间戳作为执行某些关键操作的触发条件时,存在时间戳依赖漏洞。以太坊中的矿工可以在短时间间隔(<900秒)内设置区块的时间戳[Jiang et al。,2018]。因此,矿工可能会操纵区块时间戳来获取非法利益。
Method overview
总体架构包括三个阶段:
- graph generation phase:图生成阶段,该阶段从源代码中提取控制流和数据流的语义,并显式地建模回退机制(the fallback mechanism);
- graph normalization phase:图规范化阶段
- message propagation networks:用于漏洞建模和检测的时间消息传播网络。
Graph Generation
现有工作[Allamanis et al。,2018]表明,程序可以转换为符号图表示形式(symbolic graph representations),能够保留程序元素之间的语义关系。受此启发,作者将智能合约功能公式化为合约图,并为不同的程序元素(节点)分配了不同的角色。函数中的不同程序元素的重要性并不相同。
因此,作者提取了三类节点,即主要节点,次要节点和后备节点。此外,通过考虑边缘的时间顺序来构造它们。
Major nodes construction
主要节点表示对自定义或内置函数的调用,这些调用对于检测特定漏洞很重要。
例如,对于重入漏洞,主节点对调用传递函数或内置的call.value函数进行建模,这是检测重入的关键。
对于时间戳依赖漏洞,内置函数调用block.timestamp被提取为主要节点。
对于无限循环,合同中的所有自定义功能均被视为主要节点。
形式上,我们将所有关键函数表征为主要节点,分别用M1,M2,…Mn表示。
Secondary nodes construction
主要节点代表重要的调用,而次要节点则用于建模关键变量,例如,用户余额和奖励标志。形式上,关键变量定义为辅助节点S1,S2,…Sn。
Fallback node construction
此外,我们构造了一个后备节点F来激发攻击合同的fallback函数,该函数可以与Test 函数进行交互。fallback函数是智能合约中的一种特殊设计,并且是许多安全漏洞的原因。
Edges construction
进一步构造边缘以对节点之间的关系建模。每个边都描述了被测试中的合同功能可能遍历的路径,并且该边的时间编号表征了其在功能中的顺序。
具体来说,将边缘的特征提取为元组(Vs,Ve,o,t),其中Vs和Ve表示其开始和结束节点,o表示其时间顺序,t表示边缘类型。
为了捕获节点之间丰富的语义依赖性,我们构造了四种类型的边缘,即控制流(control flow),数据流(data flow),前向边(forward edges)和后向边(fallback edges)。
图1(a)和(b)分别展示了合同摘要和为其getBonus函数构建的图表。
- 智能合约的源代码
- 源代码中提取的图:圆圈中的节点表示主要节点,正方形中的节点表示次要节点。
- 归一化后的图。
Contract Graph Normalization
大多数图神经网络在传播信息时本来就是平坦的,而忽略了某些节点比其他节点扮演着更重要的角色。
此外,不同的合同源代码会产生不同的图,从而阻碍了图神经网络的训练。因此,作者提出了一个节点消除过程(node elimination process)来规范化图。
Nodes elimination
如上所述,图的节点分为主节点Mi,次要节点Si和后备节点Fi。我们删除了每个次要节点Si,但将Si的特征传递给了最近的主节点。注意,如果Si具有多个最近的主要节点,则其特征将传递给所有这些主要节点。后备节点的删除方式也与次要节点类似。保留了连接到已删除节点的边,但其起点或终点移动到了相应的主节点。
Feature of major nodes
通过聚合来自其相邻已删除节点的要素来更新主要节点的要素。为了区分聚合后的原始主节点及其对应的主节点,我们将Mi的新主节点称为Vi。 Vi的特征包括三个部分:
- 自特征,即主节点Mi的特征;
- in 特征,即合并到Mi并具有从Pj到Mi的路径的次要节点Pj的特征;
- 外部特征,即合并到Mi的次要节点Qk的特征,并具有从Qk到Mi的路径。
图1(c)显示了出了图1(b)的归一化图。
Message Propagation Neural Networks
在本小节中,首先将GCN扩展到无度GCN(DR-GCN),然后提出一种时间消息传播网络(temporal message propagation network,TMP)。所提出的两个网络都以智能合约函数的归一化图G作为输入,并输出标签$\hat{y} \in {0,1} $指示该函数是否具有某种类型的漏洞。
DR-GCN
[Kipf andWelling,2017]提出将卷积神经网络应用于图结构数据,从而开发出分层传播网络:
TMP
TMP网络,该网络由消息传播阶段(message propagation phase)和读出阶段(a readout phase)组成。在消息传播阶段,TMP遵循其时间顺序依次沿边缘传递信息。然后,TMP通过使用读出函数为整个图G计算一个标签,该函数汇总G中所有节点的最终状态。正式地, ,其中V由所有主要节点组成,E包含所有边缘,其中ek代表第k个时间边缘。
Message propagation phase
消息沿边缘传递,每个时间步沿一个边缘。在时间步骤0,利用Vi的特征初始化每个节点Vi的隐藏状态h0i。在时间步骤k,消息流过第k个时间边缘ek并更新Vek的隐藏状态,即ek的末端节点。特别地,消息mk是基于hsk,ek的起始节点的隐藏状态以及边缘类型tk计算的:
- 输入归一化图;
- 消息传播阶段;
- 输出漏洞检测结果的读取阶段
三、实验评估
Datasets
对所有在以太坊和VNT链平台上具有源代码的智能合约进行了广泛的实验。将两个现实世界的智能合约数据集分别表示为ESC(以太坊智能合约)和VSC(VNT链智能合约)。
- ESC包含40,932个以太坊智能合约,其中约307396个函数。在这些函数中,大约有5013个至少具有一个call.value调用,从而使它们可能受到重入漏洞的影响。 有4833函数包含block.timestamp语句,使它们容易受到时间戳依赖的漏洞的影响。
- VSC包含从VNT链中收集了4170个智能合约,大致包含13761个函数。 VNT Chain是由新加坡,中国和澳大利亚的公司和大学提出的实验性公共区块链平台。
Experimental Settings
本文方法(DR-GCN和TMP)与总共十二种其他方法进行了比较,即四种现有的智能合约漏洞检测方法(Oyente [Luu等人,2016],Mythril [Mueller,2017],Smartcheck [Tikhomirov等人
等(2018)和Securify [Tsankov等,2018]),四种基于神经网络的方法(Vanilla-RNN,LSTM,GRU和GCN)和四种程序循环检测方法(Jolt [Carbin等, 2011],PDA [Ibing和Mai,2015],SMT [Kling等,2012]和Looper [Burnim等,2009])。
Result
性能评价指标包含正确性(accuracy),查全率(recall),准确度(precision)和F1分数(F1 score)。
表2 在准确性,召回率,精确度和F1得分方面进行性能比较。
比较中总共研究了14种方法,包括最新的漏洞检测方法,基于神经网络的替代方法,本方法DR-GCN和TMP。 “ –”表示不适用。
四、总结评论
本文优点:
- 引入了新颖的时间消息传播网络(TMP)和无度GCN(DR-GCN),以自动检测智能合约漏洞。
- 采取了新颖的方法将合约函数源代码表征为联系图,并明确规范化该图以突出显示关键节点。
- 本文的方法在智能合约漏洞检测方面有很好的性能。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!