SharkTeam:十大智能合约安全威胁之函数恶意初始化
问:我们常常所提到的智能合约系统漏洞可以说是实际操作中威胁较大、产生最频繁地安全漏洞吗?
答:完全不是那般。比如“外溢”、“外界启用”等常所提到的智能合约安全漏洞并不是最经常产生,威胁最大的一个。
究竟什么安全性威胁从产生次数和不良影响上可以称之为Top10的啊?SharkTeam合约安全性系列课程之【十大智能合约安全性威胁】和你一起讨论和深层次。第六课【详细说明函数故意初始化】。
一、什么叫初始化函数
初始化在软件编程行业中拇指为数据对象或自变量赋初始值的处理方式,怎样初始化则在于所使用的编程语言及其所需初始化对象的存储类型等特性,用以开展初始化的软件结构则称之为初始化器或初始化目录。
初始化函数的意思解释,如果你创建一个案例时,这一函数便会被启用。大家在布署合约之后进行初始化合约时,一般不会选用传送结构函数主要参数开展初始化合约。
为什么不会选用结构函数方法constructor(uint256 _a)开展初始化,却选用上边所展现的形式进行初始化呢?
(1)不需要解决繁杂的结构函数主要参数,能够很容易被Etherscan认证
(2)当正常的工作流引擎必须主要参数时,部署和配备不用同步进行,这更加高效点
(3)容许我们自己的智能合约更新
(4)适合于确保在传送超出 16 个自变量时发生“Stack too deep, try removing local variables”不正确
可是,使用这种形式进行初始化会有一些难题:
(1)管理权限未严苛辨别:未严苛设定初始化函数调用者的管理权限,网络攻击会随意运用管理权限系统漏洞开展故意初始化。
(2)数次启用自定初始化函数:自定了不安全的初始化函数,并未对启用频次进行监管,网络攻击运用该系统漏洞反复启用初始化函数,造成网络攻击能轻易的再次初始化资金池。
二、进攻事件分析
2.1 DODO
2021年3月9日信息,DODO的wCRES/USDT资金池遭到进攻,网络攻击转离开了使用价值约90万美元的wCRES与价值约113万美元的USDT。DODO是一个最近很比较热门的DeFi新项目。网络攻击运用资金池合约的初始化函数系统漏洞,从资金池窃取了133,548.93858472505wCRES和1,139,456.204397USDT。DODO官方网发推文表明,本次进攻只跟DODO V2众筹项目池相关,做为防范措施,早已关掉DODO资金池建立通道。此次事情进攻步骤如下所示:
(1)网络攻击将FDO和FUSDT二种空气币转到wCRES/USDT资金池
(2)根据DODO闪电贷借出去133548.93858472505个wCRES和1139456.204397个USDT
此次攻击实行trace如图所示,上边白框表明网络攻击向资金池转到FDO和FUSDT的一个过程,下边的白框表明网络攻击向资金池借款的一个过程。
能够看见网络攻击在调用flashLoan函数的过程当中实行了init初始化函数,而且键入的daseTokenAddress主要参数为FDO, quoteTokenAddress主要参数为FUSDT。通过对比源代码中的cnit函数得知,网络攻击运用该函数将资金池再次进行了初始化,这时资金池被再次初始化变成FDO/FUSDT池。因而,网络攻击能够避开闪电贷贷款偿还体制。
问题原因分析:DODO资金池的初始化函数init并未对调用者的管理权限进行全面的的校检,都没有做一些避免反复启用的举措,才造成网络攻击能轻易的再次初始化资金池。
2.2 Punk Protocol
2021年8月10日,区块链技术分红保险协议书 Punk Protocol遭受进攻,损害 890 万美金,之后精英团队又找回 495 万美金(向网络黑客2带来了 100 万美金做为系统漏洞发觉费,网络黑客2偿还495万美元)。
在此次进攻事故中,网络黑客1有几笔进攻买卖,一个是测试进攻,一个是宣布进攻。网络黑客2也是有几笔进攻买卖,但是在其中一笔是inputdata带有通告项目方的数据。
(1)网络黑客1测试进攻:0x7604c7dd6e9bcdba8bac277f1f8e7c1e4c6bb57afd4ddf6a16f629e8495a0281
(2)网络黑客1宣布进攻:0xa76cd31bcd48869621e7f2698ac8754699026acd0655a6d33280224dabed4cfa
(3)网络黑客2进攻:0x597d11c05563611cb4ad4ed4c57ca53bbe3b7d3fefc37d1ef0724ad58904742b
(4)网络黑客2通告新项目发进攻:0x4c8072a57869a908688795356777270a77f56ae47d8f1d869be0d25e807e03b1
下面,以网络黑客1宣布进攻买卖为例子,进行深入分析:
(1)最先,网络黑客攻击执行了delegateCall,将网络攻击的合约详细地址载入到compoundModel中initialize函的forge_主要参数。setForge(address) 函数在初始化函数中实行。这是一个改动Forge地址的作用
(2)次之,它实行withdrawToForge函数并把所有资产发送至网络攻击的合约,之后在启用initialize函数发觉forge主要参数早已被换成网络攻击合约地址。链接到forge的全部CompoundModel都采用同样的编码,因而全部资金都转移至网络攻击的合约中。现阶段,造成黑客攻击的编码已经被项目方修复。加了2个Modifiers(仅Creator,initializer),那样仅有Contract Creator能够启用Initialize函数并操纵它只被启用一次。
问题原因分析:此次进攻的主要原因取决于 CompoundModel 合约中缺乏对初始化函数的安全管理,能够被反复初始化。
2.3 Nomad
2022年8月2日,跨链协议书Nomad遭受黑客入侵,损害超出1.9亿美金。该事件有几笔买卖,我们在选择在其中一笔买卖展开分析。买卖hash:0xb1fe26cc8892f58eb468f5208baaf38bac422b5752cca0b9c8a871855d63ae28
买卖启用了process函数:
进一步研究分析发觉,在调用acceptableRoot函数时,输入主要参数为0,即messages中并没相对应的信息,结论回到ture。
confirmAt自身的表示root被确定的时长,当root为0时,实际上是没被确认过的,confirmAt的值估计也为0,最终会回到false。恰好是这一点小出错导致了非常大的财产损失,对于整个新项目导致了几近致命性的严厉打击。
从合约中可以看到,合约的初始化函数initialize会将confirmAt的值初始化为1,初始化函数必须在合约布署后立刻启用,一般由合约部署详细地址即owner帐户来启用。大家检查了owner帐户及其每一个买卖,才发现是在初始化时把confirmAt[0]设成了1。
(1)owner: 0xa5bd5c661f373256c0ccfbc628fd52de74f9bb55
(2)txHash: 0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad
该合约是更新后合约,初始化函数要在合约更新之后对合约开展初始化。对比于更新前完成合约(0x7f58bb8311db968ab110889f2dfa04ab7e8e831b),初始化函数同样,但process函数是不一样的,更新前的process函数如下所示:
问题原因分析:此次安全事故的主要原因是可以更新合约在合约升级的过程当中存有出错,很容易被网络攻击运用初始化函数系统漏洞,开展恶意攻击。
三、防范措施
我们要采用什么方法去防止函数故意初始化?
(1)初始化函数应只有启用一次,且需要开展调用者管理权限辨别
(2)假如合约是采用初始化函数,不要在结构函数内进行初始化,则须安全使用合约库文件的初始化器去进行初始化。防止合约被故意控制,导致合约重要主要参数和逻辑错误
(3)项目上线前,需联络更专业的第三方技术专业财务审计精英团队开展财务审计
公司介绍:SharkTeam的发展目标是全方位维护Web3全球的安全性。团队人员遍布于北京、南京市、苏州市、美国硅谷,由全球各地资深的安全性专业人员高级科学研究人员构成,熟练区块链和智能合约的最底层基础理论,提供专业的智能合约财务审计、链上剖析、应急处置等工作。已经与区块链生态体系各行各业的重要参加者,如OKC、polygon、Huobi Global、Polkadot、imToken、ChainIDE等创建合作关系关联。
Telegram:https://t.me/sharkteamorg
Twitter:https://twitter.com/sharkteamorg
大量区块链安全咨询和分析,点击进入连接查询
D查下|链上风险性审查 https://m.chainaegis.com
转载:驼鸟区块链
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。