火眼金睛:蚂蚁矿池钱包安全实践(二)

OKX欧易app

OKX欧易app

欧易交易所app是全球排名第一的虚拟货币交易所,注册领取6万元盲盒礼包!

APP下载   官网注册

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

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

在智能合约中,构造函数负责一些数据的初始化工作,owner值一般也会放在构造函数中进行初始化。

owner是智能合约拥有者的称呼,也常被用来owner可能被分配的权限有:铸造/销毁代币、冻结代币等。

如果开发者以错误的语法创建“构造函数”,造成构造函数缺失,致使“六耳猕猴”以假乱真,瞒过了开发者,最后使得攻击者成为合约的拥有者(owner),那么攻击者便可依赖owner的权限,对代币进行增发或销毁等操作,进而可能造成整个代币的崩盘。

一、构造函数简介

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

以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。

引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

二、Fal1out“以假乱真?”

–漏洞分析

下面以ethernaut靶场的Fallout题目为例进行分析。

一眼看去,这似乎是一个正常没有漏洞的合约代码,但经过仔细观察发现,该合约存在一个致命错误——构造函数名称与合约名称不一致,Fallout合约的构造函数被写错成了Fal1out(字母l和数字1的差异)。

这样的错误使其成为了一个被public修饰的普通函数,失去了构造函数仅在合约部署时被调用的特性,使得任何人都可以调用。该题目源码如下图所示:

图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,function constructor public{}为错误的构造函数形式。

如果要使用低于0.4.22的版本,则一定要着重检查函数名是否和合约名一致。

如下图所示:

图8

五、安全建议

在智能合约中因开发者粗心,而造成安全漏洞的事件层出不穷,“千里之堤,溃于蚁穴”,成都链安-安全实验室在此给出如下建议:

1、开发者在编写智能合约敏感函数(如构造函数、回退函数fallback)时,应严格按照官方要求的代码书写规范,注意不要出现字符错误等情况。

2、在某些情况下,编译器会对constructor的错误使用发出警告,开发者应予以正确对待,不可认为其只是警告信息而忽略不处理。

3、在合约正式上线前一定要找专业可信的机构做好合约代码的审计工作。

本站所有软件信息均由用户上传发布,版权归原著所有。如有侵权/违规内容,敬请来信告知邮箱:764327034@qq.com,我们将及时撤销! 转载请注明出处:https://czxurui.com/zx/47907.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年08月08日
下一篇 2023年08月08日

相关推荐

  • 炒币做合约怎么刷钱,炒币一般用杠杆还是合约

    一、炒币一般用杠杆还是合约炒币一般使用合约进行交易。杠杆通常用于高风险的投资领域,而炒币是一种低风险的投资方式,因此不适合使用杠杆。相反,合约交易允许投资者以较低的风险获得更高的回报率。在合约交易中,投资者通过购买或出售虚拟货币的未来价格来获利。这种策略需

    2024-11-22 13:30:01
    0 0
  • 比特币合约如何平仓,比特币合约已亏百分之160了不知道平不平仓

    一、什么是比特币期货合约比特币期货合约,通常是以比特币价格指数为标的的标准化合约。比特币交易所提供的比特币期货通常是以比特币进行交易的。期货是与现货相对的,现货是实实在在可以一手交钱一手交货的商品,而期货其实不是“货”,是承诺未来一个时间交“货”(标的)的

    2024-11-21 15:00:02
    3 0
  • 比特币智能合约怎么查,怎么查询所有区块链公链

    一、怎么查询所有区块链公链公链在哪里查询公链在浏览器查询。随着区块链的大热,越来越多的科技公司开始研究和开发区块链。在区块链迅速发展的同时,也有少部分项目方打着区块链的名号,在市面上进行招摇撞骗。如何判断公链真假,对于现在许多想要进行数字货币交易的群体来说

    2024-11-21 11:30:01
    5 0
  • 比原链钱包地址怎么写,如何查区块链合约地址信息

    一、区块链地址怎么查(区块链地址怎么查询平台)如何通过区块链资产地址(数字钱包地址)查看该地址的区块链资产(数字货币)?用区块链浏览器就可以查看。在搜索输入框内输入想查询的钱包地址,如果你输入的地址不完整,但是这个地址之前有在区块链上进行过ETH交易或者被查询

    2024-11-20 14:00:01
    3 0
  • 区块链 如何删除合约,什么叫区块链合约

    一、什么叫区块链合约区块链合约层是什么如果说数据、网络和共识三层,分别承担了区块链底层数据表示、数据传播和数据验证功能的话,合约层则是封装各类脚本代码、算法以及更为复杂的智能合约,是区块链系统实现灵活编程和操作数据的基础。作为一种自我执行的协议,智能合约被

    2024-11-20 01:30:01
    9 0
  • 虚拟货币地址怎么查询,如何查区块链合约地址信息

    一、如何知道是哪个区块链平台,怎么查询区块链是不是公链怎么查别人区块链信息1.如果是查询账户余额、账户的历史交易数据等信息,建议直接输入钱包地址查询;如果是查询某笔转账的相关信息,比如是否到账、进展如何,输入交易ID是最方便的。当然了,区块链浏览器不仅可以查询自己的

    2024-11-17 13:30:02
    9 0

发表回复

8206
验证码

评论列表(0条)

    暂无评论

ok交易所
已有100万用户加入ok交易所

立即下载