宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > FTT > 正文

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

作者:

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

引子:“真行者珞珈山诉苦,假猴王水帘洞誊文。”——《西游记·第五十八回》在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?

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

Input Output发文介绍保护隐私的智能合约解决方案Kachina:8月5日消息,Cardano开发团队Input Output发文介绍与爱丁堡大学合作开发的保护隐私的智能合约解决方案Kachina,它利用ZK Snarks使用户能够在不牺牲去中心化特性的情况下实现隐私保护和通用智能合约功能。Input Output表示,提议的设计主要是理论上的,但Kachina证明了在现实生活的限制下创建保护隐私的智能合约的可能性。[2022/8/6 12:05:39]

在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor()public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

三箭资本联合创始人:智能合约链和应用程序将始终相互竞争:9月11日消息,三箭资本联合创始人Kyle Davies发推表示,数字黄金永远是数字黄金,数字艺术永远是数字艺术,智能合约链和应用程序将始终相互竞争。[2021/9/11 23:18:23]

二、Fal1out“以假乱真?”

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

Cardano创始人回应BM的质疑:Cardano不是DPoS 智能合约和本地资产将在今年推出:8月1日,网友/img/20230509060444672797/3.jpg "/>

声音 | 智能合约先驱尼克·萨博:比特币可在核战级的灾难中幸存:智能合约先驱尼克·萨博(Nick Szabo)发推称,可追溯至创世区块的完整比特币交易历史存在于存在于90多个国家的9000多份拷贝中,这足以保证比特币在核战级的灾难中幸存。[2019/11/24]

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

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

美国田纳西州法律现已认可区块链和智能合约:公共记录显示,田纳西州州长周四签署了一项法案,根据该州法律合法地认可区块链数据和智能合约。公共记录显示,田纳西州州长Bill Haslam周四签署了一项法案,根据州法律合法地认可区块链数据和智能合约。根据LegiScan的数据,该法案自1月份提出以来一直在立法机构讨论,一致通过了参议两院。该法案承认使用区块链技术和智能合约进行电子交易的法定权力,保护区受区块链技术保护的某些信息的所有权。[2018/3/24]

MorphToken事件分析在过去也曾发生过类似的安全事件,包含着假构造函数的合约被成功发布到主链上,其中比较出名的是“MorphToken事件”,其因为一个看似很小的问题而造成了数千万市值的代币被增发。合约代码地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code在Owned合约中,由于首字母大小写的错误,导致本该成为构造函数的Owned成为了普通函数owned,且被public修饰,可供任何人调用。如下图所示:

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

标签:OWNNEROUTFALMyOwnItemPepe Next GenerationOutter FinanceBaby Falcon Doge

FTT热门资讯
ChainsMap周报:9000美元挣扎下链上数据继续下滑;coinbase正成HBO最大对手?

北京链安,聚焦区块链安全与数据服务,以下是基于北京链安ChainsMap链上数据监测系统,就上周数据发布的比特币链上数据周报.

1900/1/1 0:00:00
持有100,000 USDC的地址被列黑名单, 重燃DeFi中心化问题?

编者按:本文来自Unitimes,作者:RobertStevens,编译:Summer,星球日报经授权发布。在3月中旬冠状病市场崩盘引发去中心化稳定币DAI遭遇重创之后,DAI社区选择了增加中心化稳定币USDC作为其抵押品的选项.

1900/1/1 0:00:00
关键指标显示出机构对加密货币的兴趣高涨,并且还在上升

编者按:本文来自Cointelegraph中文,作者:ANIRUDHTIWARI,Odaily星球日报经授权转载.

1900/1/1 0:00:00
币圈的“熊”VS股市的“牛”

数字货币市场继续萎靡,昨天的市场再次普跌,尽管下跌的幅度不大,但波及面却非常广,市场像现在这样不上不下已经持续了很久。那么当下的市场到底处于什么状况呢?我认为还处在熊市的整固过程中,并且这个过程恐怕还将持续一段时间.

1900/1/1 0:00:00
DeFi代币大幅回调,下一步机会在哪里:聚合币 or DEX?

编者按:本文来自风火轮社区,作者:佩佩,Odaily星球日报经授权转载。大家好,我是佩佩,最近这一波下跌,貌似跌幅较大的都是和defi板块相关、在近期炒得热闹的,其中最夸张的可能要属上周我们聊过的“表面是稳定币,实际是过山车”的amp.

1900/1/1 0:00:00
DeFi总市值2个月涨700%,但仍有不少人表示:看不见,看不起,看不懂,跟不上

编者按:本文来自白话区块链,作者:JackyLHH,Odaily星球日报经授权转载。自从5月份比特币区块奖励减半尘埃落定之后,我们可以看到整个加密行业的目光焦点转移到了ETH2.0、IPFS以及DeFi上.

1900/1/1 0:00:00