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

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

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

侧链项目Milkomeda将允许与EVM兼容的智能合约在Cardano主网上执行:8月26日消息,IOHK(负责Cardano协议的研发)首席执行官Charles Hoskinson表示,他很高兴区块链初创公司dcSpark的新侧链项目“Milkomeda”将允许与EVM兼容的智能合约在Cardano主网上执行。此外,Milkomeda项目承诺在未来提供Cardano和其他L1区块链之间的互操作性,如Solana。(Crypto Globe)[2021/8/26 22:39:26]

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

Incognito推出为以太坊智能合约提供隐私保护的pEthereum项目:加密货币隐私解决方案提供商Incognito公开pEthereum项目,这是一个为以太坊智能合约提供隐私保护的基础设施,所有交易将会通过零知识证明加密,从而允许用户保留隐私。pEthereum的核心概念包括跨链指令、去信任方式连接以太坊和Incognito的双向桥接工具、以太坊中的“经纪人”智能合约、以太坊中的去中心化应用(dApp)、以太坊中dApp的的隐私保护版本pApp。

Incognito还计划在5月推出具有隐私保护的Kyber和0x,然后在6月推出具有隐私保护的Compound和Uniswap。[2020/4/27]

声音 | 智能合约先驱尼克·萨博:比特币是一种自然权利:推特用户/img/20230509060444672797/3.jpg "/>

动态 | Netta发现以太坊智能合约虚拟机重大漏洞 覆盖80%虚拟机:11月9日讯,近日,Netta研究院表示,其和清华大学软件学院动态分析小组合作发现以太坊智能合约虚拟机(EVM)重大漏洞,目前该漏洞已被美国国家信息安全漏洞库CVE认证,并称这次漏洞远比“The DAO”事件要严重,如被利用,或将严重破坏整个以太坊经济模型,对全球运行多数公链造成冲击。 据提供ID,经登录CVE官方网站确已查询到收录信息,但该漏洞描述显示“RESERVED”,漏洞被保密,并未披露具体细节。[2018/11/9]

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

动态 | 支付初创公司Wyre收购比特币智能合约开发商:Crypto支付初创公司Wyre收购了风险投资支持的比特币智能合约开发公司Hedgy的100%股权。该公司联合创始人兼首席运营官约阿尼斯?贾纳罗斯(Ioannis Giannaros)在接受CoinDesk采访时表示,这笔交易将帮助Wyre拓宽其为crypto初创公司提供的服务范围。Wyre通过使用比特币、ethereum、litecoin等加密货币进行跨境支付来结算交易。[2018/9/7]

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

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

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

银河链

BNB3.6亿元大单未挽亿邦股价颓势

编者按:本文来自蜂巢财经News,作者:JXkin,Odaily星球日报经授权转载。北京时间7月14日晚,美股开盘后,亿邦国际高开低走,先从6美元的开盘价上涨到8美元,涨势在一天内就发生了逆转,当日收于4.75美元,较开盘价下跌20%.

[0:0ms0-1:567ms