链资讯 链资讯
Ctrl+D收藏链资讯

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

作者:

时间:

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

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

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

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

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

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

图 1

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

图 2

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

在过去也曾发生过类似的安全事件,包含着假构造函数的合约被成功发布到主链上,其中比较出名的是“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、 在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。

标签:OWNNERNBSBSPAP3.townMoneroVNBS价格BSPT币

比特币价格热门资讯
金色趋势丨BTC大牛启动前的最后低吸机会?

BTC目前已完成了第三次产量减半,上图为BTC2010-2020长期月线走势,通过研究可以发现,每次减半前BTC价格均位于上一轮牛市顶点回落的斐波那契0.5压制线下方运行,2012年的第一次和2016年的第二次以及2020年的第三次均是这种走势,即便19年的小牛行情和今年初的行情,两者冲顶月线收盘均未能突破。

物联网成高考热搜专业 欧科云链徐明星:区块链助力物联网普及

7月7日,一年一度的高考终于拉开帷幕。 据《百度2020年高考搜索大数据报告》显示,2020年十大热搜专业为:人工智能、机器人工程、电子商务、物联网工程、大数据技术、网络与新媒体、网络空间安全、软件工程、学前教育、临床医学。 总体而言,这份数据符合国家大力发展“新基建”的浪潮。

以太坊研究人员:ETH 2.0 Phase 0可能要2021年才能上线

以太坊的研究人员称,ETH 2.0 Phase 0可能要到2021年初才能上线。 以太坊基金会的Justin Drake周五在Reddit社区的Ask-Me-Anything活动中被问及了Phase 0的部署计划,该网络的部署此前由于多客户端的方案一再推迟。

一文速懂ETH 与ETH 2.0基础与挖矿特点

1. 什么是ETH? ETH是Ethereum网络的原生通证,作为网络生态中价值流通的主要介质。以太坊是当下区块链应用开发活跃度最高的平台,通过数以千计的全球节点,来逐步实现代替中心化服务器的“世界计算机”愿景。通过Ethereum网络,用户也可以直接快速的传递金融价值。

如何解决“无常损失”的问题?Bancor V2 披露细节

之前蓝狐笔记提到Bancor V2试图解决“无常损失”的问题,但并没有披露细节,前几天Bancor进一步披露了部分细节,主要如下图: (Source:Bancor) 从图中可以看出其核心有两个:一是预言机提供最新价格;二是根据预言机价格更新代币池比重,也就是动态池的模式。

7.10早间行情:BTC现画门走势 接下来这么看

昨晚行情短暂的上冲9400美元后直接跳水,最低点位跌至9160美元,当前在9200附近震荡,虽然只是200美元的跌幅,却令前天的上涨付之东流,在盘面上形成一道“门”字形,打破了好不容易铸造的良好形态,也给好不容易有转好迹象的市场情绪破了一盘冷水,可以确认的是,前天甚至昨天市场一直在构造有意的诱多走势。