以下解读均为本人个人见解,如有曲解或造成不必要的麻烦,欢迎联系我 nexisato0810@gmail.com 进行修改。正文内容中的“作者”均为paper作者本人,我的观点会由“我”或在括号“()”内显式注明。

【Paper作者】:Yuan Zhuang, Zhenguang Liu, Peng Qian, Qi Liu, Xiang Wang, Qinming He

【一句话总结】:将智能合约代码转成图,利用图神经网络检测智能合约漏洞.

【Introduction】

​ 区块链今年来发展非常火热,具有去中心化、防篡改的特性,本质上是一个分布式共享的交易账本. 智能合约,是一种自动运行在区块链上的程序,它旨在以信息化方式传播、验证、执行合同. 不过对于设计存在缺陷的智能合约来说,非常容易遭到网络攻击. 据SlowMist Hacked的统计,由于智能合约的漏洞问题,区块链网络已损失超过10亿美元.

​ 现有的智能合约漏洞检测方法依靠于符号执行等动态执行方法,但是存在两个缺陷:目前的检测模式是有限的,通常不可修改,这对于智能合约越来越多的今天,一些复杂的异常模式无法被检测到,且会有很高的误报率,攻击者会选择绕过这些检测规则进行攻击;过度依赖于“中心化”的专家提出的硬模式,导致检测方法的可扩展性很差.

​ 作者将智能合约源码中的关键函数、变量,表示为图的结点,边是这些结点之间调用关系执行记录. 考虑到GNN在信息传播过程中的平坦性,需要设计一个消除阶段用来将图规范化,并将GCN扩展为无度GCN(DR-GCN),处理那些规范化的图. 此外,考虑到了不同程序中的元素,在不同时间分别发挥出不同的功能,因此还提出了一个时间消息传播网络TMP. 团队对超过300,000个智能合约进行了实验,实验结果显示了GNN检测不同类型的智能合约漏洞具有非常好的先进性.

【模型设计】

合约图生成

​ 将智能合约函数定义为SC(SmartContract)SC(Smart\quad Contract),对每个SCSC,模型用于预测标签y^\hat{y}y^=1\hat{y} = 1表示具有某种特定类型的漏洞,否则表示该智能合约函数是安全的. paper主要关注三种漏洞:可重入性(Reentrancy)无限循环(Infinite loop)时间戳依赖(Timestamp dependence).

​ 前两种漏洞与回调函数的触发有关,后一种则是区块时间戳的设置有关.

​ 作者将根据智能合约的源码,构建了一套自动化工具,将它们自动转化为合约图,图中的结点分别代表源码中不同的元素(即变量、函数). 根据函数调用的时间顺序,构建图中的边,如下图展示了一段智能合约源码被可视化为图的结果:

1

​ 在图中,结点被分为三类:

  • 主要结点(Major Nodes): 代表对于检测漏洞十分重要的函数,有自定义函数,也有内置函数,记为 Mii=1,2,..,nM_i \quad i=1,2,..,n
  • 二级结点(Secondary Nodes):代表某些关键变量,记为SiS_i
  • 回调结点(Fallback Nodes):用于触发被攻击合约的回调函数.
  • 边构造(Edges Construction):每条边描述了被测试的合约函数可能通过的路径(函数与函数、函数与变量的调用链),边的时间序号代表了它在函数中的顺序. 以元组 (Vs,Ve,o,t)(V_s, V_e, o,t ) 表示,分别代表起始终止结点、时间顺序、边类型. 其中,边被分为如下几种类型:控制流、数据流、前向边、回退边.

合约图规范化

​ 图神经网络在传播信息的时候,所有结点被看作等价,而忽略了某些结点所起到的重要性. 此外,不同的合约代码也会产生不同的图,阻碍网络的训练,因此要进行规范化.

  • 结点消除:移除每个二级结点,并将其特征传递给最近的几个主结点,对回调结点也做类似的操作. 连接到删除结点的边改接到相应的主结点上.

  • 主结点特征: 主结点 MiM_i 经过二级结点的聚合后,更新为ViV_i, 结点特征包含三部分:原始主结点的自特征、从与 MiM_i 直接相连的二级结点合并得到的内特征、从与 MiM_i 有路径连通的二级结点合并得到的外特征.

    前面展示的毁约片段生成的规范化合约图如下所示:

    2

消息传播网络

输入: 规范化的合约图,漏洞真实标签

输出:合约图中各结点的漏洞 0/10/1 标签

DR-GCN

​ 图卷积传播公式定义如下:

Xl+1=σ(D^12A^D^12XlWl)X_{l+1} = \sigma(\hat{D}^{-\frac{1}{2}} \hat{A} \hat{D}^{-\frac{1}{2}} X_l W_l)

