从以太坊;MorphToken事件;看智能合约构造函数大小写编码错误漏洞

作者:fenix@知道创宇404区块链安全研究团队 时间:2018/06/22

一、漏洞概述

以太坊智能合约的含义就是一组代码(函数)和数据(合约的状态),它们位于以太坊区块链的一个特定地址上。智能合约一般使用solidity语言编写。

Morpheus Network(https://morpheus.network/)与世界上一些大型航运、海关和银行公司协商,通过利用区块链的智能合约技术建立一个全面服务的、全球性的、自动化的、开放的供应链平台和一个集成的加密货币支付系统 ,发布基于以太坊的 MorphToken(https://etherscan.io/token/0x2ef27bf41236bd859a95209e17a43fbd26851f92)。

2018年6月22日,Morpheus Network 发公告(https://medium.com/@themorpheus/new-morpheus-network-token-smart-contract-91b80dbc7655)称将发布新的智能合约,以更新目前含有漏洞的合约代码。新的Token名称为MRPH,新旧Token以1:1兑换。

随后,知道创宇404区块链安全研究团队开始漏洞应急,通过分析MorphToken合约代码和交易历史,确定该漏洞是由于大小写编码问题,错误的将Owned合约的构造函数Owned的首字母小写,使之成为了一个普通函数owned,任何以太坊账户均可调用该函数夺取合约的所有权,进一步实现盗币等系列非法操作。随即我们发布了相关应急报告,同时我们也注意到BCSEC安全团队发布了相关的分析文档(https://bcsec.org/index/detail?id=157&tag=1)。

在后续的研究中,我们发现早在2017年8月29日,Github(https://github.com/trailofbits/not-so-smart-contracts/blob/master/missing_constructor/Missing.sol)上就有人提到了这种因构造函数缺失导致的合约安全漏洞问题。该漏洞目前影响包括MorphToken、B2X、DoubleOrNothingImpl等多个智能合约。

二、漏洞原理

在MorphToken的合约代码里:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code 可以明显的看到相关大小写编写错误:

以太坊智能合约中的构造函数主要用于初始化,如:确定合约的所有者,并且只会在合约部署时运行。在小于0.4.22版本的solidify编译器语法要求中,构造函数的名称应该和合约名称保持一致。如果程序员在编写合约时将构造函数名称写错,那么原本的构造函数将成为任何人都可以调用的普通函数。漏洞示例代码及在Remix-ide中的复现结果如下:

0x01 漏洞合约部署

下图中,Bank合约继承自Owned合约。在Owned合约中,由于错误的编码,将构造函数名称写错,owned函数成为了一个普通函数。可以看到,Bank合约部署后,由于缺少构造函数,初始化时owner为0x0000000000000000000000000000000000000000。

0x02 漏洞现场还原

任何以太坊账户都可以调用Bank合约继承自Owned合约的owned函数,更改Bank合约的owner变量,从而使合约所有权发生转移。

如下如所示,0x14723a09acff6d2a60dcdf7aa4aff308fddc160c这个账户调用了Bank合约的owned函数后,可以看到Bank合约的owner变成了0x14723a09acff6d2a60dcdf7aa4aff308fddc160c。同理,攻击者也可以利用这个漏洞提权,实施一系列恶意操作。

三、漏洞影响评估

我们使用内部的以太坊智能合约审计系统对以太坊主链上(https://etherscan.io/contractsVerified)所有30000+公开智能合约进行了自动化审计,确认受该大小写编码漏洞影响的共计16个,以下为统计结果:

(受漏洞影响程度取决于合约的逻辑,具体代码审计结果可联系知道创宇404区块链安全研究团队)

理论上在合约部署后,由于编码错误引起的构造函数缺失,owner默认值会变为0x0000000000000000000000000000000000000000,这样合约中涉及到owner的函数调用都会异常,合约所有者应该能及时发现漏洞才是。然而MorphToken这种市值几百万美金的代币,因为合约存在这个编码漏洞而被盗币。通过分析Morph Token源代码,我们得到了答案。MorphToken继承了Owned合约,但是自己实现了构造函数。就是说,是父合约向外留了一个“后门”。

另一种情况,如果合约中没有涉及owner权限的函数调用,那么即使攻击者盗取了合约所有权,也没有任何用处。上表B2X合约中就是这种情况。

总体来说,受漏洞影响的合约数量不多,属于被MorphToken带着“火”了一把的漏洞。

事实上,很多安全漏洞都来源于程序员的粗心编码,智能合约这种部署后即不可更改的更应加强代码审计。

四、防护方案

1、0.4.22版本以后的solidity编译器引入了constructors关键字,以替代低版本的将合约名作为构造函数名的语法,从而避免程序员编码错误。强烈建议采用最新版本编译器

五、相关链接

[1] Morpheus 官网 https://morpheus.network/ [2] 官方公告 https://medium.com/@themorpheus/new-morpheus-network-token-smart-contract-91b80dbc7655 [3] 以太坊主链智能合约 https://etherscan.io/contractsVerified [4] 合约构造函数缺失漏洞示例 https://github.com/trailofbits/not-so-smart-contracts/blob/master/missing_constructor/Missing.sol [5] 漏洞详情参考 https://bcsec.org/index/detail?id=157&tag=1

往 期 热 门

本文分享自微信公众号 - Seebug漏洞平台(seebug_org)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liuchengxu

用 Go 构建一个区块链 -- Part 4: 交易(1)

翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行...

11920
来自专栏区块链入门

【链安科技】getToken函数漏洞

在最近一次漏洞监控扫描中,有相关安全公司风险监控平台发出预警,AMORCOIN (AMR) Token 合约存在致命漏洞,任何人都可以随意增加其账户上的 Tok...

8110
来自专栏区块链大本营

长文 | 深度解析Solidity让老司机翻车的17个坑及超详细避坑指南,建议先马后看(附送独家资源)

说起Solidity,虽然还很初级,但无疑已成为今天区块链开发的常用语言之一,今天以太坊智能合约的很多字节码,都是用Solidity编译的。

15520
来自专栏区块链入门

【葵花宝典】区块链技术面试必考题 01 区块链面试真经

话说,区块链行业对人才的缺口越来越大,但由于区块链涉及的知识领域较为广泛,能找到真正有用的人才对每个企业来说都非常不易。

24840
来自专栏Seebug漏洞平台

从以太坊"MorphToken事件"看智能合约构造函数大小写编码错误漏洞

以太坊智能合约的含义就是一组代码(函数)和数据(合约的状态),它们位于以太坊区块链的一个特定地址上。智能合约一般使用solidity语言编写。

13830
来自专栏Seebug漏洞平台

以太坊合约审计 CheckList 之“以太坊智能合约规范问题”影响分析报告

作者:LoRexxar'@知道创宇404区块链安全研究团队 发布时间:2018/08/13

14820
来自专栏编程

前沿Python技术:用不到50行的Python代码构建最小的区块链

尽管一些人认为区块链是一个等待问题的解决方案,但毫无疑问,这种新技术是计算机的奇迹。但是,区块链到底是什么呢区块链 它是比特币或其他加密货币进行交易的数字账本,...

30000
来自专栏极客编程

以太坊智能合约设计模式

设计模式是许多开发场景中的首选解决方案,本文将介绍五种经典的以太坊智能合约设计模式并给出以太坊solidity实现代码:自毁合约、工厂合约、名称注册表、映射表迭...

16230
来自专栏Android Note

bitfinex币 接口翻译整理

19120
来自专栏圆方圆学院精选

【许晓笛】 EOS 智能合约案例解析(1)

为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo —— eosio.token。eosio.token 智能合约目前还不...

23330

扫码关注云+社区

领取腾讯云代金券