買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > LTC > Info

DIT:Solidity編譯器漏洞分析:ABI重編碼的缺陷-ODAILY_SOLID

Author:

Time:1900/1/1 0:00:00

總覽

本文從源代碼層面對Solidity編譯器(0.5.8<=version<0.8.16)在ABIReencoding過程中,由于對固定長度的uint和bytes32類型數組的錯誤處理所導致的漏洞問題進行詳細分析,并提出相關的解決方案及規避措施。

漏洞詳情

ABI編碼格式是用在用戶或合約對合約進行函數調用,傳遞參數時的標準編碼方式。具體可以參考Solidity官方關于ABI編碼的詳細表述。

在合約開發過程中,會從用戶或其他合約傳來的calldata數據中,獲取需要的數據,之后可能會將獲取的數據進行轉發或emit等操作。限于evm虛擬機的所有opcode操作都是基于memory、stack和storage,所以在Solidity中,涉及到需要對數據進行ABI編碼的操作,都會將calldata中的數據根據新的順序按照ABI格式進行編碼,并存儲到memory中。

該過程本身并沒有大的邏輯問題,但是當和Solidity的cleanup機制結合時,由于Solidity編譯器代碼本身的疏漏,就導致了漏洞的存在。

根據ABI編碼規則,在去掉函數選擇符之后,ABI編碼的數據分為head和tail兩部分。當數據格式為固定長度的uint或bytes32數組時,ABI會將該類型的數據都存儲在head部分。而Solidity對memory中cleanup機制的實現是在當前索引的內存被使用后,將下一個索引的內存置空,以防止下一索引的內存使用時被臟數據影響。并且,當Solidity對一組參數數據進行ABI編碼時,是按照從左到右的順序進行編碼!!

Bakkt以監管不明確為由下架ADA、MATIC、SOL:6月16日消息,加密交易所Bakkt以監管不明確為由下架ADA、MATIC、SOL。此前5月消息,受監管因素和行業發展影響,Bakkt大規模下架了多種數字資產。Bakkt的一位發言人表示,在完成對Apex Crypto的收購之后,作為交易所常規代幣上市審查程序的一部分,我們決定在平臺上下架一些代幣。[2023/6/16 21:42:33]

為了便于后面的漏洞原理探索,考慮如下形式的合約代碼:

contractEocene{

eventVerifyABI(bytes,uint);

functionverifyABI(bytescalldataa,uintcalldatab)public{

emitVerifyABI(a,b);//Event數據會按照ABI格式編碼之后存儲到鏈上

}

}

合約Eocene中verifyABI函數的作用,僅僅是將函數參數中的不定長bytesa和定長uintb進行emit。

這里需要注意,event事件也會觸發ABI編碼。這里參數a,b會編碼成ABI格式后再存儲到鏈上。

我們使用v0.8.14版本的Solidity對合約代碼進行編譯,通過remix進行部署,并傳入verifyABI(,)。

Aurora上借貸協議Bastion更新預言機機制,新增對Trisolaris上代幣價格的參考:9月19日消息,Aurora上借貸協議Bastion更新預言機機制,新增對Aurora上DEX協議Trisolaris上代幣時間加權平均價格(TWAP)的參考,當該價格與預言機Flux的喂價相差超過15%時會凍結交易價格直至恢復正常。此外,Bastion建立了Bastion Dashboard以對預言機系統進行實時監控。[2022/9/19 7:06:00]

首先,我們看一看對verifyABI(,)的正確編碼格式:

0x52cd1a9c//bytes4(sha3("verify(btyes,uint)"))

0000000000000000000000000000000000000000000000000000000000000060//indexofa

0000000000000000000000000000000000000000000000000000000000011111//b

0000000000000000000000000000000000000000000000000000000000022222//b

0000000000000000000000000000000000000000000000000000000000000002//lengthofa

