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

传统智能合约代码审计,多使用纯人工或者形式化验证等切片穷举的方式,而且涉及到代码审计审计人员水平高低不一样,容易导致审计结果出现偏差。人工方式受到个人能力所限,质量无法保证,且人力疏忽的可能性远高于自动化程序。
传统自动化程序又无法发现逻辑、业务范畴的风险。
背景
以太坊支持图灵完备的智能合约协议,整个生态有许多人基于以太坊开发自己的Dapp,生态得到了蓬勃发展。这其中,绝大部分被广泛使用的合约,均为Token代币合约。这些合约,为用户的资产在区块链网络中流通提供了极大的助力。
基于以太坊生态的合约代币,价值已相当客观,甚至有个别币种达到数亿美金。
同时,也不乏很多“问题币”,这些“问题币”在代码层面上实现的时候,开发人员由于自身水平问题或者限于项目开发时间制约,导致代码部署到以太坊之后,存在风险,所有的合约代码或opcode,都公开在区块链上,这就容易遭受到黑客的定向攻击,一旦黑客们开始尝试利用这些问题合约的漏洞,对很多项目来说,几乎就是灭顶之灾,交易所和用户损失惨重,所以一个合约部署之前,或者合约部署之后,安全专家可以对部署代码做安全审计,发现其中隐藏问题。目前仅以太坊上的合约项目,远大于全球安全专家数量,每一名安全专家在合约代码审计上所付出的精力太多,这就迫切需要一个自动化,智能化的系统,能自动审计日益增长的合约代码,同时要能保障其审计能力不会低于专家水平。
近年来,机器学习迅速发展,而其中的深度学习更是独领风骚,已经在视觉计算和自然语言处理等方向取得了显著的成绩,解决了众多场景下难题,我们研究人员借力深度学习技术,借助安全专家已经审计的大量合约做标签数据,研发了一套专门适用于智能合约代码审计的引擎,经过数据测试,其审计能力比肩人工审计,但是效率远超过人工。
模型结构
整个模型结构简要如下所示。
图片1.png
方法
预处理阶段
通过专家的指导了解到,由于应用层代码里面大量人为定义的变量,如果选择源代码作为输入的时候,会有很多不可预知的因素在里面,比如两个合约,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 来输出最大可能性标签,用来预测结果。
训练表现:
训练准确率如下图所示:
图片2.png
橙色线条代表测试样本的准确率,可以看到随着训练迭代次数的增加,准确率在缓慢攀升。目前由于积累的样本不够完善,可以看到训练过程中模型loss的波动比较大,但可以期待的是,随着样本的完善和积累,整体效果会愈发明显。
总结:
在特定场景下,深度神经网络展现了不俗的表现能力,我们希望借助深度学习模型强大的泛化能力,切实解决一些合约代码的安全问题,同时也在不断探索深度学习技术在区块链行业的新应用方向。

发表评论

电子邮件地址不会被公开。 必填项已用*标注