引子:“真行者珞珈山诉苦,假猴王水帘洞誊文。”?——《西游记·第五十八回》
在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。
现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?
在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。
owner是智能合约拥有者的称呼,也常被用来作为该合约的超级管理员。对代币合约来说,owner可能被分配的权限有:铸造/销毁代币、冻结代币等。
如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者,那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。
金色财经合约行情分析 | BTC窄幅盘整,市场其他币种各有表现:据火币BTC永续合约行情显示,截至今日16:00(GMT+8),BTC价格暂报9280美元(+0.59%),20:00(GMT+8)结算资金费率为0.010000%。
昨日数字资产市场轮番上涨后,目前BTC在9200美元-9300美元之间盘整。根据火币交割合约数据,BTC当季合约成交额大幅减少,持仓量稳定,精英多头占比稳定,当季合约保持窄幅溢价。在BTC窄幅震荡过程,主流币和小币都有各自的表现,市场整体呈现乐观情绪,赚钱效应良好。[2020/7/8]
一、构造函数简介
在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。
以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor()public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。
合约行情分析:主流币凌晨大跌 目前恐慌情绪缓解:据火币BTC永续合约行情显示,截至今日17:00(GMT+8),BTC价格暂报9039美元(-1.36%),20:00(GMT+8)结算资金费率为0.010000%。
昨日晚BTC在9000美元上方窄幅盘整,于凌晨短时下探8800美元,而其他主流币出现大幅的下跌。根据火币交割合约数据,BTC当季合约成交额上涨,持仓量增加,精英多头占比略减,当季合约溢价几乎为0。BTC目前反弹至9000美元上方,恐慌情绪有所缓解。
USDT于火币全球站OTC的报价为7.02元,溢价率为-0.81%。[2020/6/28]
引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。
金色财经合约行情分析 | BTC价格下跌市场情绪低落,持仓量持续增长:据火币BTC永续合约行情显示,截至今日16:00(GMT+8),BTC价格暂报8855美元(-4.38%),20:00(GMT+8)结算资金费率为0.010000%。
昨日晚至今,BTC在小幅反弹后持续下跌, 最低至8600美元,成交量出现放大。根据火币交割合约数据,BTC季度合约成交额大幅上涨,持仓量保持上涨趋势,精英多头占比稳定,季度合约处于贴水状态。市场整体情绪较低,但可注意到近几天下跌行情持仓量处于持续增长状态,投资者需注意风险,不宜追涨杀跌。
USDT于火币全球站OTC的报价为7.11元,溢价率为-0.40%。[2020/5/25]
二、Fallout“以假乱真?”
–漏洞分析
下面以ethernaut靶场的Fallout题目为例进行分析。
二层扩容方案 Hermez 智能合约已开源,已完成一次代码审计:基于 ZK Rollup 概念的二层扩容网络 Hermez 宣布其智能合约已开源至 Github。另外 Hermez 还表示正在对代码进行几项审计,第一次审计来自于 Solidified,10 月已经有 3 名审计人员对 Hermez 的智能合约及其相关组件进行三周的审计,未发现任何严重或重大问题。Hermez 还在和独立审计人员 Adrià Massanet 合作,进行额外的代码审计,并与 Trail of Bits 团队合作,进行另一项全面的审计。[2020/11/7 11:55:18]
一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out。
这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:
声音 | BM:智能合约能否被更改应该由市场决定:BM发推表示,自由市场将决定人们想要不可更改的还是可更改的智能合约,许多不同的治理策略或者多签是可以实现的。EOS支持这两种形式的合约,因为只有市场才能决定哪种有效。我们都看到因存在问题但不能被修复的ETH合约而造成的混乱。 智能合约是可更改还是不可更改,这是由应用程序的后端所决定。只要智能合约能像宣传的那样运行,用户并不在意它是可更改的还是不可更改的。但是这两种形式都可能以不同的方式让用户受到损失。不管是密钥被盗还是代码存在Bug,应用程序开发人员都应该承担责任。有些开发人员似乎对他们的密钥安全比对他们无Bug代码更有信心。这可能使可更改的合约成为用户的正确选择。用户不会阅读代码,他们只信任用户界面和营销。[2019/4/24]
图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、在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。