NER:智能合约安全实践:练就“火眼金睛”,真假构造函数一眼看清_SDT

引子:“真行者珞珈山诉苦,假猴王水帘洞誊文。”——《西游记·第五十八回》在《西游记》中,六耳猕猴冒充猴王孙悟空,以假乱真,过了唐僧,过了众神,纵使是照妖镜也分不出真假。现在,智能合约遇上了“六耳猕猴”,又会擦出怎样的火花?

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

火币行情播报:BTC日内小幅回升,开始缩量盘整:据火币行情显示,BTC今晨小幅下探,最低至30915.05USDT,随后日内小幅回升,最高至33787.06USDT,目前在33400USDT一线缩量横盘。一小时级别来看,BTC延续前期的三角形震荡行情,多方在31300USDT一线的支撑力较强,几次空方尝试下探均在这个区间得到了支撑,目前回升此次震荡区间的上沿位置。日线级别来看,BTC迎来二连阳,基本回到了前期下跌幅度的1/4位置。截至18:30,火币平台的主流币的具体表现如下:[2021/1/25 13:27:58]

在Solidity语言中,当函数名和合约名相同时,此函数就是合约的构造函数,在合约对象创建时,会先调用构造函数对相关的数据进行初始化。以太坊Solidity0.4.22版本中引入了关键字constructor,新的构造函数声明形式:constructor()public{},引入的目的是用以替代低版本中将合约名作为构造函数名的语法形式,从而避免开发者笔误造成构造函数命名错误的问题。引入的这个关键字看似平淡无奇,实则意蕴深刻,且听我慢慢道来。

火币行情播报丨BTC持续缩量窄幅震荡,持续高位横盘:据火币行情显示,BTC昨晚持续缩量小幅震荡,在15400USDT下方多空双方争夺激烈,晚间小幅下探之后,在1小时级别下方趋势线15165USDT的位置得到了有效支撑,之后小幅上涨,整体的上升趋势并没有改变。从日线级别看,行情虽然出现了一定的波动,但是仍处于拉高后的高位横盘状态,是强势的上升趋势。截至10:00,主流币的具体表现如下:[2020/11/11 12:17:18]

二、Fal1out“以假乱真?”

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

火币行情播报丨BTC 日内缩量横盘,行情上升趋势持续中:据火币行情显示,BTC日内在12800USDT一线横盘,成交量相对平稳,在这波上升行情中成交量还是有一定程度的放大,市场相对活跃。日线级别来看价格持续攀升,今日迎来五连阳,由于前期阻力位的突破,上升行情或将持续。截至18:30,火币平台的主流币的具体表现如下:[2020/10/22]

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

现货市场缩量延续,合约多空比上升:据Bgain Digital数字资产量化交易比赛数据,24H Bgain市场综合指数0.24%,BTC趋势交易量化基金指数0.36%,市场中性量化基金指数0.02%。随BTC午间上涨,趋势策略持多头获利,中性套利策略在基差微弱波动下盈利机会较弱。周二BTC继续于$7650-$7750间震荡,早盘大额USDT流入交易所后试探$7850未能突破。现货市场缩量情况延续,昨日USDT继续增发$5000万,连续5日从交易所搬离BTC。场内合约总头寸达到3.12以来峰值,主流交易所多空比均有所上升,市场在币价不断站稳新高下信心增加。近期宏观市场相对乐观,标普恢复至2900高位,风险资产环境较好,南美各国主权信用危机持续驱动加密货币需求,币市或继续趁势在周内寻求反弹。[2020/4/29]

图2“假猴王”Fal1out想借着一些字体类型的相似字符的视觉差异混淆视听,可最终还是没能逃过我们的“火眼金睛”。三、前车之覆:

交易呈现缩量趋势,涨跌随宏观联动明显:据Bgain Digital数字资产量化交易比赛数据,24H Bgain市场综合指数0.17%,BTC趋势交易量化基金指数0.29%,市场中性量化基金指数-0.11 %。昨日BTC继续震荡下挫,合约贴水扩大,趋势策略持空头浮亏减少,套利策略则在等待收敛过程中略有浮亏。周三BTC随宏观回调于$6900下挫至$6600,交易仍呈缩量趋势。现货与合约大单多空比例均为1:1左右,当前存在较大分歧。合约场内头寸已连续8日增长,由$24.1亿增长至$25.4亿,投资者还在开多抱有期待。BTC本周紧跟宏观市场震荡,放大了宏观波动,但市场情绪未强势到走出独立行情,后市涨跌仍取决于宏观动向。[2020/4/16]

MorphToken事件分析在过去也曾发生过类似的安全事件,包含着假构造函数的合约被成功发布到主链上,其中比较出名的是“MorphToken事件”,其因为一个看似很小的问题而造成了数千万市值的代币被增发。合约代码地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code在Owned合约中,由于首字母大小写的错误,导致本该成为构造函数的Owned成为了普通函数owned,且被public修饰,可供任何人调用。如下图所示:

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

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

大币网

[0:0ms0-3:728ms