算法穩定幣 USA宣布將從Solana切換至Aptos進行啟動:8月17日消息,Defi 協議 Argo 宣布旗下算法穩定幣 USA 將從 Solana 切換至 Aptos 進行啟動,并將于 Aptos 主網上線首日啟動。Argo 表示,Aptos 在 Move VM 上運行,Move 讓編寫安全、可審計的合同變得更加容易。[2022/8/17 12:30:49]

0000000000000000000000000000000000000000000000000000000000000040//indexofa

0000000000000000000000000000000000000000000000000000000000000080//indexofa

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

aaaaaa0000000000000000000000000000000000000000000000000000000000//a

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

bbbbbb0000000000000000000000000000000000000000000000000000000000//a

數據:當前Solana生態總市值為176.13億美元,近24小時下跌4.9%:金色財經消息,據CoinGecko最新數據顯示,當前Solana生態總市值為176.13億美元(截至發稿時為17,613,081,582美元,近24小時下跌4.9%),24小時交易額為2,452,544,134美元。[2022/7/1 1:43:18]

如果Solidity編譯器正常,當參數a,b被event事件記錄到鏈上時,數據格式應該和我們發送的一樣。讓我們實際調用合約試試看,并對鏈上的log進行查看,如果想自己對比,可以查看該TX。

成功調用后,合約event事件記錄如下:

!!震驚,緊跟b的,存儲a參數長度的值被錯誤的刪除了!!

0000000000000000000000000000000000000000000000000000000000000060//indexofa

0000000000000000000000000000000000000000000000000000000000011111//b

0000000000000000000000000000000000000000000000000000000000022222//b

0000000000000000000000000000000000000000000000000000000000000000//lengthofa??whybecome0??

Solend發起提案提議授予Solend Labs緊急權力以臨時接管巨鯨賬戶:6月19日消息,Solana 生態借貸協議 Solend 發起治理提案,提議:對占借款總額 20% 以上的巨鯨制定特殊的保證金要求。如果用戶的借款超過主池所有借款的 20%,則需要 35% 的特殊清算門檻。該政策將在提案獲得批準后生效;授予 Solend Labs 緊急權力以暫時接管鯨魚的賬戶,以便清算可以在場外交易中執行,避免將 Solana 推到極限,這將通過智能合約升級來完成。一旦鯨魚的賬戶達到安全水平,緊急權力將被撤銷。該提案將于 5.5 個小時后投票截止。

此前消息,Solend 創始人 Rooter 發推敦促某個巨鯨(3oSE 開頭地址)盡快償還貸款,否則會進一步降低 SOL 價格,讓其他賬戶面臨清算。Solend 已臨時禁用其 Main Pool 的 USDC、USDT 和 SOL 借款。[2022/6/19 4:38:35]

0000000000000000000000000000000000000000000000000000000000000040//indexofa

0000000000000000000000000000000000000000000000000000000000000080//indexofa

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

aaaaaa0000000000000000000000000000000000000000000000000000000000//a

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

bbbbbb0000000000000000000000000000000000000000000000000000000000//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獲取定長bytes32或uint數組數據到memory中時,Solidity總是會在數據復制完畢后,將后一個內存索引數據置為0。又由于ABI編碼存在head和tail兩部分,且編碼順序也是從左至右,就導致了漏洞的存在。

具體漏洞的Solidity編譯代碼如下:

當源數據存儲位置為Calldata,且源數據類型為ByteArray,String,或者源數組基礎類型為uint或bytes32時進入ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup()

進入之后,會首先通過fromArrayType.isDynamicallySized()對源數據是否為定長數組來對源數據進行判斷,只有定長數組才符合漏洞觸發條件。

將isByteArrayOrString()判斷結果傳遞給YulUtilFunctions::copyToMemoryFunction(),根據判斷結果來確定是否在calldatacopy操作完成后,對后一個索引位置進行cleanup。

