收藏 分销(赏)

智能合约安全漏洞及检测技术综述.pdf

上传人:自信****多点 文档编号:789785 上传时间:2024-03-18 格式:PDF 页数:17 大小:1.70MB
下载 相关 举报
智能合约安全漏洞及检测技术综述.pdf_第1页
第1页 / 共17页
智能合约安全漏洞及检测技术综述.pdf_第2页
第2页 / 共17页
智能合约安全漏洞及检测技术综述.pdf_第3页
第3页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第2卷第3期2 0 2 3年5月信 息 对 抗 技 术I n f o r m a t i o n C o u n t e r m e a s u r e T e c h n o l o g yV o l.2 N o.3M a y 2 0 2 3引用格式:闫凯伦,刁文瑞,郭山清.智能合约安全漏洞及检测技术综述J.信息对抗技术,2 0 2 3,2(3):1-1 7.YAN K a i l u n,D I AO W e n r u i,GUO S h a n q i n g.A s u r v e y o f s m a r t c o n t r a c t v u l n e r a b i l

2、 i t i e s a n d d e t e c t i o n t e c h n i q u e sJ.I n f o r m a t i o n C o u n t e r m e a s u r e T e c h n o l o g y,2 0 2 3,2(3):1-1 7.(i n C h i n e s e)智能合约安全漏洞及检测技术综述闫凯伦1,2,刁文瑞1,2*,郭山清1,2(1.山东大学网络空间安全学院,山东青岛 2 6 6 2 3 7;2.山东大学密码技术与信息安全教育部重点实验室,山东青岛 2 6 6 2 3 7)摘 要 智能合约是去中心化生态中的重要组件,它降低了

3、多方合作的信任成本,因而广泛应用于数字货币和金融等领域。智能合约在区块链上自动执行,具有不可修改和不可中止的特性,合约常常持有大量数字资产,一旦存在漏洞就有可能会造成巨大损失。随着智能合约技术的发展,合约漏洞开始从简单的语法漏洞向复杂的逻辑漏洞转变,触发漏洞的条件也可能从单一的交易演变为特定的交易序列。目前,各种针对合约的攻击层出不穷,因此开发出有效的合约漏洞检测工具显得尤为重要。为此,首先介绍了1 1个著名的智能合约漏洞;然后从静态分析和动态分析2个方面介绍了2 1个合约漏洞检测技术和工具,并从检测方法、研究对象、检测能力等方面对比这些工具,讨论了它们的优点和不足;最后,结合当前合约的安全现

4、状展望了未来的研究工作。关键词 智能合约;区块链;漏洞检测;自动化工具中图分类号 T P 3 1 1 文章编号 2 0 9 7-1 6 3 X(2 0 2 3)0 3-0 0 0 1-1 7文献标志码 A D O I 1 0.1 2 3 9 9/j.i s s n.2 0 9 7-1 6 3 x.2 0 2 3.0 3.0 0 1A s u r v ey o f s m a r t c o n t r a c t v u l n e r a b i l i t i e s a n d d e t e c t i o n t e c h n iqu e sYAN K a i l u n1,2,D

5、 I AO W e n r u i1,2*,GUO S h a n q i n g1,2(1.S c h o o l o f C y b e r S c i e n c e a n d T e c h n o l o g y,S h a n d o n g U n i v e r s i t y,Q i n g d a o 2 6 6 2 3 7,C h i n a;2.K e y L a b o r a t o r y o f C r y p t o l o g i c T e c h n o l o g y a n d I n f o r m a t i o n S e c u r i t

6、 y o f M i n i s t r y o f E d u c a t i o n,S h a n d o n g U n i v e r s i t y,Q i n g d a o 2 6 6 2 3 7,C h i n a)A b s t r a c t A s c r u c i a l c o m p o n e n t s o f d e c e n t r a l i z e d e c o s y s t e m s,s m a r t c o n t r a c t s c a n r e d u c e t h e t r u s t c o s t o f m u l

