区块链技术作为新一代信息技术的底层技术,以其可信任性、安全性和不可篡改性,让更多数据被解放出来,推进了数据的合理利用,在数字资产管理、社会治理、商业交易、物联网、知识产权保护乃至智能制造等领域拥有广阔的应用前景#2019年10月24日,中共中央政治局就区块链技术发展现状和趋势进行第十八次集体学习,中共中央总书记习近平强调区块链技术的集成应用在新的技术革新和产业变革中的重要作用,要把区块链作为核心技术自主创新的重要突破口,着力攻克一批关键核心技术,加快推动区块链技术和产业创新发展$同其它新技术一样,区块链技术发展也面临新的安全问题,如区块链中的共识算法会随着密码学和计算技术的发展而变得越来越脆弱,对计算资源的掌控可能导致糸统混乱,区块链隐私保护与匿名追溯难等问题$开展区块链安全技术研究,对解决行业应用痛点,推进传统产业数字化转型,提高数字经济发展效率和质量具有重要现实意义$
盖珂珂,北京理工大学网络空间安全学院,特别副研究员,博士生导师,担任
新工科联盟区块链工作委员会秘书长、IEEE智慧计算特别技术社区秘书长、中
国计算机学会区块链专委会常务委员%从事区块链、云计算安全等方向的教学和
科研工作,主持国家自然科学基金项目、国防预研项目、国防基础科研计划、省部
级自然科学基金重点研发项目等10余项,发表论文150余篇%
关志涛,华北电力大学控制与计算机工程学院,副教授,博士生导师,中国计
算机学会(CCF)区块链专委委员,CCF物联网专委委员,中国人工智能学会智能
信息网络专委委员%从事区块链与应用密码学、人工智能安全等方向的教学和科
研工作,主持国家自然基金项目2项、北京市自然基金1项、横向课题10余项,
获得省部级奖1项,发表学术论文80余篇%
智能合约安全问题与研究现状
赵辉1,李星1,谭嘉诚1,盖珂珂2
(1.河南大学软件学院,河南开封475000;2.北京理工大学网络空间安全学院,北京100081)
摘要:智能合约是运行在区块链上的程序,具有去中心化、不可篡改的特性,被广泛应用于金融、能源、物联网等多个领域%然而智能合约一旦实际部署到实时网络上就不能对其更改,在保证合约安全的同时,缺陷和错误也不能通过修改合约代码得以解决,从而导致重大的安全事故%因此合约实际部署前对其进行安全测试已经成为迫切需要解决的问题%介绍了因智能合约漏洞引起的安全事件,对常见的合约漏洞进行详细分析,完成对已有合约分析工具的总结,体现了合约安全问题的研究发展现状%
关键词:智能合约;漏洞分析;区块链;安全分析工具
中图分类号:TP301文献标识码:A DOI:10.19358/j.issn.2096-5133.2021.05.001
引用格式:赵辉,李星,谭嘉诚,等.智能合约安全问题与研究现状[J].信息技术与网络安全,2021,40(5):1-6, 19.
《信息技术与网络安全》2021年第40卷第5期投稿网址:www.pcachina
Research status of smart contract security
Zhao Hui1,Li Xing1,Tan Jiacheng1,Gai Keke2
(1.Software College,Henan University,Kaifeng475000,China;
2.School of Cyberspace Science and Technology,Beijing Institute of Technology,Beijing100081,China)
Abstract:Smart contract is a program running on the blockchain,which is decentralized and tamperable.It is widely used in finance,energy,Internet of Things and other fields.However,once the smart contract is actually deployed on the real-time network,it can not be changed.While ensuring the security of the contract,defects and errors can not be solved by modifying the contract code,resulting in major security incidents.Therefore,it has become an urgent problem to test the security of the contra
ct before the actual deployment .This paper introduces the security incidents caused by smart contract vulnerabilities,analyzes the common contract vulnerabilities in detail,and summarizes the existing contract analysis tools ,which reflects the research and development status of contract security issues.
Key words:smart contract;vulnerability analysis;block chain;security analysis tool
0引言
智能合约的概念最早由美国著名计算机学科学家SZABO N234提岀,由于当时技术发展和缺乏可信执行环境等原因,智能合约并没有得到良好的应用。直到一个化名为中本聪的学者提岀了比特币的概念224,其底层技术区块链的兴起重塑了智能合约,解决了之前技术不成熟和应用场景缺失等问题。
区块链具有去中心化、不可篡改等特性,为智能合约提供了一个解决信任问题的机制。相较于传统的金融合同,智能合约有很多的优点,智能合约执行的过程不需要可信的第三方的参与,一旦满足合约中的条件,相应的条款将会被强制自动地执行。智能合约降低了信任成本,并且将用户使用合约的门槛降低。基于智能合约的区块链技术广泛应用于金融234、能源244和物联网254等领域。
随着智能合约的迅速发展,智能合约复杂性不断增加,面临着许多不可忽视的安全问题,频发的合约攻击事件表明,智能合约的安全问题十分严重,智能合约漏洞的研究受到了广泛的关注。
本文的主要贡献:
(1)对2016年以来发生的典型智能合约攻击事件进行了总结。
(2)对智能合约的常见漏洞进行了总结,并详细介绍其原理。
(3)对常见的安全分析工具进行了介绍,并对各个分析工具进行了比较。
本文首先对近年来发生的典型合约攻击事件进行了简介和分析;接着详细地分析了智能合约的安全漏洞;然后介绍了常见的安全分析工具;再对常见的分析工具进行了详细分析;最后对本文的工作进行了总结。
1智能合约的安全事件
随着智能合约技术的快速发展,近年来智能合约的攻击事件频频发生,本节着重介绍了近年来发生的典型合约攻击事件。
2016年6月17日The DAO264受到攻击。主要由于splitDAO函数中存在的漏洞,该函数先向用户进行了转账,之后才对用户的余额等变量进行了更新,同时转账调用了攻击者的fallback函数,产生了重入漏洞。The DAO事件对以太坊274的发展产生巨大的影响,造成了以太坊的分叉,形成了两条链:一条为ETC,另一条为ETH。
2017年7月19日,Parity Multisig284电子钱包由于合约漏洞造成以太币被窃取。该漏洞主要是由于Delegatecall函数使用不当造成的。攻击者通过Del­egatecall函数调用了initWallet函数,通过initWallet函数调用initMultiowned函数,由于initMultiowned函数未作校验使得钱包初始化函数顺利执行,攻击者成为了合约的拥有者,之后攻击者调用execute函数进行转账。
2018年4月22日,黑客对美链的智能合约进行了整数溢岀的攻击,漏洞由batchTransfer函数引起,该函数用于同时给多个人转账。由于没有对溢岀进行检测,攻击者通过构建较大的转账金额_value,导致转岀总金额amount被溢岀为0,转账方减去被溢岀的amount,而接收方却收到一value金额的转账。攻击者通过这种方法凭空产生了大量的。
2019年,EOSPlay遭到了新型的随机数攻击,由
2投稿网址:www.pcachina《信息技术与网络安全》2021年第40卷第5期
于EOSPLay 采用未来区块的哈希作为开奖的依据。
攻击者通过发送大量交易,达到预测未来区块哈希
的目的。
2020年4月,攻击者对DeFi 平台Uniswap 的智能
合约实施可重入攻击,该攻击者利用遵守ERC777 协议规定的发生转账会调用发送者的
tokensToSend 函数实施攻击。漏洞合约先向攻击者
进行了转账ETH  ,其次才将转进合约。转
进合约时调用攻击者经过恶意修改的tokensToSend  函数从而再次调用漏洞合约。由于此时未被转
进合约,根据合约兑换比例公式,攻击者可以获取 额外的利益。
2智能合约的常见漏洞
近年来,频发的合约攻击事件对区块链的生态 带来了巨大的损失,多数是由合约常见漏洞⑼引起 的,本节对典型的合约漏洞进行总结,并详细介绍 其原理!
2.1重入漏洞
重入漏洞是智能合约的典型漏洞之一,引发了
The  DAO 事件。重入攻击发生在转账操作,攻击借
助于fallback 函数的特性和足够的gas 。漏洞合约首 先对用户进行了转账,之后才从用户余额中减去金 额。由于Solidity 语言的特性,转账操会调用fallback
函数,攻击者对fallback 函数进行修改,再次调用漏
洞合约的转账操作,此时合约未将余额从用户地址 中减去,在gas 耗尽之前,循环转账将不断发生。
针对重入漏洞进行说明,当攻击者调用漏洞合 约的转账函数,漏洞合约将会向攻击者进行转账操 作,进而触发攻击合约的fallback 函数中的恶意代码,
攻 击 者 在 其 fallback  函 数 中 再 次 恶 意 调 用 漏 洞 合 约 的转账函数,将会使漏洞合约重复转账,对其造成 巨大的经济损失。预防重入漏洞可以使用限制gas  数量的send 函数或transfer 函数代替call 函数进行
转账,对用户余额的改变在转账之前进行。原理如 图1所示。
2.2 Delegatecall  漏洞
Delegatecall 操作是一种特殊的消息调用,普通消
息调用执行之后,执行环境会进行改变,目标代码在
被调用者的合约上下文中执行。而Delegatecall 的特 殊之处在于,执行环境不进行改变,目标代码是在 调用者合约的上下文环境中执行的,并且msg.sender
和msg.value 的值依旧是调用者的值,调用栈同样保 持不变。
对Delegatecall 函数的滥用会导致严重的安全 问题,如Delegatecall 调用的合约会直接对调用者的
状态变量进行修改,从而引发不可预期的后果。使 用Delegatecall 调用应该谨慎,需要保证调用合约的
可靠!
2.3整数溢出
造成整数溢出的主要原因是由智能合约的编
程语言Solidity 的整数类型导致的。在以太坊虚拟 机中整数是无符号、固定大小的数据类型,因此整
型变量在以太坊虚拟机中是具有一定的范围的,如
果超过了这个范围就会出现错误,导致整数上溢或 下溢。
针对整数溢出进行说明,一个uint8类型的变量, 只能存储的范围是0到255,如果将255这个数字 存储在一个uint8类型中,使其进行加一操作,数字 最终会变成0,这就是整数上溢,整数下溢与上溢 的原理类似。原理如图2所示。
图2整数溢出原理
111111
1
1
加一
00000000
最终结果
0000
图1重入漏洞原理
2.igin 依赖漏洞
tx . origin 为Solidity 智能合约中的全局变量,通过
回溯整个调用栈并返回原始发送者的账户地址。使 用tx.origin 来检测合约调用者可能会使合约变得脆
弱。采用tx.origin 进行授权,授权地址将会被存储 到tx . origin ,对方可以使用fallback 函数调用合约并
获得授权。msg . sender 是当前发生调用的账户或合
《信息技术与网络安全》2021年第40卷第5期 投稿网址:www . pcachina . com
3
约地址©在智能合约授权时应尽量使用msg .sender  代替 tx. origin  o
利用tx .origin 攻击需要提前部署攻击者合约,
通过钓鱼等手段使漏洞合约向攻击者合约转账,达
到调用攻击者的fallback 函数和获取tx.origin 值的 目的!由于 tx . origin  指向最初发起交易的地址,通 过fallback 函数调用漏洞合约中以tx.origin 作为授
权的转账函数,授权会获得通过,攻击者因此可以
发起恶意转账操作。原理如图3所示。
图in 依赖漏洞原理
2.5短地址攻击
短地址攻击主要出现在基于ERC20类型的代 币合约中,在EVM 层面中,十六进制的字节码构成
了交易消息的输入。该字节码主要由三个部分组 成,分别为方法名哈希值、交易目标地址和转账金
额,所占字节分别为4个字节#32个字节和32个字节©短地址的攻击是指攻击者首先通过构造末尾 为零的地址进行合约调用,然后在调用参数中故意 将地址末尾的零舍去,利用虚拟机在读取合约调用
输入时,对长度不符合要求的字段自动进行末尾补
零的操作,从而造成参数的移位扩大。
针对短地址攻击进行说明,假设一段68个字节 的字节码为L  :
a8016bcd000000000000000000000000235deb8d6b9fc  d5b6d4e576c4db3f7d2e3f5cd000000000000000000000000
000000000000000000000000000000000000000001
其中,4字节函数签名:a8016bcd ,交易目标地址:
000000000000000000000000235deb8d6b9fcd5b6d4e  576c4db3f7d2e3f5cda00
转账金额:
0000000000000000000000000000000000000000000000000000000000000001没有基础学编程好学吗
交易目标地址最后的两个数字为零,攻击者将
地址最后的两个零给抹去,字节码就会变成67位,
虚拟机会自动在末尾进行补零,补零后的转账金 额为:
00000000000000000000000000000000000000000000 00000000000000000100
显然转账金额比原来扩大了 256倍。
2.6访问控制
智能合约中,如果没有标明函数的可见性,就不
能做到充足的权限检查,这就表明攻击者可以访问 到不该访问的函数和变量,并且可以进行修改。
以Solidity 编程语言为例,在Solidity 中对函数有
4 种可见性修饰分别为 public  # internal  # private  # external 。
如果用Solidity 来编写智能合约时没有指定可见性
修饰符,那么函数默认的可见性为public ,则转账等 重要函数就缺少访问控制,攻击者就可以从合约账
户中提取以太币。因此会产生访问控制不当的漏 洞,造成用户的损失。
3安全分析工具
智能漏洞引发的安全事件造成巨大的损失,诸 多工具被提出用于分析合约漏洞,LUU  L L10M 等较早
关注合约安全提出了 Oyente ,基于Oyente  —些方法
被提出,如TORRES  C  F [11]在Oyente 的基础上关注 整数相关的漏洞:TSANKOV  P [12]等人提出了一种静
态分析框架Slither  ; FEIST  J [13]等人提出了自动化的
安全分析工具Securify  ; KALRA  S 等人为了验证合
约的公平性和正确性提出了 Zeus  ; TIKHOMIROV  S [14] 提出SmartCheck 。本节对这些安全分析工具进行了
介绍!
3.1 Oyente
Oyente 是基于符号执行进行漏洞检测工具,以
智能合约的字节码和以太网全局状态作为输入,以 合约存在的安全问题和有问题的符号路径作为输
出,包括4个核心组件:控制流生成器、探索器、分
析器#验证器。控制流生成器生成骨架控制流图;探
索器会通过添加边来完善控制流图;分析器以探索
器输出的符号路径为基础,收集表现出不同以太流 的路径用以漏洞分析;验证器主要作用是消除漏洞 检测可能发生的误报。
Oyente 是较早针对智能合约漏洞提出的检测工
具,能够检测严重的智能合约错误,但是仍然存在
缺点。Oyente 会出现假阳性,不能为智能合约提供
完全的保护。在识别合约自杀和滥用发送源等方面
投稿网址:www . pcachina . com  《信息技术与网络安全》2021年第40卷第5
也是不成功的。
3.2Secruify
Secruify提岀了符合模式和违反模式,通过这两
种模式来反映智能合约的安全属性!该工具首先对EVM字节码进行反编译。随后,Securify分析智能合
约以推断语义事实,其中包括数据和控制流的依赖
关系,因为它们控制着合约的所有行为。在获得语
义事实之后,Securify给岀符合性和违反性安全模式,得岀安全分析结果。Secruify所有模式都是用特
定于该领域的语言。
相比于Oyente,Securify分析了所有的合约行为,
从而避免了不必要的错误否定!然而,Secruify也存
在一些问题,首先它不能识别整数溢岀,其次它没
有提供正式的语义或可靠性证明,因此会导致一些
潜在的安全问题存在。
3.3Slither
Slither是一种静态分析框架。其输入为智能合
约经过编译后得到的Solidity抽象语法树。首先,Slither获得合约继承图、控制流图和表达式列表°
其次,Slither将合约的代码转换为SlithIR。在代码分
析阶段,Slither进行预先定义的分析,包括变量依赖、
变量的读写和函数的权限控制。最后,Slither可以
将处理过的信息输入给漏洞检测等第三方工具。
相比于Secruify,Slither提高了准确性,缩短了平
均执行时间,提高了鲁棒性。然而由于Slither缺乏
形式语义,限制了它执行更详细的安全分析能力。Slither的中间表示语言SlithIR过于高级,无法准确
反映gas计算等低级信息°
3.4Zeus
Zeus是验证智能合约正确性和公平性的形式
化验证工具。Zeus首先将Solidity源代码和借助策
略生成器构建的基于XACML风格模板的验证规
则作为输入。其次Zeus从验证规则中提取断言,
根据验证规则将断言插入合约代码正确的位置。
利用源代码翻译器将嵌入断言语句的合约代码转
为LLVM中间语言表示。最后利用已有的验证工具,
如SeaHorn问,进行形式化验证。
Zeus将Solidity代码转为LLVM中间语言,因此
可以调用已有的工具作为验证器,但缺点是源代码
翻译器不可能准确表达合约代码的所有语义。和Oyente相比,Zeus减少了误报率并使验证时间缩短
了一个数量级。但Zeus在涉及数学方程属性方面《信息技术与网络安全》2021年第40卷第
无法完全验证,只能依赖用户来进行测试。
3.5SmailCheck
SmartCheck是一种可扩展的静态分析工具,该工具首先在Solidity源代码执行词法和句法分析,将合约代码转变为XML形式的中间表示。SmartCheck可以将合约代码完全转变为中间表示,并且SmartCheck为 了更好的本地化分析结果,将代码的行号也存储进XML°利用Xpath进行漏洞的检测,SmartCheck的Xp
ath匹配支持所有元素,因而不会遗漏Solidity特有的元素。
SmartCheck有其局限性,Xpath无法很好表达过于复杂的规则,对复杂漏洞的检测容易导致误报的产生,更侧重于检测简单漏洞。
4分析与比较
智能合约安全分析工具是智能合约安全方面的重要研究领域,安全分析工具采用的方法主要有静态分析、符号执行、形式化验证等方法,本节对静态分析、符号执行[16]、形式化验证口这三种方法进行了介绍,对Zeus、Slither、Oyente、Securify和SmartCheck 进行了比较,对每个安全分析工具适用的漏洞进行了总结,并对安全分析工具所面临的问题进行了简要的分析。
4.1静态分析
静态分析可以在不执行智能合约的情况下,通过对合约源代码或编译产生的中间语言的反汇编进行分析,从而发现合约中的漏洞。静态分析一般包括几个阶段。首先,静态分析需要构建中间表示(IR)。其次,利用控制流分析、污染分析等技术来丰富IR的信息。最后,利用IR构建漏洞的分析。
Slither、SmartCheck是典型的静态分析工具,Zeus 也借鉴了静态分析方法。其中Slither将Solidity源代码转为SlithIR。SmartCheck将合约代码转为XML形式的中间表示,Zeus将插入断言的Solidity代码转为
LLVM形式的中间语言。
4.2符号执行
符号执行原理是将外部输入抽象化为符号值,将智能合约中的程序抽象为执行树,然后根据外部输入值和程序的语义,进行遍历执行树。符号执行的主要思想是在程序执行过程中将不确定的输入转化为符号值,推动程序的执行。
与静态分析相比,符号执行对程序的分析更加全面和准确。Oyente属于符号执行工具,Oyente中的5期投稿网址:www.pcachina 5

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。