SharkTeam:Move语言安全性分析及合约审计要点之合约升级漏洞
SharkTeam在此前的“十大智能化合约安全风险”系列课程中,依据历史时间产生智能合约安全事故,梳理总结在智能化合约领域里发生比较多、伤害最大的一个前10大漏洞。这种漏洞以前一般出现在了Solidity智能化合约中,那对于Move智能化合约而言,是否会存有同样的伤害呢?
SharkTeam【Move语言表达安全性分析及合约财务审计关键点】系列课程将带大家逐渐深层次,基本内容管理权限漏洞、再入漏洞、逻辑性校检漏洞、函数公式故意复位、返回进攻、提议进攻、合约升级漏洞、控制预言机、三明治进攻、中间人攻击。此章具体内容【合约升级漏洞】。

1.合约升级概述
区块链具备防篡改的特点,即储存在区块链里的信息是无法被变更的。智能化合约实质上是储存在区块链里的可执行代码数据信息。智能化合约一旦布署到区块链中,变成区块链里的数据信息,则具备防篡改的特点,即便智能化合约中出bug必须修补或是领域模型变动,也无法在现有的合约中直接改动随后重新配置。那也是智能化合约和传统应用软件最大的区别之一。因而,智能化合约根本无法像很多传统式应用软件一般开展迭代更新升级,不同类型的区块链又有着不同的升级方式。
在以太币中,智能化合约有多大升级方式,在其中最关键的就是代理升级方式,又包括传承存储方式、非结构化数据存储方式、永久性存储方式等。这种升级方式的相同点便是用了代理合约逻辑合约来达到存放数据与领域模型的剥离方式。根据代理启用逻辑性合约里的函数公式浏览分开的存放数据。
针对代理升级方式,在合约升级的时候一定要防止出现存放数据的矛盾与遮盖,即一个新的数据存储结构不能和原先的数据存储结构矛盾,可不能遮盖原先的信息,不然,历史记录便会遗失。那也是合约升级环节中可能出现的较大漏洞。
2.合约升级漏洞安全事故
2.1 Uranium Finance安全事情
2021年4月28日,币安智能链上区块链新项目 Uranium Finance在流通性转移环节中受到攻击,涉及到资产为 5000 万美金,进攻合约详细地址:0x2b528a28451e9853F51616f3B0f6D82Af8bEA6Ae。
剖析发觉,Uranium 新项目合约里的漏洞出现在了 UraniumPair.sol 合约里的 swap 函数中,这一漏洞也会导致所有人可以任意的转走合约里的数字货币,而只要付出一点点的成本。能够看见 swap 中,最终是一个10^8和一个10^6得比较,这是一个似乎是恒等的分析,这也就意味着只需按照一定的招数持续的落实 swap 函数公式,就能清除这一合约中每一个数字货币。

我们可以看到UniswapV2Pair.sol的合约中的写法是一样的,但它是两个10^6得比较。

因此,导致此次事件的主要原因应当是项目方升级升级这一合约时,忘了将后边的1000^2改成10000^2了。
2.2 Audius安全事故
2022年7月24日,网络黑客运用合约升级漏洞从音乐流媒体协议书Audius转移到了1800万枚AUDIO货币。
通过对比全部进攻全过程,我们不难发现网络攻击之所以能进攻取得成功,直接原因取决于根据代理合约数次启用复位函数公式,而复位函数公式本该只有启用一次的。以Governance合约里的复位函数公式为例子,其编码如下所示:

这儿用了Openzeppelin里边的复位器initializer。具体情况是initializer并没有具有一切功效,主要原因是代理合约中的delegatecall。完成合约中界定的两大bool类型的初始条件initialized和intializing分别消耗了存放插槽slot0中前16个字节数。第1个8字节数为initialized,第2个8字节数为initializing。
因为代理合约自身界定了一个详细地址类别的初始条件proxyAdmin,其数值为0x80ab62886eacfebca74511823d4699eb88fd097e,一样消耗了存放插槽slot0。

因此,完成合约中的cnitialized和intializing与代理合约中的proxyAdmin与此同时消耗了存放插槽slot0,从而出现了存放矛盾。插槽0里的数据分类如下所示:

复位函数公式实行到initializer时,从存放插槽slot0第1个8字节数载入initialized,其数值为0,即false;从存放插槽slot0第2个8字节数载入initializing,其数值为0x80ab6288 > 0,即true。因而,复位器initializer没有任何的功效。