7、 t i-p a r t y c o o p e r a t i o n,s o t h e y h a v e b e e n w i d e l y a p p l i e d i n f i e l d s o f d i g i t a l c u r-r e n c y,f i n a n c e,e t c.S m a r t c o n t r a c t s a r e n o n-c e n s o r s h i p,i mm u t a b l e,a n d a u t o m a t i c a l l y e x e-c u t e d o n t h e b l

8、o c k c h a i n.C o n t r a c t s o f t e n h o l d a l a r g e n u m b e r o f d i g i t a l a s s e t s,w h i c h m a y c a u s e h u g e l o s s e s o n c e t h e y a r e b r e a c h e d.W i t h t h e d e v e l o p m e n t o f s m a r t c o n t r a c t s,v u l n e r a-b i l i t i e s h a v e c h

9、a n g e d f r o m s i m p l e s y n t a x e r r o r s t o c o m p l e x l o g i c p r o b l e m s.T h e t r i g g e r c o n d i-t i o n s h a v e a l s o e v o l v e d f r o m a s i n g l e t r a n s a c t i o n t o a s p e c i f i c t r a n s a c t i o n s e q u e n c e.A t p r e s-e n t,t h e r e

10、a r e e n d l e s s a t t a c k s a g a i n s t c o n t r a c t s,s o i t i s p a r t i c u l a r l y i m p o r t a n t t o d e v e l o p e f-f e c t i v e c o n t r a c t v u l n e r a b i l i t y d e t e c t i o n t o o l s.T h e r e f o r e,i n t h i s p a p e r,e l e v e n w e l l-k n o w n s m

11、a r t c o n t r a c t v u l n e r a b i l i t i e s w e r e i n t r o d u c e d a n d t w e n t y-o n e v u l n e r a b i l i t y d e t e c t i o n t o o l s w e r e i n v e s t i g a t e d.T h e s e i n v e s t i g a t e d d e t e c t i o n t o o l s w e r e c o m p a r e d f r o m t h e a s p e c

12、t s o f s t a t i c a n a l y s i s,d y n a m i c a n a l y s i s,d e t e c t i o n m e t h o d s,r e s e a r c h o b j e c t s,c a p a b i l i t i e s,e t c.a n d t h e i r 收稿日期:2 0 2 3-0 1-1 0 修回日期:2 0 2 3-0 2-0 4通信作者:刁文瑞,E-m a i l:d i a o w e n r u i l i n k.c u h k.e d u.h k基金项目:山东省泰山学者青年专家项目(t

13、s q n 2 0 2 2 1 1 0 0 1)信 息 对 抗 技 术2 0 2 3年s t r e n g t h s a n d w e a k n e s s e s w e r e a l s o d i s c u s s e d.F i n a l l y,t h e f u t u r e t r e n d o f t h e s m a r t c o n t r a c t w a s p r o s p e c t e d b a s e d o n c u r r e n t r e s e a r c h w o r k s.K e y w o r d s s m a

14、 r t c o n t r a c t s;b l o c k c h a i n;v u l n e r a b i l i t y d e t e c t i o n;a u t o m a t e d t o o l s0 引言区块链技术的应用正在 迅 速 改 变 金 融、物流、医疗等领域的运作方式1,它可以为这些行业提供更高效、更透明、更安全的解决方案,从而打破传统中心化机制下的瓶颈和难题。作为一个去中心化的分布式数据库,区块链利用了对等网络、密码学、工作量证明等机制,使得每个参与者都持有一个相同的副本,从而保证了数据的一致性和安全性。以太坊2作为目前第二大加密货币,市值超过了5 0

15、 0 0亿美元。以太坊是一个开源的区块链平台,它对比特币进行了拓展,实现了图灵完备的智能合约编程。智能合约部署和运行在区块链上,它可以根据预先设定的规则自动执行任务,并将结果永久地保存在链上。得益于区块链,智能合约具有去中心、易于审计、不可篡改等优点,不仅可以降低仲裁成本、避免欺诈损失,而且使得参与者无需可信的第三方介入就可以实现多方合作。基于智能合约技术的发展,以太坊上涌现出许多新概念和新应用。去中心化自治组织(d e-c e n t r a l i z e d a u t o n o m o u s o r g a n i z a t i o n,D AO)通过智能合约技术实现了整个组织在

