以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads

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

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編碼時,是按照從左到右的順序進行編碼!!

Solana基金會、Ripple和GBBC等機構結成合作伙伴關系:金色財經報道,Solana 基金會和區塊鏈平臺 Ripple 正在與行業組織全球區塊鏈商業委員會(GBBC) 合作,以加速使用基于加密的解決方案應對氣候變化。新成立的非政府組織名為 Blockchain x Climate Leadership Network (BxC),旨在成為“全球范圍內氣候行動創新者、領導者和建設者最大的單一共同聚會”。[2023/1/18 11:17:40]

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

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(,)。

Adam Cochran:Jump Crypto或因過度投資Solana生態以及FTX而痛苦:金色財經報道,Cinneamhain Ventures合伙人Adam Cochran發布推文稱,“我不知道有關Jump Crypto的消息,但我剛意識到今天對他們來說一定是糟糕的一天,因為他們有著對Solana生態系統的過度投資以及對FTX的共同投資。”[2022/11/9 12:36:53]

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

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

0000000000000000000000000000000000000000000000000000000000000060//indexofa

0000000000000000000000000000000000000000000000000000000000011111//b

0000000000000000000000000000000000000000000000000000000000022222//b

0000000000000000000000000000000000000000000000000000000000000002//lengthofa

0000000000000000000000000000000000000000000000000000000000000040//indexofa

Solana鏈上消息通知項目Dialect宣布完成410萬美元種子輪融資:3月2日消息,Solana 鏈上消息通知項目 Dialect 完成 410 萬美元種子輪融資,Multicoin Capital 和 Jump Capital 共同領投。

據悉,Dialect 將幫助 Solana 用戶監控鏈上活動并將通知直接發送到與加密錢包相關聯的移動設備,還可以幫助開發人員在其應用程序中構建錢包到錢包的聊天。(CoinDesk)[2022/3/2 13:33:05]

0000000000000000000000000000000000000000000000000000000000000080//indexofa

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

aaaaaa0000000000000000000000000000000000000000000000000000000000//a

0000000000000000000000000000000000000000000000000000000000000003//lengthofa

bbbbbb0000000000000000000000000000000000000000000000000000000000//a

FTX將于7月6日晚9點上線Solrise(SLRS)現貨:官方消息,FTX將于7月6日晚9點上線Solrise(SLRS)現貨。[2021/7/5 0:27:39]

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

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

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

0000000000000000000000000000000000000000000000000000000000000060//indexofa

0000000000000000000000000000000000000000000000000000000000011111//b

0000000000000000000000000000000000000000000000000000000000022222//b

0000000000000000000000000000000000000000000000000000000000000000//lengthofa??whybecome0??

0000000000000000000000000000000000000000000000000000000000000040//indexofa

Gate.io上線SOL SKL杠桿ETF產品交易:據官方公告,Gate.io已上線SOL和SKL多倍做多和做空杠桿產品,漲跌幅為對應幣種市場的多倍。ETF產品在永續合約市場對沖管理,僅收取每日0.1%管理費來彌補合約市場手續費和資金費率等開銷成本,但不額外收取合約資金費率。由于區塊鏈杠桿ETF產品漲跌幅度大,風險很高,請務必謹慎參與。[2020/12/28 15:52:21]

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:SOLSOLIDDITLIDMarinade staked SOLSOLID幣PussyCreditValidity

比特幣行情
下輪GameFi牛市的引爆點:一種新的Web2導流方式-ODAILY_WEB

一,2023年初的小牛市揭示的財富密碼2023年1月1日,BTC的價格還在16500U,截止撰寫本文的2月6日,BTC的價格是在23000U左右,一個月出頭漲幅40%.

1900/1/1 0:00:00
龍白滔:數字貨幣潮下的貨幣競爭與體系重塑_數字貨幣

編者按:本文來自數字資產研究院CIDA,作者:龍白滔,星球日報經授權發布。薦言|有關《數字貨幣潮下的貨幣競爭與體系重塑》的評價白滔發表的《數字貨幣潮下的貨幣競爭與體系重塑》,是最近關于數字貨幣討.

1900/1/1 0:00:00
火必連續推出持幣生息產品,USDT定期7天理財產品APY達12% -ODAILY_GAL

萬物皆有周期,加密市場亦如此。歷經兩年投資盛宴后,2022年加密市場鏈上各項數據嚴重縮水,足以見證市場的慘烈,尤其是FTX等巨頭的倒塌讓這個加密寒冬格外凜冽,到處彌漫著無盡的悲觀情緒.

1900/1/1 0:00:00
SignalPlus每日晨報(20230330)-ODAILY_SIG

各位朋友,歡迎來到SignalPlus每日晨報。SignalPlus晨報每天為各位更新宏觀市場信息,并分享我們對宏觀趨勢的觀察和看法。歡迎追蹤訂閱,與我們一起關注最新的市場動態.

1900/1/1 0:00:00
歐洲央行描繪CBDC藍圖,電子商務會是第一個受益市場嗎?-ODAILY_BDC

盡管尚未決定是否采用數字歐元,但歐洲央行已經認為CBDC應該優先考慮在線支付和點對點交易。在最近的一份在線出版物中,歐元系統銀行實體解釋說,數字歐元的其他可能用途應該排在對在線交易的有效支持之后.

1900/1/1 0:00:00
個人如何從Qredo治理中受益-ODAILY_RED

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

1900/1/1 0:00:00
ads