首页   >  关于我们   >  新闻中心   >  区块链智能合约安全事故典型案例回顾分析
返回
区块链智能合约安全事故典型案例回顾分析
  • 2021.02.25
  • 1090

智能合约开发者很容易在缺乏经验和警惕的情况下,写出存在安全漏洞的智能合约代码,并且未经充分的测试和审计,匆忙部署上线,最终酿成严重的安全事件。

 

CSA GCR区块链安全工作组智能合约小组通过分析经典的智能合约安全事件案例,带读者更深入地理解智能合约安全。

 

【原创作者】郭宇、黄连金、吴潇、姚昌林、赵伟(按照字母排序)

【审核专家】郭文生、叶振强、于晓航、余弦、祝烈煌(按照字母排序)

【贡献单位】长亭科技、知道创宇(按照字母排序)
 

 

1  重入漏洞
 

2016年6月18日,针对 DAO 合约的攻击导致超过3,600,000个 Ether 的损失。攻击源于 DAO 一个关键合约引入了重入漏洞,黑客可以对转账函数进行递归重入,在不减少个人余额的情况下不断地提走以太币。这次攻击之后的以太坊硬分叉导致了以太坊社区的分裂。
 

2  整数溢出漏洞

 

整数溢出漏洞也是智能合约中常见的安全漏洞。例如, uint256 是以太坊智能合约语言 Solidity 中最常用的无符号整数类型,它可表示的整数范围为 0 ~ 2256 - 1。当程序中的计算结果超过此范围时,就会发生整数溢出。且一旦发生,后果通常十分严重。在智能合约中,整数通常与 Token 账户余额或者其他关键程序逻辑相关。利用整数溢出漏洞,精心构造传入参数,可以让程序极大地偏离本来的设计意图,从而引发一系列难以预知的问题。

 

2018年4月22日,黑客攻击了美链 (BEC) 的 Token 合约,通过一个整数溢出安全漏洞,将大量Token 砸向交易所,导致 BEC 的价格几乎归零。

2018年4月25日,SMT 爆出类似的整数溢出漏洞,黑客通过漏洞制造和抛售了天文数字规模的 Token,导致 SMT 价格崩盘。

 

整数溢出漏洞可能造成以下严重后果:

1. 使程序偏离设计意图

2. 实现 Token 无限量增发

3. 绕过权限控制或余额校验

4. 完成一些虚假操作

5. 被 Token 管理员利用,留下作恶空间

 

3

合约库安全问题

 

2017年11月06日,Parity 多重签名钱包漏洞导致了超过 513,701 个以太币被锁死,至今关于以太坊是否需要通过硬分叉方式升级 (EIP999) 争论还在继续。
 

4

复杂 DeFi 协议组合安全

 

2020年2月15日、2月18日,DeFi 项目 bZx 借贷协议遭遇两次攻击,先后损失 35 万美元和 64 万美元。两次攻击手法复杂且不完全相同,利用新型借贷产品“闪电贷”将攻击成本降至最低并扩大攻击收益,同时又与价格预言机、杠杆交易、借贷、价格操纵、抢先交易紧密关联,充分利用了多个 DeFi 产品间的可组合性来达到攻击目的。

 

2020年4月19日,去中性化借贷协议 Lendf.Me 遭遇黑客攻击,合约内价值 2500万美元的资产被洗劫一空,直接原因在于产品本身的可重入问题和特殊的 ERC-777 类型代币 imBTC 组合之后引入的新的安全风险。同时因为此问题被攻击的还有 Uniswap 去中心化交易所。

 

5

非标准接口

 

以最被广泛接受的智能合约 Token 标准 ERC20 为例,很多 Token 合约未参照 ERC20 标准实现,这给 dApp 开发带来很大的困扰。数以千计的已部署 Token 合约曾经参考了以太坊官网(现已修复)以及 OpenZeppelin(52120a8c42 [2017年3月21日] ~ 6331dd125d [2017年7月13日]) 给出的不规范模版代码,多个函数实现没有遵循 ERC20 规范,导致 Solidity 编译器升级至 0.4.22 后出现严重的兼容性问题,无法正常转账。

 

6

管理员权限过高或较中心化

 

2018 年 7 月 10 日,加密货币交易平台 Bancor 称遭到攻击,丢失了折算法币金额为 1250 万美金的以太坊,1000 万美金的 Bancor 代币和 100 万美金的 Pundix 代币。这次攻击黑客并非利用了 Bancor 平台合约的漏洞,而是通过盗取了其智能合约管理员账户的私钥。Bancor 主要合约包括 SmartToken 和 BancorConverter,分别为 ERC20 Token 合约以及与业务相关的 Token 转换交易合约。此次被盗事件与 BancorConverter 合约有关,攻击者极有可能获取了合约管理员账户的私钥,对转换代币合约 BancorConverter 拥有极高权限。owner 作为该合约的所有者和管理员,有唯一的权限通过 withdrawTokens() 方法提走合约中的全部 ERC20 Token 至任意地址。事件发生后不少人质疑 Bancor 项目智能合约中 owner 管理员的超级权限,甚至称之为“后门”。
 

7

业务逻辑与区块链共识产生冲突

 

曾经红极一时的类 Fomo3D 游戏,就曾因「随机数预测」攻击和「阻塞交易」攻击丧失游戏公平性,沦为黑客淘金的重灾地。

 

类 Fomo3D 游戏的空投机制利用「随机数」来控制中奖概率,但是由于随机数的来源都是区块或者交易中特定的一些公开参数,如交易发起者地址、区块时间戳、区块难度等,因此在以太坊上可以很容易的预测所谓的「随机数」。

 

而「阻塞交易」攻击是黑客通过高额手续费吸引矿工优先打包,并利用合约自动判断游戏进行状态,以之作为是否采取攻击的依据。黑客最终能够以较低成本堵塞区块,每个区块中仅打包很少的交易(降低他人交易被打包的可能性),使得游戏快速结束,并提高自己获得最终大奖的概率。所有采用类似机制,即需要玩家抢在某个时间范围内完成某种竞争操作的智能合约,都会受此威胁。

 

类 Fomo3D 游戏中黑客利用了以太坊共识协议的特点,找到游戏机制的漏洞进而发起攻击。智能合约游戏或应用的业务设计是一项极其复杂的系统工程,除了代码本身,还涉及到平台外部环境,博弈论等方面问题,这也是容易被黑客攻击的环节。因此,在业务设计过程中应尤为慎重,必须充分考虑区块链的特性。
 

8

开发者应持续关注更多安全案例

 

除了上面提到的典型案例外,智能合约领域还有很多值得研究的漏洞案例,并且各类新型的攻击手法层出不穷。智能合约本身还很不完善,并且还处在爆发式地发展中,存在着各类未知风险。为了开发成熟、安全、可靠的智能合约,开发者应持续关注更多安全案例,从中学习经验教训。
 



从智能合约开发者方面来看,区块链项目的爆发吸引了大量开发者,而这些开发者往往只能从简单的参考和修改网上良莠不齐甚至有严重漏洞的示例代码开始进行学习开发。对于资深智能合约开发者而言,实现安全无漏洞的智能合约依旧是不小的挑战。事实上,开发者可以通过遵循最佳实践的方法,提高代码质量,降低安全风险。


智能合约安全最佳实践的方法在《智能合约安全指南》白皮书中有详细介绍,可在“研究成果”页面下载进行详读。