木星链 木星链
Ctrl+D收藏木星链
首页 > 币赢 > 正文

TOR:Solidity编译器中高危漏洞:误删状态变量赋值-ODAILY

作者:

时间:1900/1/1 0:00:00

本文从源代码层面详解介绍了Solidity(0.8.13<=solidity<0.8.17)编译器在编译过程中,因为Yul优化机制的缺陷导致的状态变量赋值操作被错误删除的中/高漏洞原理及相应的预防措施。

帮助合约开发人员提高合约开发时的安全意识,有效规避或缓解SOL-2022-7漏洞对合约代码安全性的影响。

1.漏洞详情

Yul优化机制是Solidity编译合约代码的可选项,可以通过优化机制减少合约中某些冗余的指令,从而降低合约部署和执行过程中的gas费用,具体的Yul优化机制可以参考官方文档。

在编译过程的UnusedStoreEliminator优化步骤中,编译器会将“冗余”的Storage写入操作移除,但由于对“冗余”的识别缺陷,当某个Yul函数块调用特定的用户定义函数(函数内部存在某个分支不影响调用块的执行流),且在该Yul函数块中被调用函数前后存在对同一状态变量的写入操作,会导致在Yul优化机制将块中该用户定义函数被调用前的所有的Storage写入操作从编译层面被永久删除。

考虑如下代码:

contractEocene{

uintpublicx;

Solana基金会就Mailchimp安全事件发出警告:金色财经报道,Solana的非营利组织Solana Foundation在1月14日披露了一起涉及其电子邮件服务提供商Mailchimp的安全事件。

根据Cointelegraph看到的发给用户的一封电子邮件,Mailchimp于1月12日通知基金会,“一个未经授权的行为者从Solana基金会的Mailchimp实例访问并导出了某些用户数据。”

事件中访问和导出的信息包括用户名和Telegram用户名。Solana基金会表示:“根据我们从Mailchimp收到的信息,受影响的信息可能包括,除其他外,电子邮件地址、姓名和Telegram用户名,在每种情况下,仅在用户提供任何此类信息的范围内。Mailchimp表示,该事件并未影响密码或信用卡信息。”

受此事件影响的用户数量尚不清楚。在发布时,Solana或Mailchimp没有就此事件发布官方公告。Solana没有立即回应Cointelegraph的置评请求。[2023/1/15 11:12:49]

functionattack()public{

x=1;

x=2;

}

}

安全团队:SOL Decoder项目Discord服务器遭攻击:9月28日消息,据CertiK监测,SOL Decoder项目Discord服务器遭攻击。请社区用户不要点击链接、铸造或批准任何交易。[2022/9/28 5:57:07]

在UnusedStoreEliminator优化时,x=1显然对于函数attack()的整个执行是冗余的。自然的,优化后的Yul代码会将x=1;删除来降低合约的gas消耗。

接下来考虑在中间插入对自定义函数调用:

