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

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

在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?

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

报告:以太坊的拥堵和高额费用刺激了对具有类似智能合约功能但吞吐量更快的网络的需求:金色财经报道,CoinDesk Research将放弃其第三季度的季度回顾,该报告指出,尽管以太坊在最近 9 月的份额高于自 2017 年以来该系列中的任何时间,但所有其他区块链的份额是过去五个 9 月中最高的。正如 Kaloudis 和 Oosterbaan 在整个报告中指出的那样,替代第 1 层(L1)区块链越来越受欢迎,因为以太坊的拥堵和高额费用刺激了对具有类似智能合约功能但吞吐量更快的网络的需求。 这种需求反映在这些 L1 网络的本地货币的市值和其去中心化金融 (DeFi) 协议中的总锁定价值 (TVL) 或投资资金中。Cardano 的 ADA、Binance Smart Chain 的 BNB、Solana 的 SOL、Avalanche 的 AVAX 和 Terra 的 LUNA 现在按市值排名前 12 位。(CoinDesk)[2021/10/4 17:22:23]

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

动态 | 汤森路透合作OpenLaw 以将其文件自动化服务与智能合约相融合:加拿大媒体集团汤森路透(Thomson Reuters)正着眼于将以太坊智能合约引入主流市场。这项工作是与OpenLaw合作的一部分,后者由ConsenSys支持,主要业务为构建自动化法律契约的开源及P2P协议。10月17日,双方展示了首个合作成果,一款名为Smart Contract Express的概念验证(PoC)系统,该系统将汤森路透的文件自动化服务Contract Express与使用以太坊和Chainlink的智能合同功能相融合。(Blockkonomi)[2019/10/19]

以太坊Solidity 0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor() public { },引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

声音 | SpankChain CEO:Compound 上出借 DAI 存在智能合约风险、中心化单点故障和挤提风险:SpankChain CEO Ameen Soleimani 发布博文列举了在 Compound 出借 DAI 的风险,他在文章中称,自己管理公司近 50 万 DAI,根据 DAI 10%的利息,大约每个月能产生 4000 美元的收入,如果将这些 DAI 放入 Compound 中是有机会成本的。此外,在 Compound 放贷还有很大的风险,包括智能合约的安全风险、中心化单点故障(他解释,Compound 是一个托管系统,如果管理私钥泄露,所有租借池的资产都可能被盗走)和挤提风险(资金利用率高达 98.62% 的 Compound 没有足够的资产储备保证出借人随时取回资产)。[2019/9/5]

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

动态 | Everipedia合约全项通过降维安全实验室智能合约安全审计:据降维安全实验室(jonhwick.io)报道,EOS项目Everipedia全项通过降维安全实验室智能合约安全审计。Everipedia(IQ)是世界上第一个点对点百科全书项目,团队基于对技术的严谨以及对用户负责的态度,向全球区块链安全能力服务提供商降维安全实验室提交了其EOS智能合约安全审计申请。目前,降维安全实验室已完成全部的审计工作,此次顺利的通过降维安全实验室的审计,证明了Everipedia合约的安全性以及完整性。[2019/2/12]

图 1

金色财经现场报道 八分量创始人兼CEO阮安邦:区块链及智能合约仍存在部分问题:金色财经现场报道,在2018大数据产业峰会上,八分量创始人兼CEO阮安邦表示,区块链及智能合约仍存在部分问题,首先链外运算不可信,除非完整的运算流程均由智能合约编写,数据在链外流传的任一环节的安全问题都会导致全局可信性的丧失;限定性借口,即便图灵完备,所支持的接口与功能依旧远少于存量应用程序;移植重构,无法与存量应用程序兼容,需完全移植,大量重构;完全冗余,智能合约的所有操作均需要在全网络节点完全重做,造成极大的资源浪费与性能损失;低效共识,共识效率极低,且共识操作价值极低,极大的资源浪费与新能损失。[2018/4/19]

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

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

水星链

[0:15ms0-0:867ms