上訴幾個約束條件結合,就只有位于calldata中的源數據格式為定長的uint或bytes32的數組復制到內存時才能觸發漏洞。也即是漏洞觸發的約束條件產生的原因。

由于ABI進行參數編碼時,總是從左到右的順序,考慮到漏洞的利用條件,我們必須要明白,必須在定長的uint和bytes32數組前,存在動態長度類型的數據被存儲到ABI編碼格式的tail部分,且定長的uint或bytes32數組必須位于待編碼參數的最后一個位置。

原因很明顯,如果定長的數據沒有位于最后一個待編碼參數位置,那么對后一內存位置的置0不會有任何影響,因為下個編碼參數會覆蓋該位置。如果定長數據前面沒有數據需要被存儲到tail部分,那么即便后一內存位置被置0也沒有關系,因為該位置并不背ABI編碼使用。

另外,需要注意的是,所有的隱式或顯示的ABI操作,以及符合格式的所有Tuple,都會受到該漏洞的影響。

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

event

error

abi.encode*

returns//thereturnoffunction

struct//theuserdefinedstruct

allexternalcall

解決方案

當合約代碼中存在上訴受影響的操作時,保證最后一個參數不為定長的uint或bytes32數組

使用不受漏洞影響的Solidity編譯器

尋求專業的安全人員的幫助,對合約進行專業的安全審計

關于我們

AtEoceneResearch,weprovidetheinsightsofintentionsandsecuritybehindeverythingyouknowordon'tknowofblockchain,andempowereveryindividualandorganizationtoanswercomplexquestionswehadn'tevendreamedofbackthen.

Learnmore:Website|Medium|Twitter

Tags:SOLDITLIDSOLIDNFTSOL價格MicroCreditTokenMOSOLIDSolidblock

LTC
RED:個人如何從Qredo治理中受益-ODAILY_REDSHIBA價格

Qredo首先是為機構設計的。但它提供的治理工具對個人也非常有用。您的Qredo錢包的自定義簽名方案和子賬戶可用于一切,從保護您的遺產到保護您的資產免受基本攻擊.

1900/1/1 0:00:00
ICK:困擾傳統票務市場的那些疑難雜癥,“NFT+票務”會是良藥嗎?-ODAILY_TIC

原文來源:mta1verse在音樂行業,不論是作為藝人還是作為觀眾,現場演出都是人們喜聞樂見的重要活動。起步時期的音樂人多在本地演出,而頂級歌星則可能有例行的全球巡回演出.

1900/1/1 0:00:00
WIN:萬字長文解析ERC3525在游戲賽道的應用-ODAILY_XWIN價格

參與者 SolvProtocol孟巖老師ERC3525主要作者之一EthanXWINNERCofounderStanXWINNER顧問David整理自Twitterspace全文刪減優化部分內容.

1900/1/1 0:00:00
DEFI:LSD如何再次點燃DeFi Summer-ODAILY_EFI

引言 以太坊的崛起,為DeFi生態起到了開天辟地的作用。從最早ICO,項目通過以太坊智能合約出售首次發行的代幣進行融資,迎來了ICO浪潮,觸發了2017~2018年的加密貨幣牛市,為之后的DeF.

1900/1/1 0:00:00
RON:波場TRON賬戶總數突破1.49億-ODAILY_TerraClassicUSD

區塊鏈瀏覽器TRONSCAN最新數據顯示,截至2023年3月27日,波場TRON賬戶總數達到149,073,353,正式突破1.49億.

1900/1/1 0:00:00
區塊鏈:聯邦快遞CEO史密斯:要么擁抱區塊鏈,要么“等死”_HOLDEX幣

圖片來源:coindesk據彭博社報道,在Coindesk舉辦的2018年年度共識大會上,美國物流巨頭聯邦快遞公司FedEx董事長兼CEOFredSmith強調了區塊鏈技術的重要價值.

1900/1/1 0:00:00
ads