16、没有中心化管理者的情况下运作。去中心化应用(d e c e n t r a l i z e d a p p l i c a t i o n,D A p p)可以在保护个人隐私和数据安全 的 前 提 下 提 供 各 种 服 务。在 数 字 货 币 领域3-5,智能合约在保证安全性的前提下大大降低了发 行 加 密 货 币 的 门 槛,任 何 人 都 可 以 通 过E R C-2 0合约发布自己的代币(t o k e n)。在数字资产领域6-8,非同 质 化 代 币(n o n-f u n g i b l e t o k e n,N F T)合约可以用来管理各种数字资产,例如虚拟物品、游 戏 道 具

17、、音 乐 作 品、艺 术 品 等。2 0 2 2年,N F T市场突破2 4亿美元9。N F T提供了一种安全可靠的方法来交易数字资产,也为艺术家和其他创作者提供了新的平台来出售他们的作品。去 中 心 化 金 融(d e c e n t r a l i z e d f i n a n c e,D e F i)1 0-1 1打破了传统金融机构的限制,D e F i合约根据既定的规则自动处理交易,任何人都可以通过D e F i进行借贷、储蓄、投资等金融活动,而不需要依赖券商、交易所或银行。截至2 0 2 2年底,整个D e F i市场市值超过了3 9 7亿美元1 2。随着智能合约的广泛应用,合约开

18、始频繁遭受攻击,其中最著名的是D AO攻击1 3。该攻击导致3 6 0万个以太币被盗,占到当时以太币发行总量的1 4%,最终以太坊不得不进行分叉来降低该攻击的影响。据不完全统计,仅2 0 2 1年就发生2 3 1起区块链安全事件,其中1 7 0起和智能合约直接相关1 4,D e F i合约因为安全漏洞损失超过1 3亿美元1 5。2 0 2 2年3月,R o n i n合约遭受攻击1 6,价值6.2 5亿美元的加密货币被盗,此次损失超过了2 0 2 1年8月的P o l y N e t w o r k的6.1亿美元1 7,成为目前因为安全漏洞损失最大的D e F i合约。智能合约容易遭受攻击主要

19、源于以下4个原因:首先,合约一旦部署到区块链后就无法修改,即使发现漏洞,也无法按照传统软件更新的方式进行修补和重新部署;其次,区块链是开放的,任何人都可以匿名调用链上的智能合约,这意味着没有有效的手段来追踪攻击者;再次,为了取得参与者的信任,合约通常会开源代码,这进一步方便了攻击者寻找漏洞;最后,大部分合约都缺少第三方的安全审计,有报告指出,在被攻击的合约中,仅有4 3%的合约经过了审计1 8。区块链是智能合约执行的载体,智能合约拓展了区块链的功能,构建了丰富的去中心化服务。然而,与传统软件不同,智能合约部署到区块链后无法通过暂停服务、重新部署或在线补丁等方式修复漏洞。除非采取极端措施,例如区

20、块链分叉,否则合约无法中止或修改。因此,在部署前对合约的安全性进行广泛的测试和审计至关重要。智能合约的安全问题一直是研究热点,相关学者已经提出了许多检测技术和工具1 9-2 3。其中,N a g a是一个自动化工具2 4,它可以检测合约中由权限控制引发的中心化安全风险。Q I AN等2 5介绍了5类主要的合约漏洞检测技术,并对比了这些方法的可检测类型、准确率以及效率等。TU等2 6则详细介绍了目前较为流行的1 6种检测工具的技术原理,对比了这些检测工具的优缺点。L I等2 7系统性地回顾了区块链系统的2第3期闫凯伦,等:智能合约安全漏洞及检测技术综述 安全性,分析了以太坊中智能合约的安全问题。

