宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > 比特币 > 正文

Solidity编译器漏洞分析:ABI重编码的缺陷

作者:

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

漏洞详情

ABI?编码格式是用在用户或合约对合约进行函数调用,传递参数时的标准编码方式。具体可以参考?Solidity?官方关于ABI?编码的详细表述。

在合约开发过程中,会从用户或其他合约传来的?calldata?数据中,获取需要的数据,之后可能会将获取的数据进行转发或?emit?等操作。限于?evm?虚拟机的所有?opcode?操作都是基于?memory、stack?和?storage,所以在?Solidity?中,涉及到需要对数据进行?ABI?编码的操作,都会将?calldata?中的数据根据新的顺序按照?ABI?格式进行编码,并存储到?memory?中。

该过程本身并没有大的逻辑问题,但是当和?Solidity?的cleanup?机制结合时,由于?Solidity?编译器代码本身的疏漏,就导致了漏洞的存在。

根据?ABI?编码规则,在去掉函数选择符之后,ABI?编码的数据分为?head?和?tail?两部分。当数据格式为固定长度的?uint?或?bytes?32?数组时,ABI?会将该类型的数据都存储在?head?部分。而?Solidity?对?memory?中?cleanup?机制的实现是在当前索引的内存被使用后,将下一个索引的内存置空,以防止下一索引的内存使用时被脏数据影响。并且,当?Solidity?对一组参数数据进行?ABI?编码时,是按照从左到右的顺序进行编码!!

Multicoin致投资者信:预计FTX破产将杀死更多加密公司,仍然相信Solana:11月18日消息,加密投资基金Multicoin两位合伙人Kyle Samani和Tushar Jain于周四发布了致投资者信,披露了基金情况以及对市场的观点和看法:

1. FTX的崩溃以及带来的下跌已使Multicoin本月内资产规模下跌55%。

2. 我们过于信任我们与FTX的关系,以至于在FTX上拥有太多资产。通常,Multicoin在FTX、Coinbase和Binance这三个交易所进行交易,现在,除了在FTX上的资产,100%资产都在Coinbase上或在自我保管的钱包中。

3. 加密货币市场不会很快积极转向,我们预计未来几周FTX/Alameda的影响会蔓延,导致更多的加密公司崩盘,这将给整个加密生态系统的流动性和交易量带来更多压力。

4. 随着资产与FTX挂钩的其他公司寻求应急资金,我们希望以更有吸引力的估值购买错位的资产。

5. Multicoin仍然坚持自己的立场,仍然相信Solana,他拥有“最活跃的开发者社区之一”,根据我们在2018年和2020年的经验,如果核心论点没有受损,在短期危机期间出售资产是不明智的。

6. 正如雷曼兄弟倒闭并没有扼杀银行业,安然公司破产也不是能源公司的消亡,FTX不会是加密行业的终结。随着杠杆从系统中清除,我们预计明年会出现新的萌芽,我们知道这个行业和我们投资组合中的建设者是一些最敬业的人,他们不会放弃,我们也不会。[2022/11/18 13:20:44]

为了便于后面的漏洞原理探索,考虑如下形式的合约代码:

SOL短时突破38美元,24小时涨幅超13%:金色财经报道,行情显示,SOL短时突破38美元,最高达38.55美元。截至发稿时价格有所回落,现报37.27美元,24小时涨幅达到13.17%,行情波动较大,请做好风险控制。[2022/11/6 12:21:09]

contractEocene{

????????eventVerifyABI(bytes,?uint);

????????functionverifyABI(bytescalldataa,uintcalldatab)public?{

????????????????emitVerifyABI(a,b);?//Event数据会按照?ABI?格式编码之后存储到链上

??????}

}

合约?Eocene?中?verifyABI?函数的作用,仅仅是将函数参数中的不定长?bytesa?和定长?uintb?进行?emit。

这里需要注意,event?事件也会触发?ABI?编码。这里参数?a,?b?会编码成?ABI?格式后再存储到链上。