​ 其中,A^\hat{A} 代表邻接矩阵 AA 与自连接矩阵 II 的和,XlX_l 代表第 ll 层的特征矩阵,$\hat{D} $用于规范化邻接矩阵 A^\hat{A}WlW_l 代表可被训练更新的权重矩阵.

​ 作者对这个公式进行了更新,将 邻接矩阵 AA 平方以便增大连通性,且考虑到在此前已对合约图进行规范化,因而将 D^\hat{D} ,最后得到新的 DR-GCN 传播公式

Xl+1=σ((A2+I)XlWl)X_{l+1} = \sigma ((A^2 + I)X_lW_l)

时间消息传播网络

​ 包括 两个阶段:消息传播+读出.

3
  • 消息传播阶段: TMP按照时间顺序依次沿着边传播消息. 对于结点 ViV_i,初始状态为 hi0h_i^{0},代表其特征向量,第 kk 个时刻通过第 kk 条边 eke_k 传递消息,并更新结点 VekV_{ek} (即 eke_k 的终止结点)的特征. 第 kk 时刻的消息 mkm_k 由边 eke_k 的初始结点的隐藏状态 hskh_{sk} 和边类型 tkt_k 组成:

xk=hsktkmk=Wkxk+bkx_k = h_{sk} \oplus t_k \\ m_k = W_k x_k + b_k

​ 最初 xkx_k 包含eke_k 的初始结点及其本身,经过网络超参数 WkW_kbkb_k 更新,到达 eke_k 的终止结点后,通过聚合终端结点自身隐藏状态 hekh_{ek} 、传递过来的消息、先前的状态,其自身隐藏状态被经过tanh激活函数被更新为 h^ek\hat{h}_{ek} .

  • **读出阶段: ** 遍历图中所有边后,通过计算所有结点的隐藏状态 h^i\hat{h}_i,得到 G 的预测标签 y^=i=1Vf(hiT)\hat{y} = \sum_{i = 1} ^{|V|} f(h_i^T),考虑到最后时刻的隐藏状态 hiTh_i^T 和最初的状态 hi0h_i^0 对于漏洞预测任务具有启示性,因此更新 y^\hat{y} 的计算方式:
4

【实验】

  • 数据集:ESC(Ethereum Smart Contracts)用于实验可重入漏洞时间戳依赖漏洞 ; VSC(VNT Chain Smart Contracts) 用于实验 无限循环漏洞

  • 数据集划分:训练集 : 测试集 = 2 : 8

  • 对比: DR-GCN & TMP,对照其他 12 个智能合约漏洞检测方法

    • Oyente; Mythril; Smartcheck; Scurify
    • Vanilla-RNN, LSTM, GRU, GCN
    • Jolt; PDA; SMT; Looper (用于无限循环漏洞)
  • 指标: accuracy; recall; precision, F1 score

    按照漏洞的类型和检测模型分别进行对比:

  • 可重入漏洞检测对比:

    • 5
  • 时间戳依赖漏洞检测对比:

    • 6
  • 无限循环漏洞检测对比:

    • 7

    基于三种漏洞类型检测的对比,可以看到 DR-GCN 和 TMP模型在智能合约漏洞检测中的优越性能,能够直观看到图卷积神经网络在智能合约漏洞检测问题中的巨大潜力, 且TMP较DR-GCN有了更进一步的提升,在各个指标上都达到了对比算法中的最佳性能.

    ​ 此外,作者通过与使用神经网络进行智能合约漏洞检测的方法进行对比,进一步说明了一味将源代码看作时间序列是不合适的,在漏洞检测任务中容易丢失掉很多有价值的信息,尤其是程序的结构信息(函数变量之间的调用关系),这更启示我们应当将源码转化为图的必要性.

【总结】

​ 本paper提出了一个自动化智能合约漏洞检测器. 通过考虑程序间的结构关系,提出了利用图神经网络在智能合约漏洞检测领域的应用,并通过实验验证了这样的检测方法对于智能合约漏洞检测的有效性.

【后记】

​ 这篇paper再次向我展示了图神经网络对于存在“依赖关系”的问题进行建模的有效性. 图卷积不仅能够在社交网络中挖掘到不同阶级关系之间的特征影响,也可以将转化为图的代码进行建模,得到不同代码之间的调用关系. 这对层次化结构模型的分析有很大的帮助作用,除了从异常函数中学习特征以外,还可以用于 IDE 中进行智能代码分析等. 这篇paper是将智能合约源码作为数据集,对其中的某些关键函数直接打上了异常标签,这样以数据驱动的检测方法可以考虑能否分解为更细粒度的诱因.