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

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

在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。

现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?

在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。

owner是智能合约拥有者的称呼,也常被用来作为该合约的超级管理员。对代币合约来说,owner可能被分配的权限有:铸造/销毁代币、冻结代币等。

如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者,那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。

ApeCoin DAO发起新提案AIP-250拟优化APE代币质押智能合约:金色财经报道,ApeCoin社区已发起新提案AIP-250投票,该提案提出了新的APE代币质押解决方案,旨在使用户能够在出售BAYC、MAYC、BAKC的同时收到预付款,并以复合奖励质押APE,继而解决质押NFT升值与获取质押奖励之间的互斥困境。此外,除了APE质押奖励之外,NFT持有者将能够通过产生额外的被动收入来利用其NFT价值,继而最大化APE代币质押奖励和灵活性。据悉,如果AIP-250提案获得通过,将部署新的APE Stake质押智能合约,该合约使用户不仅可以通过自动再投资进质押,还可以以NFT进行借贷或以预付收入将其挂牌出售,确保NFT所有者即使在质押期间仍然可以产生现金流或利用其 NFT 的升值价值,据悉该提案投票将于8月10日结束。[2023/8/6 16:21:23]

一、构造函数简介

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

DeBank钱包Rabby:Swap智能合约存在漏洞,建议尽快撤销Rabby Swap批准:10月11日消息,DeBank钱包Rabby发推称,其Rabby Swap智能合约存在漏洞,请用户撤销所有链上的Rabby Swap批准。目前团队正在解决问题。

此前据Supremacy安全团队监测,DeBank钱包Rabby的Swap Router疑似存在一个漏洞,可任意转移用户资产,建议尽快取消对Rabby的授权。攻击者地址为0xb687550842a24d7fbc6aad238fd7e0687ed59d55。[2022/10/11 10:31:18]

以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor()public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。

引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

尽管智能合约部署量增加,以太坊交易量仍停滞不前:金色财经报道,根据Arcane最近的报告,3月份部署的智能合约数量创12个月以来新高。DuneAnalytics数据显示,在过去的一个月里,智能合约的数量已经超过了200万份,但就价格而言,对于以太坊来说是一个糟糕的月份。据悉,自2019年4月以来,只有一个月的智能合约的实施量超过了100万。最近一次高峰出现在2019年10月,当时使用的智能合约数量接近120万份。从以太坊的角度来看,智能合约的增加是一个积极的现象,因为这可能表明更多的用户正在DeFi生态系统中使用这些机制。然而智能合约的兴起也可能与以太坊生态系统中的USDT注入间接相关。现在,尽管智能合约部署活动不断增加,但以太坊的日交易量仍然停滞不前。自2月初以来,该水平一直保持不变,这可能表明,实施的智能合约并没有真正被用来促进用户对生态系统的参与。[2020/4/25]

动态 | 以太坊联盟推出智能合约评级系统:以太坊联盟推出智能合约评级系统,类似于穆迪(Moody's),但适用于基于区块链的智能合约。为区块链用户提供一种简便方法来确定智能合约是否安全。(Cryptobriefing)[2020/2/4]

二、Fallout“以假乱真?”

–漏洞分析

下面以ethernaut靶场的Fallout题目为例进行分析。

一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out。

这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:

MIT正在测试一个智能合同驱动的比特币闪电网络:上周,麻省理工学院(MIT)透露,其已经演示了比特币闪电网络的实验性用例,展示了如何将它与智能合约结合起来,使比特币网络不仅能够处理数百万笔交易,而且还能够以更高程度的复杂度来进行处理。MIT创造性地使用所谓的“预言机”(oracle,一种可信的实体,旨在向智能合约广播数据)使得演示的成功成为可能的。这是第一次有运行代码的原型实现。[2018/5/23]

图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

四、后车之鉴

开发者应如何正确使用构造函数

建议更换Solidity0.4.22及以上版本,并使用正确的constructor()语法。

如下图所示:

图7

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

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

如下图所示:

图8

五、安全建议

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

1、开发者在编写智能合约敏感函数时,应严格

按照官方要求的代码书写规范,注意不要出现字符错误等情况。

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

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

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:31ms0-1:504ms