21、A T Z E I等2 8调研了智能合约已发生的安全攻击和未来可能面临的挑战。然而,由于智能合约技术更新迭代非常快,许多工作往往忽视了智能合约的实际发展情况。因此,本文针对现有的智能合约研究工作,结合当前合约技术的发展现状,总结了智能合约面临的安全风险和应对手段,系统地介绍了合约漏洞检测工具。1 智能合约概述智能合约概念最早可以追溯到1 9 9 4年,由N I C K提出2 9。以太坊是首个支持智能合约运行的平台,也是目前最大的去中心化平台。图1是以太坊的架构,由图可见,以太坊中每个账户包括交易数量(n o n c e)、余额(b a l a n c e)、存储的哈希值(s t o r a g

22、 e h a s h)和代码哈希值(c o d e h a s h)4个部分。每 个 区 块 头 中 存 储 着3个 梅 克 尔 树(M e r k l e t r e e)的树根,即状态树、交易树、收据树,具体的数据保存在数据库中。梅克尔树利用哈希的单向性,在密码学上保证了数据的不变性。智能合约通常由S o l i d i t y3 0等高级语言编写,然后编译为字节码运行在以太坊虚拟机上。下面将从合约的运行环境和合约编程2个方面介绍背景知识。图1 以太坊架构F i g.1 E t h e r e u m a r c h i t e c t u r e1.1 以太坊虚拟机以太坊 虚 拟 机(E

23、 t h e r e u m v i r t u a l m a c h i n e,E VM)是智能合约的运行环境,它是一个完全隔离的沙盒,在E VM中运行的代码无法访问网络、文件系统或其他进程。狭义上,E VM是指以太坊虚拟机中的状态机(m a c h i n e s t a t e),由图1可见,它包括程序计数器(p r o g r a m c o u n t e r,P C)、可用汽油费(g a s a v a i l a b l e)、栈(s t a c k)以及内存(m e m o r y)4个 部 分。广 义 上 还 包 括 账 户 存 储(a c c o u n t s t o

24、 r a g e)和 执 行 代 码(E VM c o d e)。E VM设计时考虑到了方便密码学计算,因此具有2 5 6位字宽(3 2字节)。合约开发时需要考虑数据的存储位置,E VM中数据存储分为3种:栈上存储、临时存储和永久存储。作为一个基于栈的虚拟机,E VM的所有操作都是在栈上进行的,栈上存储是免费的。临时存储占用E VM的内存,在合约执行完成后释放。永久存储则是将数据存储到区块链上,需要调用者支付一定的费用。合约调用本质上和普通的转 账 交 易 是 一 样 的,转 账 金 额 可 以 为0。E VM会检测目标账户中是否存在可执行的字节码,如果存在,则通过E VM中的解释器加载和执行

25、字节码。由于每条指令的运行都需要消耗计算资源,所以每笔交易都需要收取一定量的手续费。以太坊使用汽油费(g a s)的数量来衡量每条指令消耗的资源。调用者需要支付以太币购买汽油费,再把汽油费作为奖励分给矿工。用户可以指定他们愿意为执行交易支付的汽油费单位价格和最大限额(g a s l i m i t),最终支付的手续费为实际使用的汽油费乘以汽油费单价。多余的手续费会退还给用户,但如果最大汽油费限额不够,则抛出汽油耗尽异常(o u t-o f-g a s)。合约执行出现异常时,E VM会回滚已执行的状态,同时为了防止D o S攻击,已经消耗的汽油费不会返还给合约调用者。以太 坊 中 有2种 账 户