contractEocene{

uintpublicx;

functionattack(uinti)public{

x=1;

y(i);

x=2;

}

functiony(uinti)internal{

if(i>0){

return;

}

assembly{return(0,0。

}

}

显然,由于y()函数的调用,我们需要判断y()函数是否会影响函数attack()的执行,如果y()函数可以导致整个函数执行流终止(注意,不是回滚,Yul代码中的return()函数可以实现),那么x=1显然是不能删除的,所以对于上面的合约来说由于y()函数中存在assembly{return(0,0。可以导致整个消息调用终止,x=1自然不能被删除。

SOL跌破15美元:金色财经报道,行情显示,SOL跌破15美元,现报14.99美元,日内跌幅达到21.52%,行情波动较大,请做好风险控制。[2022/11/10 12:43:56]

但在Solidity编译器中,由于代码逻辑的问题,使得x=1在编译时被错误的删除,永久改变了代码逻辑。

实际编译测试结果如下:

震惊!不应该被优化的x=1的Yul代码丢了!欲知后事如何,请往下看。

在solidiry编译器代码的UnusedStoreEliminator中,通过SSA变量追踪和控制流追踪来判断一个Storage写入操作是否是冗余的。当进入一个自定义函数中时,UnusedStoreEliminator如果遇到:

memory或storage写入操作:将memory和storage写入操作存储到m_store变量中,并将该操作的初始状态设置为Undecided;

函数调用:获取函数的memory或storage读写操作位置,并和m_store变量中存储的所有Undecided状态下的操作进行对比:

SOL跌破150美元关口 日内跌幅为11.18%:火币全球站数据显示,SOL短线下跌,跌破150美元关口,现报149.9998美元,日内跌幅达到11.18%,行情波动较大,请做好风险控制。[2021/9/8 23:09:35]

1.如果是对m_store中存储操作的写入覆盖,则将m_store中对应的操作状态改为Unused

2.如果是对m_store中存储操作的读取,则将对应m_store中的对应操作状态改为Used

3.如果该函数没有任何可以继续执行消息调用的分支,将m_store中所有的内存写操作改为Unused

1.在上诉条件下,如果函数可以终止执行流,将m_store中,状态为Undecided状态的storage写操作改为Used;反之,标识为Unused

函数结束:将所有标记为Unused的写入操作删除

对memory或storage写入操作的初始化代码如下:

可以看到,将遇到的memory和storage写入操作存储到m_store中

人物 | 前白宫CIO Carlos Solari已加入金融科技公司PlatinumDEX:据Pr.com消息,3月13日,总部位于伦敦的金融科技公司PlatinumDEX发布公告称,前白宫首席信息官(CIO)、网络安全专家Carlos Solari已加入该公司,出任首席信息官一职。据悉,PlatinumDEX的目标是构建世界上最安全的端到端加密货币交换平台。[2019/3/17]

遇到函数调用时的处理逻辑代码如下:

其中,operationFromFunctionCall()和applyOperation()实现上诉的2.1,2.2处理逻辑。位于下方的基于函数的canContinue和canTerminate进行判断的If语句实现2.3逻辑。

需要注意,正是下方的If判断的缺陷,导致了漏洞的存在!!!

operationFromFunctionCall()来获取该函数的所有memory或storage读写操作,这里需要注意,Yul中存在很多的内置函数,例如sstore(),return()。这里可以看到对于内置函数和用户定义函数有不同的处理逻辑。

而applyOperation()函数则是将从operationFromFuncitonCall()获取的所有读写操作进行对比,来判断存储到m_store中的是否在该次函数调用中被读写,并修改m_store中的对应的操作状态。

考虑上述的UnusedStoreEliminator优化逻辑对Eocene合约的attack()函数的处理:

将x=1存储操作到m_store变量中,状态设置为Undecided

1.遇到y()函数调用,获取y()函数调用的所有读写操作

2.遍历m_store变量,发现y()调用引起的所有读写操作和x=1无关,x=1状态仍然是Undecided

1.获取y()函数的控制流逻辑,因为y()函数存在可以正常返回的分支,所以canContinue为True,不进入If判断。x=1状态仍然为Undecided!!!

3.遇到x=2存储操作:

1.遍历m_store变量,发现处于Undecided状态的x=1,x=2操作覆盖x=1,设置x=1状态为Unused。

2.将x=2操作存入m_store,初始状态为undecided。

4.函数结束:

1.将所有m_store中undecided状态的操作状态改为Used

2.将所有m_store中Unused状态的操作删除

显然,在调用函数时,如果被调用函数可以终止消息执行,应该将被调用函数前所有的Undecided状态的写入操作改为Used,而不是依旧保留为Undecided,导致位于被调用函数前的写入操作被错误的删除。

此外,需要注意的是,每个用户自定义函数控制流标识是会传递的,所以在多个函数递归调用的场景下,即便最底层函数满足上诉逻辑,x=1也有可能被删除。

在Solidity中,举例了基本相同的逻辑下,不会受到影响的合约代码。但,该代码不受该漏洞的影响并不是因为UnusedStoreEliminator的处理逻辑存在其他可能,而是在UnusedStoreEliminator之前的Yul优化步骤中,存在FullInliner优化过程会将微小或只有一次调用的被调用函数,嵌入到调用函数中,避免了漏洞触发条件中的用户定义函数。

contractNormal{

uintpublicx;

functionf(boola)public{

x=1;

g(a);

x=2;

}

functiong(boola)internal{

if(!a)

assembly{return(0,0。

}

}

编译结果如下:

函数g(boola)被嵌入到函数f()中,避免了用户定义函数的漏洞条件,避免了漏洞的产生。

2.解决方案

最根本的解决方案是不使用在受影响范围的solidity编译器进行编译,如果需要使用漏洞版本的编译器,可以考虑在编译时去除UnusedStoreEliminator优化步骤。

如果想要从合约代码层面进行漏洞缓解,考虑到多个优化步骤的复杂性,以及实际函数调用流的复杂性,请寻找专业的安全人员进行代码审计来帮助发现合约中的因为该漏洞导致的安全问题。

标签:TORSTOSTOROREcloudstorageSTOSSTORM价格Radioreum

币赢热门资讯
稳定币:Tether项目周报(0327-0402)-ODAILY

BeInCrypto专访Paolo-稳定币危机:了解最近稳定币的脱锚事件稳定币是加密生态系统的重要组成部分。因此,当他们失去“稳定性”时,可能会导致很多事情出错.

1900/1/1 0:00:00
cosmos:模块化之争:波卡的Substrate框架与Cosmos SDK谁将引领未来?-ODAILY

背景此前区块链的发展,一直以来都在开启公链的军备竞赛,新公链都旨在探索更快的性能以及更低的成本,从而能够支持区块链可能的大规模商用.

1900/1/1 0:00:00
区块链:阿里巴巴曾鸣:区块链创造价值必须跨过的四个坎

编者按:本文来源于巴比特,星球日报经授权转载5月11日,“区块链前沿技术·中美交流论坛”在杭州师范大学举行.

1900/1/1 0:00:00
NFT:案例研究:Animoca如何利用数据来启动Mocaverse-ODAILY

Mar.2023,Daniel数据源:MocaverseMintingMonitoring;MocaverseRealTimeNFTAirdropMonitoringNFT是Web3社区的基础.

1900/1/1 0:00:00
Huobi:火必推出OTC Desk服务:产品创新+合规化双管齐下-ODAILY

近日,加密货币交易平台火必Huobi宣布推出OTCDesk服务,以低点差和零服务费为全球专业投资者提供低廉和多元的大额出入金交易服务。这是火必自提出全球化发展战略以来又一重磅举措.

1900/1/1 0:00:00
USD:长铗:信息与计算力的大爆炸可能会导致超级智能

编者按:本文来自巴比特资讯,作者:海伦星球日报经授权转载。近日,巴比特、比原创始人长铗在亚太科幻大会想象力产业论坛上,分享了他作为科幻作家的经历与如今的区块链事业间的联系.

1900/1/1 0:00:00