“真行者珞珈山诉苦,假猴王水帘洞誊文。” ——《西游记·第五十八回》
在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?
在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。owner是智能合约拥有者的称呼,也常被用来作为该合约的超级管理员。对代币合约来说,owner可能被分配的权限有:铸造/销毁代币、冻结代币等。如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者(owner),那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。
IOHK引入两个新开发环境,将使Cardano智能合约兼容所有编程语言:Cardano区块链背后的开发公司IOHK昨天宣布引入两个新的开发环境,允许开发人员为Cardano编写智能合约。“KEVM”devnet将允许开发人员实现Cardano上现有或未来以Solidity编写的基于以太坊的应用程序。这意味着超过14万份智能合约将与Cardano区块链兼容。该devnet使用了一个版本的以太坊虚拟机,该虚拟机已经被一个用于创建正式验证软件的框架K验证。
另一个devnet为IELE,旨在使开发人员能够用任何编程语言编写代码,并将产生的功能移植到Cardano区块链上。据IOHK称,IELE将是“第一个大规模的beta测试”,使非区块链开发人员无需学习区块链特定的编程语言就可以在Cardano上创建智能合约。(Crypto News Flash)[2020/12/4 13:59:57]
在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。
BM:所有合约都应遵循启用智能合约的原则:EOS创始人BM(Daniel Larimer)发推文称:“所有合约都应遵循启用智能合约的原则。我正在研究用于管理eos和其他eosio链上有条件的所有权转移、留置权和Oracle的原语或标准。”[2020/10/29]
以太坊Solidity 0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor() public { },引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。
下面以ethernaut靶场的Fallout题目为例进行分析。一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out(字母l和数字1的差异),这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:
1inch首席执行官:智能合约设计需适当处理4大风险:8月24日消息,去中心化交易聚合平台1inch首席执行官Sergej Kunz在接受采访时表示,1inch很重视审计。由于DeFi的某些产品不断给出疯狂的年化,我们认为用户应该让自己了解他们计划使用的产品,而不是把资金投入到他们不了解的技术上。但当然,总会有人不那么关心安全和稳定性。与此同时,针对智能合约的安全话题,Sergej Kunz表示,有几个智能合约设计原语可能会引入额外的风险。而需要避免或适当处理的风险是:1)升级功能;2)管理员密钥;3)委托调用——这意味着你的智能合约可以使用来自外部合约的逻辑;4)可重入性——一个智能合约调用另一个智能合约,并确保该智能合约不再被调用。(DeFi之道)[2020/8/25]
动态 | 昨日新增239个代币型智能合约 FreeCoin sentacoin和FomoDD风险最高:第三方大数据评级机构RatingToken最新数据显示,2018年8月29日全球共新增2078个合约地址,其中239个为代币型智能合约。\t在RatingToken同时发布的“新增代币型智能合约风险榜”中,FreeCoin(FRCN)、sentacoin(senta)和FomoDD(Chives)风险最高,其中FreeCoin(FRCN)存在31个安全风险,检测得分为3.1。此外,其他登上该风险榜TOP10的还包括imfomo Long Official(imfomo)、BULLSHITTOKEN(BULLSHIT)、CryptoCasher(CRR)、EAP Smart Token Relay(EAPBNT)、Rethen Token(RETHEN1)、WBC(WBC)和One more try coin(OMTC)。如需查看更多智能合约检测结果,请查看原文链接。[2018/8/30]
图 1
动态 | 超级比特币SBTC宣布暂停激活智能合约:超级比特币SBTC官方发布公告称,由于激活智能合约过程中出现代码与矿机不兼容的情况,如果继续激活智能合约可能存在不可预知的风险。为确保广大社区用户的利益,经团队研究,作出暂停激活SBTC智能合约的艰难决定。超级比特币团队将继续推进激活SBTC智能合约,预计将在一个月内重新激活。在此过程中,团队会积极维护社区用户利益,尽最大可能保障投资者的潜在权利。[2018/7/24]
在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、 在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。