26、:外 部 账 户(e x t e r n a l a c c o u n t)和合约账户(c o n t r a c t a c c o u n t),他们共用一个地址空间,每个账户是长度为2 0字节的地址。外部账户的地址由私钥产生,合约账户地址是在合约创建时根据创建者的地址以及该地址的交易数量(n o n c e)确定的。从E VM视角来看,外部账户和合约账户不存在任何区别,都存在以3 信 息 对 抗 技 术2 0 2 3年太币余额和一个键值存储,只是合约账户中存在可执行字节码。合约的执行是通过交易发起的,E VM会自动检查账户中是否存在代码并自动执行。执行完成后,E VM会将执行结果(即合

27、约状态)更新到对应的账户存储中。1.2 智能合约编程智能合约通常由高级语言编写,例如S o l i d i-t y3 0、R u s t3 1、V y p e r3 2、M o v e3 3。高级语言编写的源代码需要先编译成字节码,编译后会同时产生合约的应用二进制接口(a p p l i c a t i o n b i n a r y i n t e r f a c e,A B I)。然后,开发者通过交易的方式将字节码部署到以太坊网络。A B I是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。以太 坊 征 求 意 见 稿(E t h e r e u m r e q u e

28、s t f o r c o mm e n t s,E R C)是以太坊开发者提交的协议提案。E R C中定义了技术要求,描述了合约开发必须遵循的规范。E R C后面的数字是提案的编号,目前常见的E R C标准是E R C-2 0、E R C-7 2 1以及E R C-1 1 5 5。E R C-2 0定义了可替换代币标准,允许开 发 者 在 以 太 坊 网 络 上 创 建 自 己 的 代 币;E R C-7 2 1是不可替代代币标准,在E R C-7 2 1合约中,每个代币都是独一无二的,因而被广泛应用于数字藏品领域;E R C-1 1 5 5将E R C-2 0和E R C-7 2 1这2种

29、标准相结合,同时支持可替换和不可替换代币,与此同时,E R C-1 1 5 5还 支 持 批 量 转移,显著降低了交易费用。S o l i d i t y是目前最流行编程语言,它是一种基于E CMA S c r i p t语法的面向对象编程语言。在S o l i d i t y中,合约类似于面向对象编程语言中的“类”。每个合约包含状态变量、函数、函数修饰器、事件等。S o l i d i t y是静态类型的,支持继承、库和复杂的用户定义类型以及其他功能。S o l i d i t y中的变量类型和普通编程语言类似,不同的是开发者在定义变量时需要考虑存储的位置。此外,S o l i d i t

30、y提供了单位变量和全局变量。单位包括以太币单位(如w e i、e t h e r)和时间单位(如s e c o n d、y e a r)。全局变量主要提供合约和区块链的信息,例如合约可以调用m s g.s e n d e r获取当前合约地址,调用b l o c k.t i m e s t a m p 获取当前区块时间戳等。合 约 可 以 互 相 调 用,分 为C A L L和D E L E GA T E C A L L 2种调用方式。前者在调用中会把上下文切换到目标合约中,而后者调用的代码会运行在当前合约的环境中,这意味着合约可以从其他地址动态加载代码,实现库的功能。合约调用为开发提供了便利,

31、但也带来了额外的安全风险,例如外部合约可能消耗资源过多导致合约运行失败,或者引发重入漏洞。合约的每次调用都会增加栈的深度,为了避免调用产生死循环,E VM将栈的执行深度限制为1 0 2 4,从而对合约的调用次数进行了限制。由于合约编程和传统编程存在差异性,导致合约往往会出现开发者预期之外的行为,产生安全隐患。例如,合约在转账时,如果目标地址是一个合约,且存在执行代码,则可能耗尽汽油费并且抛出异常,导致转账失败。针对这些问题,S o l i d i t y提供了例如提款模式等一些通用编程模式来限制访问状态机。这些模式有助于规范编程,减少逻辑漏洞。2 智能合约漏洞类型以太坊是一个开放的、匿 名 的

32、 去 中 心 化 平台,任何人都可以调用区块链上的智能合约。合约经部署就无法更改,因此一旦遭受攻击,往往会造成巨大损失,并且难以追责。根据合约漏洞引发的原因,可以将其分为3个层面:编程层面、虚拟机层面、区块链层面。这3个层面涉及的1 1个典型漏洞如表1所列。表1 智能合约漏洞T a b.1 S m a r t c o n t r a c t v u l n e r a b i l i t i e s漏洞分类漏洞名称 漏洞原因 编程层面整数溢出数据类型范围错误算术精度精度丢失重入攻击递归调用未处理异常未检查调用结果以太币锁定访问权限和不安全设置合约初始化错误代码错误或访问权限拒绝服务外部输入或调

