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

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

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

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

ARK Invest:到2030年,智能合约网络每年可提供4500亿美元的费用:金色财经报道,ARK Invest近日发布“2023 Big Ideas”研究报告,比特币、数字钱包、公链和智能合约网络占据2023年14个“大创意”中的四席。

报告强调了Layer2网络Arbitrum和Optimism上的交易数量,现在与以太坊基础层交易数量相当。ARK Invest补充说,到2030年,智能合约网络每年可提供4500亿美元的费用。与此同时,ARK Invest预计数字钱包用户的数量将以每年8%的速度增长,到2030年达到全球人口的65%。

在另一个名为“技术融合”的主题中,Ark表示,加密挖矿可以支持更多的太阳能电池安装,并指出“将比特币挖矿纳入太阳能存储系统可以提高电网的规模和可靠性,而不会增加电力的平均成本”。[2023/2/2 11:41:53]

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

Curve Finance已上线智能合约平台Moonbeam Network:2月14日消息,据官方推特,去中心化交易平台Curve Finance宣布已在Polkadot上与以太坊兼容的智能合约平台Moonbeam Network启动。[2022/2/15 9:51:30]

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

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

ZKSwap回应Matter Labs质疑:用户资金安全,智能合约和电路代码将开源:关于Matter Labs提到的一些疑问,ZKSwap作出如下回复:

1. ZKSwap在ZKSync Layer2转账的基础上完整实现了Layer2 AMM Swap电路,并实现了数项改进;

2. ZKSwap上用户的资金安全是得到保障的,智能合约和电路部分的代码已经获得了慢雾,Certik和ABDK三家权威安全审计机构的审计认证,审计报告已公开在项目github仓库中接受社区监督;

3. ZKSwap所有智能合约和电路的代码都将完全开源,其中,智能合约部分已经完全审计完成,将会在2021年3月1日开源;电路部分ABDK还在进行最后的审计报告编辑,将会在获得报告并在系统稳定运行一段时间后逐步开源,请社区保持关注;

4. 关于Matter Labs提到的智能合约中关于合约作者的疑问,ZKSync和ZKSwap都严格遵守MIT开源协议,必须保留原作者的版权声明和许可声明。ZKSwap在ZKSync合约的基础上进行的修改也将在合约开源时进行备注,并添加新的版权和许可声明,请社区监督。

此前消息,Matter Labs质疑ZKSwap克隆zkSync代码,担心其用户资金安全问题。[2021/2/24 17:47:58]

二层扩容方案 Hermez 智能合约已开源,已完成一次代码审计:基于 ZK Rollup 概念的二层扩容网络 Hermez 宣布其智能合约已开源至 Github。另外 Hermez 还表示正在对代码进行几项审计,第一次审计来自于 Solidified,10 月已经有 3 名审计人员对 Hermez 的智能合约及其相关组件进行三周的审计,未发现任何严重或重大问题。Hermez 还在和独立审计人员 Adrià Massanet 合作,进行额外的代码审计,并与 Trail of Bits 团队合作,进行另一项全面的审计。[2020/11/7 11:55:18]

图 1

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

万卉:“智能合约”里的以太比例已反超交易所:今日,PrimitiveVentures创始人万卉在微博上发言表示:“8月31号开始,在“智能合约”里的以太比例,已经反超在交易所里的以太比例了。”[2020/9/22]

图 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-1:29ms