练就“火眼金睛” 真假构造函数一眼看清

智能合约安全实践(二)| 练就“火眼金睛” 真假构造函数一眼看清

“真行者珞珈山诉苦,假猴王水帘洞誊文。”  ——《西游记·第五十八回》

在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,骗过了唐僧,骗过了众神,纵使是照妖镜也分不出真假。现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?

在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。owner是智能合约拥有者的称呼,也常被用来作为该合约的超级管理员。对代币合约来说,owner可能被分配的权限有:铸造/销毁代币、冻结代币等。如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者(owner),那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。

一、 构造函数简介

在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。

以太坊Solidity 0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor() public { },引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

二、 Fal1out“以假乱真?”漏洞分析

下面以ethernaut靶场的Fallout题目为例进行分析。一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out(字母l和数字1的差异),这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:

图 1

在Fal1out函数中直接指定了函数调用者的地址即为owner,所以只需要调用Fal1out函数即可实现对合约owner的更改。如下图所示:

图 2

“假猴王”Fal1out想借着一些字体类型的相似字符的视觉差异混淆视听,可最终还是没能逃过我们的“火眼金睛”。

三、 前车之覆:MorphToken事件分析

在过去也曾发生过类似的安全事件,包含着假构造函数的合约被成功发布到主链上,其中比较出名的是“MorphToken事件”,其因为一个看似很小的问题而造成了数千万市值的代币被增发。合约代码地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code

在Owned合约中,由于首字母大小写的错误,导致本该成为构造函数的Owned成为了普通函数owned,且被public修饰,可供任何人调用。如下图所示:

图 3

MorphToken合约继承了Owned合约,并在自己的构造函数内进行了owner的初始化,但是父合约Owned的owned函数是可供任何人调用的,攻击者便可通过调用owned函数更改合约的所有者owner。owner的初始化代码如下图所示:

图 4

由上述可知,任何人都可以通过调用合约的owned函数,成为合约的拥有者(owner)。如下图所示:

图 5

失之毫厘,差之千里,一个小小的字母错误,却导致了合约的代币的崩盘。代币也被恶意增发。如下图所示:

图 6

四、 后车之鉴:开发者应如何正确使用构造函数

建议更换Solidity 0.4.22及以上版本,并使用正确的constructor()语法。如下图所示:

图 7

切记: constructor()前并无function,function constructor() public { }为错误的构造函数形式。

如果要使用低于0.4.22的版本,则一定要着重检查函数名是否和合约名一致。如下图所示:

图 8

五、 安全建议

在智能合约中因开发者粗心,而造成安全漏洞的事件层出不穷,“千里之堤,溃于蚁穴”,成都链安-安全实验室在此给出如下建议:

1、 开发者在编写智能合约敏感函数(如构造函数、回退函数fallback)时,应严格按照官方要求的代码书写规范,注意不要出现字符错误等情况。

2、 在某些情况下,编译器会对constructor的错误使用发出警告,开发者应予以正确对待,不可认为其只是警告信息而忽略不处理。

3、 在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。

24小时热点

数字藏品为何没人买单?

从万众瞩目到无人问津,即使在信息传输飞快、热点更迭频繁的互联 ... 置顶

13548

数字藏品炒作侵权诈骗屡见不鲜

华夏时报制图 本报(chinatimes.net ... 置顶

10154

大厂押注的元宇宙会被Web3先驱们“偷家”吗?

区块链网QKLW.COM记者报道:元宇宙(Metaverse ...

5022

安猫数字藏品交易平台

比特币可能将成为美元的新锚点

尽管年初有新冠疫情肆虐,但中国头部富豪的资产并未受到影响,反 ...

23601

Dune Analytics

Origin公布攻击信息 呼吁黑客返还资金

「Origin Protocol 稳定币 OUSD 遭闪电贷 ...

9085

央数藏

热点专题

介绍 NFT 的各种协议名称中的 ERC 和数字

在介绍 NFT 的各种协议之前,先简单科普一下 ERC-72 ... 置顶

16119

NFT艺术品到底是什么?

Beeple,“EVERYDAYS: THE FIRST 5 ...

2221437

Opera House

最全的NFT发展史

当我们理解一个新生事物,必须要首先了解其起源,通过对其源头以 ...

1701263

iBox

什么是IDO?这种模式会带来怎样的影响?

要理解IDO(Initial DeFi Offering)初 ...

1063892

Bitstamp交易所

有黑客采取新型 USDT 假充值手法

根据慢雾区情报,有黑客采取新型 USDT 假充值手法,黑客采 ...

907925

区块链博客

深度解读元宇宙 Decentraland

Decentraland 基于以太坊构建,是由用户共同拥有并 ...

816665

ImToken 多链钱包

国内NFT平台是怎么赚钱的?

2021年被称为NFT的“元年”,互联网巨头、各大企业、艺术 ...

683626

币客

4种利用永续合约资金费率套利的策略

下文将介绍在保持市场中立的条件下,如何从永续掉期资金费率中套 ...

663478

Venly

Uniswap是什么?

注意!币圈老虎机已开启

617682

量子链钱包

了解CHIA这篇就够了

这些清单旨在作为信息来源和研究的出发点,为你的研究提供常识性 ...

592815

Kusama 测试网

教你如何铸造一个NFT

体会一下如何铸造一个NFT有助于更好地理解它

590146

Kusama 测试网