33、用不安全虚拟机层面t x.o r i g i n漏洞短地址攻击t x.o r i g i n不能用于鉴权E VM未检查输入且自动补位区块链层面区块链依赖使用区块数据产生随机数交易顺序依赖交易竞争2.1 编程层面漏洞编程层面的漏洞指的是由于开发者失误,导致合约代码中存在错误,包括语法错误、逻辑错4第3期闫凯伦,等:智能合约安全漏洞及检测技术综述 误、数据边界处理错误等。这些错误可能导致合约执行失败或执行出错,从而被攻击者利用。本节结合S o l i d i t y的开发现状,详细介绍智能合约在编程层面上存在的安全问题。2.1.1 整数溢出整数溢出是编程中最常见的漏洞,分为上溢和下溢,加法、减法、

34、乘法都会造成整数溢出。在S o l i d i t y中,合约通常使用无符号定长的整数类型,从u i n t 8到u i n t 2 5 6按8位递增。E VM在整数越界时,会根据数据类型从高位截断,因此可能会产生整数溢出。攻击者可以利用整数溢出绕过合约中的条件限制语句(如r e q u i r e、i f等)实现超额转账。2 0 1 8年4月2 2日,知名代币B e t h-e r c h i p(B E C)遭受攻击3 4,攻击者利用乘法溢出凭空转出了远超发行量的B E C代币,引起持有者的恐慌和抛售。此次攻击最终导致B E C近6 5亿人民币的市值几乎归零。应对措施:为了避免合约中的整数

35、溢出,开发者应该在编写合约代码时格外注意数据类型的选择和使用。在使用S o l i d i t y 0.8及以前版本时,需 要 主 动 检 查 是 否 存 在 溢 出,或 可 利 用O p e n Z e p p e l i n库提供的安全整数类型S a f e M a t h。S a f e M a t h可以确保在数学运算中没有整数溢出,并在检测到可能的溢出时抛出异常。S o l i d i t y在其0.8版本之后的版本中加入了溢出检查,如果出现溢出,会直接回滚交易。2.1.2 算术精度S o l i d i t y不支持浮点型计算,在整数除法中,小数位会自动取0从而导致精度损失。因此,

36、不同的运算顺序可能产生不同的结果。例如,在图2中,开 发 者 的 本 意 是 根 据 预 先 设 定 的 费 率f e e P e r c e n t a g e,收取1 0%的手续费,然而在第3行中可以看出,1 0/1 0 0=0,而不是0.1,因此手续费的计算结果将始终为0。图2 算术精度F i g.2 A r i t h m e t i c p r e c i s i o n应对措施:合约中涉及运算时,开发者在编程前,应当明确计算过程和顺序,以确保计算的准确性和一致性,尽可能避免由于顺序不当、精度损失而引起的错误。2.1.3 重入攻击2 0 1 6年6月1 7日,攻击者利用重入漏洞盗取D

37、 AO合约中价值5 0 0 0万美元的以太币。这是区块链历史上最严重的一次攻击,直接导致了以太坊的分叉。智能合约可以由外部账户调用,也可以由合约账户调用。每个合约都隐式包含了一个回调函数f a l l b a c k()。如果调用的函数不存在 或 接 收 到 以 太 币,合 约 会 自 动 执 行f a l l b a c k()函数。攻击者通过重写合约中的f a l l-b a c k()函数,比如让它再次调用转账函数,从而实现重入 攻 击。目 前 重 入 攻 击 主 要 存 在3种 形式3 5:跨函数(c r o s s-f u n c t i o n)、委托调用(d e l e g a-

38、t e d)和基于构造函数(c r e a t e-b a s e d)。图3给 出了一个存在重入漏洞的示例,w i t h d r a w()函数是一个提款函数,用户可以通过调用它取回自己的以太币。合约使用b a l a n c e s记录每个账户的余额(第3行),w i t h d r a w()函数使用c a l l()方法转移以太币(第4行),并且在执行转移操作之后对账户余额进行清零(第5行)。攻击者首先调用w i t h d r a w()函数向自己的另一个合约账号转账,并且在执行第5行命令之前,利用目标合约中的f a l l b a c k()函 数 多 次 调 用w i t h

