伴随着比特币的爆红,区块链作为其背后的技术与基础架构,成为了各国政府、研究机构、企事业单位的研讨热点。区块链的诞生可谓是人类构建价值传输网络的开始[1]。作为分布式数据存储、点对点传输、共识机制、加密算法等技术的集成应用,区块链为如何在缺少可信任通道和可信任中央节点的情况下,让分布在网络中的各节点达成共识提供了可能。由于区块链技术的迅猛发展,现已经由以比特币为代表的区块链1.0时代进入到由以太坊智能合约为标志的区块链2.0时代。智能合约是一种计算机交易协议,旨在以信息化方式传播、自我验证或自动执行合约条款。以太坊是建立在区块链和数字资产概念上的一个公共区块链平台,内置有成熟的图灵完备语言solidity以构建智能合约,目前已成为最主流的智能合约开发和运行平台。其中,基于堆栈的以太坊虚拟机 (Ethereum virtual machine, EVM)是智能合约的运行环境。开发人员可以使用高级编程语言Solidity 对智能合约进行编程,在经由EVM编译为字节码后可以执行。区块链上的智能合约具有去中心化、去信任、可编程、不可篡改等特性,可灵活嵌入各种数据和资产,帮助实现安全高效的信息交换、价值转移和资产管理[2], 因此备受关注,并在金融、物联网、供应链、电子商务、医疗健康等领域得到了广泛的应用。
近年来,在智能合约数量以及涉及的数字资产激增的同时,其上的安全漏洞事件频发,引人担忧:2016年6月,著名的DAO安全漏洞造成360万的以太币被盗走,导致了近6000万美元的经济损失; 2017年7月和11月的两轮Parity多签名钱包安全漏洞,分别造成了超15万的以太币被盗93万个以太币被冻结,共导致超过1.82 亿美元的经济损失;2018年4月,美链BEC被盗,仅仅由于一行代码的安全漏洞,就导致9亿美元的市值瞬时归零hellip;hellip;不得不说,智能合约虽然传递了价值,但其上的任意一个安全漏洞都可能会引发不可估量的财务损失。Delmolino 等人[3]同样表明,即使是很小的智能合约,也可能存在很多安全隐患问题。据统计,2018 年以太坊智能合约总量已经超过 300 万个,公开的合约超过 5 万个,其中 74.48%的公开合约都存在安全隐患[4]。因此,智能合约的安全隐患问题无疑是一个值得研究且必须研究的问题。
据分析,智能合约容易受到安全攻击原因可能有以下几点:
1) 智能合约开发与执行环境的不足:智能合约由于起步晚、发展时间短,目前还处在初级阶段,尚未有任何实质进展。因此,其编程语言(例如,Solidity)和运行时的环境本身就有很多不足;
2) 智能合约开发者的技能水平参差不齐:智能合约的每次执行都依赖于底层的区块链平台以及其它协作合约的执行。然而市面上专业的开发人员严重匮乏,不能完全理解合约 - 合约之间以及合约 - 底层区块链平台之间的隐式关系,导致编写的智能合约容易存在安全漏洞。
3) 智能合约公开透明的特性:智能合约的公开透明使得在运行时任何人都可以对其代码和数据进行查看。这一特性虽能提升用户对合约的信任度,但也大幅度降低了黑客攻击的成本,每一个部署在区块链上的智能合约都有可能成为黑客团队攻击目标和金矿。
4) 智能合约不可篡改的特性:智能合约一经部署便无法修改,任何人都可以对合约中存在的安全漏洞发起攻击,若合约中没有设计相应的抵御措施,漏洞将会被成功利用,或将导致不可估量的经济损失。
此外,NCC Group[5]总结了智能合约中出现频率最高的10类安全问题,分别为:代码重入、访问控制、整数溢出、未严格判断不安全函数调用返回值、拒绝服务、可预测的随机处理、竞争条件/非法预先交易、时间戳依赖、短地址攻击以及其他未知漏洞类型。结合邱欣欣等人[6]对漏洞发生所在层面的研究,可以将目前所发现的漏洞划分为Solidity语言层面漏洞、以太坊虚拟机层面(EVM)漏洞、区块链层面漏洞:
1)Solidity语言层面的漏洞:重入漏洞、访问控制、整数溢出、未检查 call 返回值、拒绝服务、类型混乱等漏洞。
2)以太坊虚拟机层面的漏洞:合约运行中 gas 的成本限制、堆栈调用深度限制、变量的使用类型限制以及交易过程中以太币丢失等漏洞。
