卷积神经网络在智能合约审计中的应用

原创
2277 天前
3131

引言

传统智能合约代码审计,多使用纯人工或者形式化验证等切片穷举的方式,而且涉及到代码审计审计人员水平高低不一样,容易导致审计结果出现偏差。人工方式受到个人能力所限,质量无法保证,且人力疏忽的可能性远高于自动化程传统自动化程序又无法发现逻辑、业务范畴的风险。

背景

以太坊支持图灵完备的智能合约协议,整个生态有许多人基于以太坊开发自己的Dapp,生态得到了蓬勃发展。这其中,绝大部分被广泛使用的合约,均为Token代币合约。这些合约,为用户的资产在区块链网络中流通提供了极大的助力。 基于以太坊生态的合约代币,价值已相当客观,甚至有个别币种达到数亿美金。同时,也不乏很多“问题币”,这些“问题币”在代码层面上实现的时候,开发人员由于自身水平问题或者限于项目开发时间制约,导致代码部署到以太坊之后,存在风险,所有的合约代码或opcode,都公开在区块链上,这就容易遭受到黑客的定向攻击,一旦黑客们开始尝试利用这些问题合约的漏洞,对很多项目来说,几乎就是灭顶之灾,交易所和用户损失惨重,所以一个合约部署之前,或者合约部署之后,安全专家可以对部署代码做安全审计,发现其中隐藏问题。目前仅以太坊上的合约项目,远大于全球安全专家数量,每一名安全专家在合约代码审计上所付出的精力太多,这就迫切需要一个自动化,智能化的系统,能自动审计日益增长的合约代码,同时要能保障其审计能力不会低于专家水平。

近年来,机器学习迅速发展,而其中的深度学习更是独领风骚,已经在视觉计算和自然语言处理等方向取得了显著的成绩,解决了众多场景下难题,我们研究人员借力深度学习技术,借助安全专家已经审计的大量合约做标签数据,研发了一套专门适用于智能合约代码审计的引擎,经过数据测试,其审计能力比肩人工审计,但是效率远超过人工。

模型结构

整个模型结构简要如下所示:


方法

预处理阶段:

通过专家的指导了解到,由于应用层代码里面大量人为定义的变量,如果选择源代码作为输入的时候,会有很多不可预知的因素在里面,比如两个合约,A合约函数声明function transfer(address _to, uint256 _value),B合约函数声明function transfer(address to, uint256 token)从源代码层面上来说,是有很大区别的,但是对代码解析器来说,这两者几乎没有区别的,所以我们选取编译后的opcode 作为整个模型的原始输入,收集到原始的opcode的之后,我们仍然需要人工处理,比如操作数,简单的统一处理,以一个特殊的字符串来替代,有特殊含义的立即数,则原样保留,在送到整个模型之前,采用词嵌入方法,得到数据的向量形式,来表征我们的样本数据。

卷积核的选择:

由于文本的数据表示与图片在形式上完全不同,所以核的大小需要与输入层的宽保持一致,经过计算后得到feature map。

池化操作:

文本的表征和图片相比,不存在通道概念,同时,也需要避免在batch上做池化操作,窗口滑动时候,按照步长1来滑动。

中间层特征合并:

我们把多类不同核之后的的特征,合并起来,作为下一层的输入,同时为了防治过拟合,引入dropout ,概率取0.5来操作。

全联接层:

经过dropout 的操作后,通过全联接层,我们计算特征潜在的权重,最后通过softmax 来输出最大可能性标签,用来预测结果。

训练表现:


橙色线条代表测试样本的准确率,可以看到随着训练迭代次数的增加,准确率在缓慢攀升。目前由于积累的样本不够完善,可以看到训练过程中模型loss的波动比较大,但可以期待的是,随着样本的完善和积累,整体效果会愈发明显。

总结:

在特定场景下,深度神经网络展现了不俗的表现能力,我们希望借助深度学习模型强大的泛化能力,切实解决一些合约代码的安全问题,同时也在不断探索深度学习技术在区块链行业的新应用方向。