39、d r a w()函数。通过重入不断超额取款,直至取走合约账户内全部的以太币。图3 存在重入和未处理异常漏洞的取款函数F i g.3 A w i t h d r a w()f u n c t i o n w i t h r e-e n t r a n c y a n d u n h a n d l e d e x c e p t i o n v u l n e r a b i l i t i e s应对措施:智能合约中有t r a n s f e r()、s e n d()和c a l l()3种转账方法,前2种限定消耗2 3 0 0 g a s,因此没有多余的汽油费用于执行其他指令,而c a

40、 l l()默认不限制汽油费,这可能导致重入攻击。因此,如果使用c a l l()函数,应当限定汽油费。此外,合约可以实现互斥锁保护函数代码,从而防止递归调用,例如,在调用其他合约之前设置一个标志位,只有当标志位被清除后才能继续执行合约。互斥锁也可以通过继承O p e n Z e p p l i n中的R e e n t r a n c y G u a r d函数并使用n o n R e e n t r a n t修饰5 信 息 对 抗 技 术2 0 2 3年符来实现。2.1.4 未处理异常T r a n s f e r()指令执行失败会抛出异常并回滚交易,而s e n d()和c a l l

41、()则会返回一个布尔值,并继续执行后续代码。图3中不仅存在重入漏洞,还存在未处理异常,w i t h d r a w()函数没有处理第4行c a l l()调用的返回值,如果调用失败(例如汽油费数量不够),第5行仍然会将账号的余额清零,从而导致合约状态和实际情况不一致。应对措施:合约需要主动对s e n d()和c a l l()的调用结果进行判断,不能默认调用成功。对于返回结果为F a l s e的情况,需要进行处理,避免实际情况和合约状态不一致。S o l i d i t y 0.8.0版本以上的编译器会对上述未处理的返回值发出警告,开发者不应该忽视这些警告。2.1.5 以太币锁定智能合约

42、拥有自己的余 额,可 以 接 收 以 太币。然而如果合约存在漏洞,则可能会将合约中所有 的 以 太 币 锁 定。2 0 2 2年4月,一 个 名 为A k u D r e a m s的N F T项目由于合约存在逻辑错误,锁 定 了 参 与 拍 卖 人 员 的1 1 5 3 9.5枚 以 太币3 6。2 0 1 7年,P a r i t y钱包合约由于漏洞导致价值超过2.8亿美元的以太币被锁定在合约中3 7。P a r i t y合约使用了代理模式将合约的数据存储和业务逻辑分离,用一个合约存储数据,然后通过D E L E G A T E C A L L指令调用另一个合约来实现业务处理。这种模式可

43、以实现代码复用,从而降低合约的部署费用。然而P a r i t y的业务合约存在权限漏洞,攻击者可以获取业务合约的管 理 员 权 限,并 在 获 得 权 限 后 执 行 自 毁(S E L F D E S T RU C T)指令,导致P a r i t y的存储合约无法执行任何操作,从而将所有的以太币锁定在合约中。应对措施:合约一旦部署就无法修改,因此合约开发者应当提前设置好安全有效的提币方式。开发者不仅要考虑当前合约的权限设置,还要注意委托调用的合约权限是否安全。2.1.6 合约初始化错误在S o l i d i t y中,合约有2种初始化方式:构造函数和自定义初始化函数。在小于0.4.2

44、2版本的S o l i d i t y中,构造函数的名称应该和合约名称一致。在开发过程中,如果构造函数名称写错,那么原本的构造函数就会变成人人都可以调用的普通函数。M o r p h T o k e n合约就曾因为构造函数大小写不一致问题,致使合约存在所有权丢失的风险3 8。在0.4.2 2版本之后的版本中,合约使用了C o n s t r u c t o r作为构造函数的名称。然而一些合约为了避免处理复杂的构造函数参数,使用了自定义的I n i t i a l i z e函数对合约进行初始化。然而,I n i t i a l i z e函数跟普通函数并无本质区别,并不能像C o n s t

45、r u c t o r一样只能执行一次,开发者如果没有正确设置函数的访问权限,则I n i t i a l i z e函数可能可以被任何人再次调用。例如2 0 2 1年3月9日,D O D O的合约遭遇攻击3 9,造成约2 0 0万美元损失,原因在于初始化函数没有校验调用者,并且可以多次调用。应对措施:S o l i d i t y 0.4.2 2 及更高版本,支持使用 C o n s t r u c t o r 关键字来声明构造函数,而无需再和合约名一致,因此可以避免构造函数名称写错的问题。对于自定义的初始化函数,可以使用M o d i f i e r修饰器来限定函数的访问权限和调用次数。2