3.Move合约升级
Move生态具备多元性,不同类型的Move生态公有链对合约升级的大力支持及其升级方式也是不一样的。例如SUI现阶段并不兼容合约升级。而Starcoin和Aptos则适用合约升级,但升级对策不一样。
3.1 Starcoin合约升级
Starcoin是适用合约升级的,甚至比Solidity里的代理合约升级更为标准方便快捷,主要是因为Starcoin在规划之前就已经考虑了合约升级的现象,并给出了很多探寻:
(1)Starcoin的账户模型制作上适用合约升级;
(2)Starcoin的函数库Stdlib内嵌了多种多样合约升级的思路(在其中也包含严禁升级的思路),供客户选择;
(3)Starcoin的函数库Stdlib包含了完善的DAO链上整治作用,可以更方便地跟合约升级对策组合在一起,根据DAO来约束合约升级;
(4)适用合约升级的账户实体模型。Starcoin有一个ModuleId的算法设计,存放了账户的address和Identifier(控制模块名字),再对ModuleId开展hash测算(即ModuleId hash),并成为唯一索引,投射到真正意义上的合约编码。因此在载入编码时,需要使用ModuleId hash搜索编码。Starcoin的合约及其其他资源(Token、NFT …)存放在帐户详细地址,因此在启用合约时必须通过持有者详细地址 控制模块的方式去寻找合约。假如合约升级,也不会影响启用合约地址和控制模块名字。
(5)Stdlib合约升级对策。Starcoin适用4种合约升级对策,将决定权交给客户:
1)STRATEGY_ARBITRARY:随意升级
2)STRATEGY_TWO_PHASE:两个阶段升级TwoPhaseUpgrade
3)STRATEGY_NEW_MODULE:只有新增加Module,不可以改动Module
4)STRATEGY_FREEZE:冻洁,不可以升级合约
这4中升级对策限定越来越严,只可以从低对策往强的对策设定,不可以相反。默认合约升级战略是STRATEGY_ARBITRARY。
(6)DAO方式的合约升级计划方案。Starcoin合约升级计划方案选用DAO区块链技术的监管,小区可以通过网络投票实际操作来确定合约升级方案部署等。代码提交采用的是两阶段提交:先递交升级方案,再递交更新代码。全部升级步骤分成七个环节:
1)PENDING:在修改代码时向DAO递交一个合约升级的提议买卖,整个过程进到PENDING情况。设定一段时间使社群对此项话题探讨和认识再进入下一阶段。
2)ACTIVE:在PENDING环节完成后,进到ACTIVE环节,在这个时候必须街道的员工进行网络投票,在抵达设定的限定时间后变为下一阶段。
3)AGREED:在ACTIVE环节抵达限定时间后,步骤进入AGREED环节,在这个时候时会对投票结果完成统计分析,超过预订占有率,则视作升级方案被DAO小区容许,在进行公示后,能够进行下一阶段。
4)QUEUED:在AGREED环节的发起公示后,步骤进到公示期,这一阶段通常是展现发起者和方案的资料等,当公示期过去后进到下一阶段。
5)EXECTABLE:在QUEUED时期的公示期完成后,步骤进入能够升级合约的Two-phase(两阶段提交)的第一个阶段,递交合约编码升级方案,随后即进到下一阶段。
6)ETRACTED:在EXECTABLE时期的递交合约升级方案后,步骤进入升级合约的Two-phase(两阶段提交)的第二个环节,在这里环节能够递交修补或升级合约的编码,随后就可以步入下一阶段。
7)Upgrade complete:在ETRACTED时期的代码提交后,待买卖确定,全部合约升级步骤完毕,此后就可以用一个新的合约了。
选用DAO方式来处理合约升级时一种安全方法。Starcoin合约升级并不一定就必须使用DAO来处理,可以直接由合约使用者或开发人员自主管理方法升级。
3.2 Aptos合约升级
Aptos里的Move合约是适用升级的,即合约使用者或开发者能够在同一个帐户地址发布一个新的合约编码取代老旧合约编码,Aptos就会自动接纳最新版的合约编码并与其互动。
(1)合约升级对策
Aptos适用2种升级对策:
1)适配对策compatible:升级的合约始终保持存放和API的向后兼容性:
存放层面,一个新的合约编码务必适配全部老旧合约构造(特别是网络资源),这保证新代码可以合理表述已有的存取数据。新合约能够加上新的结构申明。
公共性API层面,新合约中公共性函数公式务必适配旧合约里的公共性函数公式,即有与旧合约里的公共性函数公式同样的签字,除此之外还能够加上一个新的函数公式,包含公共性函数公式和通道(entry)函数公式。
2)不会改变对策immutable:永远不会容许升级合约,且不适用合约升级。
(2)合约升级方法
要升级已构建的Move合约,只需要在以前布署的同一详细地址重新配置一个新的合约编码。自然,也需要结合DAO来处理合约升级,这会让合约升级更安全。
4.合约升级安全性分析
(1)不同类型的链有着不同的合约升级方案和计划方案,应该根据链具体情况,选择最切合链及项目的升级计划方案。
(2)升级战略的挑选由客户自己做主,要综合考虑对策等级。例如Aptos中每一个对策全是帐户级别,即同一个帐户中的全部控制模块分享同一种升级对策,不能为每一个控制模块设定单独的思路。
(3)考虑到兼容模式,一个新的合约中,控制模块、网络资源、公共性API对老旧合约需有一定兼容模式,不然容易出现意外,甚至是在合约升级完成后影响到了工程项目的业务模块。
(4)DAO升级计划中要了解DAO安全性,防止被高管理权限帐户实际操作;倘若合约使用者或开发人员独自一人管理方法合约升级,则应该考虑中心化的风险性。
About Us
SharkTeam的企业愿景是全方位维护Web3全球的安全性。精英团队由来自全国各地的资深的安全性专业人员高级科学研究人员构成,熟练区块链智能合约的最底层基础理论,提供专业的智能化合约财务审计、链上剖析、应急处置等业务。已经与区块链生态体系各行各业的重要参加者,如Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE等创建合作关系关联。

转载:驼鸟区块链
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。

SharkTeam



