月亮链 月亮链
Ctrl+D收藏月亮链
首页 > Coinw > 正文

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

作者:

时间:1900/1/1 0:00:00

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

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

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

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

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

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

央行数字货币研究所申请“智能合约”专利:7月5日消息,近期,数字人民币结合智能合约的应用实践得到了广泛关注。从公开数据了解到,人民银行数字货币研究所申请了8篇标题含有“智能合约”字眼的专利,大部分于2021年申请,涵盖的技术多为智能合约底层技术方案,具体包括智能合约的注册方法和执行方法。业内专家介绍,通过在数字人民币上加载智能合约,拓展了数字人民币支付场景的同时,能够实现支付“定制化”,为老百姓提供更加便民的支付工具。(中证网)[2022/7/5 1:53:05]

一、构造函数简介

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

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

Genie创始人:Genie完成对Coinbase NFT智能合约的集成,用户可参与Coinbase NFT测试版:4月27日消息,NFT聚合市场Genie创始人兼CEO Scott发推表示,Genie完成对CoinbaseNFT智能合约的集成。Scott在评论回复中表示,Genie上的用户都会收到Coinbase NFT测试版邀请码。

此外,Genie集成NFT交易市场X2Y2和LooksRare。[2022/4/27 5:14:49]

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

二、Fallout“以假乱真?”

–漏洞分析

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

摩根大通:以太坊的高昂gas费和网络拥塞给智能合约平台带来了巨大风险:金色财经报道,银行业巨头摩根大通在最新报告中表示,以太坊的高昂gas费和网络拥塞给智能合约平台带来了巨大风险。这可能是“以太坊估值的问题”。以太坊可能会失去其 NFT 市场份额给竞争对手 Solana,后者在去年取得了巨大的进展。如果我们看数据,以太坊的 NFT 市场份额已经从 2021 年初的 95% 下降到 80%。摩根大通分析师还指出,数据显示 NFT 玩家已经从以太坊转向 Solana,因为后者的交易速度更快且成本更低。(coingape)[2022/1/20 9:01:25]

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

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

Standard与Plasm达成合作,Standard将在Plasm上构建智能合约版本:据官方消息,波卡生态的混合式抵押弹性供应稳定币协议Standard宣布与Plasm达成合作,Standard将在Plasm上构建智能合约版本,Standard将从其平行链向Plasm提供预言机信息,以生成虚拟股票和虚拟大宗商品等相关合成资产。[2021/5/25 22:42:05]

图1

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

如下图所示:

Cardano新智能合约开发平台Plutus已启动运行:1月26日,Cardano开发公司IOHK官方宣布,新的智能合约开发平台Plutus已启动运行。该平台允许所有开发人员为Cardano(ADA)编写和部署其智能合约的测试版本。[2021/1/26 13:34:50]

图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、在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。

标签:OWNNERNFTFALTop Down Survival ShooterSinergiafio币NFTFALCONS

Coinw热门资讯
区块链:杭州区块链国际周丨李昕:区块链是Web3.0基石,Filecoin开启去中心化时代之门_FIL

7月6日,由杭州市余杭区政府指导,杭州未来科技城管委会、巴比特主办的“2020杭州区块链国际周”精彩继续.

1900/1/1 0:00:00
区块链:杭州区块链国际周丨海南省大数据管理局副局长孙少科:数据安全有序流动,助力海南自贸港建设_元宇宙最新局

7月5日,杭州区块链国际周分论坛顺利开幕。此次论坛由算力智库联合巴比特、海南省大数据管理局、上海人工智能发展联盟、长三角大数据产业合作联席会议、新财富等共同举办,论坛汇聚了国内外近几年来在隐私数.

1900/1/1 0:00:00
OMP:摩根溪联合创始人:Coinbase上市的消息与主流市场看涨相吻合_dpom币还能交易吗

在主流市场看涨的情况下,据报道的Coinbase在传统股票市场上市的消息证明是及时的,与其他公司类似的公开上市一样.

1900/1/1 0:00:00
MBR:欧盟:将为Libra等稳定币制定“强大”监管规则,开发“健全的”加密货币市场_BIRDBRO价格

欧盟金融服务专员瓦尔迪斯·多姆布罗夫斯基斯周二表示,欧盟委员会将在今年晚些时候提出新的规则,以在欧盟发展“健全的”加密资产市场,包括Facebook数字货币天秤座等稳定币.

1900/1/1 0:00:00
比特币:加密市场Q2数据综合复盘:比特币跑赢各国股市_CUSDT

文|秦晓峰?编辑|郝方舟一季度,受新冠肆虐与原油价格战影响,各主要金融市场表现不佳,美股多次熔断,比特币腰斩暴跌。二季度,世界各国央行相继宣布刺激措施、提振信心,各金融市场开始复苏.

1900/1/1 0:00:00
BAL:Balancer因通缩代币STA遭遇闪电贷攻击,价值50万美元资产被黑_ALA

写在前面:北京时间6月29日,知名defi项目Balancer的两个资产池遭遇闪电贷攻击,价值50万美元的代币被攻击者抽走,对此.

1900/1/1 0:00:00