我们使用?v?0.8.14?版本的?Solidity?对合约代码进行编译,通过?remix?进行部署,并传入verifyABI(,)。

首先,我们看一看对verifyABI(,)的正确编码格式:

Solana生态流动性服务协议Crema Finance疑似遭遇攻击,团队正在调查:7月3日消息,Solana生态流动性服务协议Crema Finance在推特上表示,其协议疑似遭遇黑客攻击。团队暂时中止了该项目,目前正在进行调查,并将尽快公布事件进展。

此前6月17日消息,Crema Finance完成540万美元私募轮融资。据悉,Crema作为Solana生态流动性服务协议,部署了集中流动性做市商(CLMM)算法以允许用户在指定的价格范围内添加流动性。[2022/7/3 1:47:35]

0x?5?2c?d?1?a?9?c?????????????????????????????????//bytes?4(sha?3("verify(btyes,?uint)"))

0000000000000000000000000000000000000000000000000000000000000060??????//indexof?a

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

0000000000000000000000000000000000000000000000000000000000000002??????//lengthofa

数据:Solana上DeFi协议总锁仓量为83.5亿美元:金色财经报道,DeFiLlama数据显示,Solana上DeFi协议总锁仓量为83.5亿美元.其中,锁仓量排名前三的协议分别是Serum(8.37亿美元)、Raydium(8.06亿美元)、MarinadeFinance(7.94亿美元)。[2022/2/6 9:33:24]

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

aaaaaa?0000000000000000000000000000000000000000000000000000000000??????//a

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

bbbbbb?0000000000000000000000000000000000000000000000000000000000??????//a

Sole Selector允许用户在Solana区块链铸造NFT运动鞋:金色财经报道,CryptoKickers的新项目Sole Selector允许用户在Solana区块链上设计和铸造自己的NFT运动鞋。用户可以打造自己的数码鞋,选择各种款式的鞋带、鞋底和配饰,然后定制颜色和图案。每次选择和升级都会增加铸造NFT的总成本,通常每双鞋在50美元到150美元之间。[2021/7/7 0:32:17]

如果?Solidity?编译器正常,当参数a,?b被?event?事件记录到链上时,数据格式应该和我们发送的一样。让我们实际调用合约试试看,并对链上的?log?进行查看,如果想自己对比,可以查看该TX。

成功调用后,合约?event?事件记录如下:

!!震惊,紧跟?b的,存储?a?参数长度的值被错误的删除了!!

0000000000000000000000000000000000000000000000000000000000000060??????//indexof?a

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

0000000000000000000000000000000000000000000000000000000000000000??????//lengthofa???whybecome0??

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

aaaaaa?0000000000000000000000000000000000000000000000000000000000??????//a

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

bbbbbb?0000000000000000000000000000000000000000000000000000000000??????//a

为什么会这样?

正如我们前面所说,在?Solidity?遇到需要进行?ABI?编码的系列参数时,参数的生成顺序是从左至,具体对?a,?b?的编码逻辑如下

Solidity?先对?a?进行?ABI?编码,按照编码规则,a?的索引放在头部,a?的元素长度以及元素具体值均存放在尾部。

处理?b?数据,因为?b?数据类型为?uint格式,所以数据具体值被存放在?head?部分。但是,由于?Solidity?自身的?cleanup?机制,在内存中存放了?b之后,将?b数据所在的后一个内存地址(被用于存放?a?元素长度的内存地址)的值置?0?。

ABI?编码操作结束,错误编码的数据存储到了链上,SOL-2022-6?漏洞出现。

在源代码层面,具体的错误逻辑也很明显,当需要从?calldata?获取定长?bytes?32?或?uint?数组数据到?memory?中时,Solidity?总是会在数据复制完毕后,将后一个内存索引数据置为?0?。又由于?ABI?编码存在?head?和?tail?两部分,且编码顺序也是从左至右,就导致了漏洞的存在。

具体漏洞的?Solidity?编译代码如下:

当源数据存储位置为?Calldata,且源数据类型为?ByteArray,String,或者源数组基础类型为?uint?或?bytes?32?时进入ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup()