46、.1.7 拒绝服务合约拒绝服务是指攻击者通过破坏合约中原有的逻辑,消耗以太坊中的汽油费或计算资源,从而使合约在一段时间或永久无法正常执行。针对智能合约的拒绝服务攻击主要有以下3种:1)基于代码逻辑的拒绝服务攻击。由于合约代码存在漏洞导致合约暂时或永久无法使用。最典型的是当合约中存在对传入的映射或数组循环遍历操作时,由于外部的输入长度是不可控的,攻击者可能传入过大的映射或数组。然而每个以太坊区块都设定了汽油费上限,如果外部传入的参数导致后续的交易运行所需的汽油费超过区块上限,会导致交易一直处于失败状态。2)基于外部调用的拒绝服务攻击。这种情况是由于合约没有正确处理外部调用。例如,如果合约依赖于外

47、部函数执行的结果,但合约没有对外部函数执行失败进行处理,此时如果外部调用失败或者由于外部原因而被拒绝时,会导致每次执行交易时都会因为这个失败问题导致交易回滚,合约无法继续执行。3)合约Ow n e r导致的拒绝服务攻击。一些合约中设置了Ow n e r作为管理员角色,Ow n e r具有很高的权限,例如可以开启或关闭转账功能。如果合约Ow n e r的密钥泄露、丢失,则可能让合6第3期闫凯伦,等:智能合约安全漏洞及检测技术综述 约遭受非主观意愿上的拒绝服务攻击。应对措施:合约的拒绝服务攻击存在多种形式,首先,在编写智能合约时,应当避免出现循环遍历操作,并且需要限制外部传入参数的长度,避免超出可

48、接受范围。其次,在合约中对外部函数调用进行处理时,应当对函数返回值进行检查,确保返回值符合预期。如果外部函数执行失败,需要对失败情况进行适当的处理,例如进行回滚操作,避免导致合约无法继续执行。最后,在权限设置上应当遵循最小权限原则,在Ow n e r设置上可以采用多签名策略,避免因单一私钥泄露而引发的风险。2.2 虚拟机层面漏洞虚拟机层面的合约漏洞指的是由以太坊虚拟机E VM产生的错误。E VM是以太坊平台上智能合约的执行引擎,如果E VM中存在漏洞,则执行的合约也可能受到影响。智能合约通常由高级语言编写,然后编译成字节码在以太坊虚拟机上执行。由于高级编程语言和低级字节码之间存在语义差异,因此

49、智能合约可能会引发安全问题。此外,虚拟机本身的设计缺陷也可能会引发合约漏洞。虚拟机层面的漏洞主要有2种:t x.o r i g i n漏洞和短地址攻击,前者是由于开发者错误使用t x.o r i g i n进行鉴权造成的,后者则利用了虚拟机本身的设计缺陷。2.2.1 t x.o r i g i n漏洞一些合约错误地使用t x.o r i g i n进行鉴权。t x.o r i g i n会递归栈的调用,找到交易调用的最初发起者。因此,使用t x.o r i g i n进行鉴权时存在钓鱼攻击的风险。图4演示了利用t x.o r i g i n漏洞的钓鱼攻击。如图所示,A l i c e拥有一个钱

50、包合约(w a l l e t c o n t r a c t)用于管理自己的以太币,钱包合约中存在一个转账函数t r a n s f e r(),使用了t x.o r-i g i n进行鉴权。B o b发现钱包合约存在漏洞,因此他构造了一个钓鱼合约(p h i s h i n g c o n t r a c t),并引诱A l i c e调用钓鱼合约的b u y()函数。一旦A l i c e调用了b u y()函数,b u y()函数就会自动调用W a l l e t.t r a n s f e r()函数。B o b可以利用合约最初签名者是A l i c e,从而绕过r e q u i

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 论文指导/设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服