进入之后,会首先通过fromArrayType.isDynamicallySized()对源数据是否为定长数组来对源数据进行判断,只有定长数组才符合漏洞触发条件。

将isByteArrayOrString()判断结果传递给YulUtilFunctions::copyToMemoryFunction(),根据判断结果来确定是否在?calldatacopy?操作完成后,对后一个索引位置进行?cleanup。

上诉几个约束条件结合,就只有位于?calldata?中的源数据格式为定长的?uint?或?bytes?32?的数组复制到内存时才能触发漏洞。也即是漏洞触发的约束条件产生的原因。

由于?ABI?进行参数编码时,总是从左到右的顺序,考虑到漏洞的利用条件,我们必须要明白,必须在定长的?uint?和?bytes?32?数组前,存在动态长度类型的数据被存储到?ABI?编码格式的?tail?部分,且定长的?uint?或?bytes?32?数组必须位于待编码参数的最后一个位置。

原因很明显,如果定长的数据没有位于最后一个待编码参数位置,那么对后一内存位置的置?0?不会有任何影响,因为下个编码参数会覆盖该位置。如果定长数据前面没有数据需要被存储到?tail?部分,那么即便后一内存位置被置?0?也没有关系,因为该位置并不背?ABI?编码使用。

另外,需要注意的是,所有的隐式或显示的?ABI?操作,以及符合格式的所有?Tuple,都会受到该漏洞的影响。

具体的涉及到的操作如下:

event

error

abi.encode*

returns??????//thereturnoffunction

struct???????//theuserdefinedstruct

allexternalcall

当合约代码中存在上诉受影响的操作时,保证最后一个参数不为定长的?uint?或?bytes?32?数组

使用不受漏洞影响的?Solidity?编译器

寻求专业的安全人员的帮助,对合约进行专业的安全审计

Learnmore:Website?|Medium?|Twitter

标签:SOLLIDSOLIDDITsol币币币情SolidexValidity

比特币热门资讯
VGX暴跌别慌,主打的就是玩!

VGX最终还是被币安放弃了,本质上这是商业和的博弈,从头到尾币安是想通过收购来拥抱美国监管,奈何这梁子结的太深了,美国不买账!照此下去币安可能最终就是放弃美国市场,毕竟胳膊拧不过大腿!币安这么来回拉扯回到起点,$VGX完成套现.

1900/1/1 0:00:00
DCG:部分 Genesis Capital 债权人已决定放弃 Genesis 先前协议

ForesightNews消息,根据DigitalCurrencyGroup在推特上发布的关于针对Genesis提交调解动议的声明部分截图,截图表示,「在各方同意GenesisCapital向破产法院提交的全面和解之后的两个月后.

1900/1/1 0:00:00
KuCoin Convert Adds 15 Trading Pairs

DearKuCoinUsers,KuCoinispleasedtoannouncethat15tradingpairshavebeenaddedtoKuCoinConvert!Newtradingpairs:TRX/USDC.

1900/1/1 0:00:00
随着 B??TC 看涨情绪增加,鲸鱼的积累激增

随着对BTC的看涨情绪增加,比特币交易所存款下降。鲸鱼对BTC的兴趣增加,但是,短期持有者获利并离开。在过去三个月上涨之后,比特币的价格开始出现波动。不过,汇兑存款的下降表明持有者对王币的未来仍持乐观态度.

1900/1/1 0:00:00
Beosin:zkSync生态DEX Merlin安全事件分析

原文来源:Beosin 2023?年?4?月?26?日,据?Beosin-EagleEye?态势感知平台消息,MerlinDex?发生安全事件,USDC-WETH?流动性池的资金已全部被提取,攻击者获利共约?180?万美金.

1900/1/1 0:00:00
KuCoin Futures Has Launched USDT Margined ANT, ERN, DC Contracts

DearKuCoinFuturesUsers,KuCoinFutureshaslaunchedANT(Aragon),ERN(Ethernity).

1900/1/1 0:00:00