比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

SOL:Solidity編譯器漏洞分析:ABI重編碼的缺陷_Solarys

Author:

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

Robinhood將于6月28日下架ADA、MATIC和SOL:金色財經報道,據官方公告,Robinhood將于北京時間6月28日6:59終止對Cardano(ADA)、Polygon(MATIC)和Solana(SOL)的支持。在截止日期之前,用戶可以繼續買賣和持有ADA、MATIC和SOL。截止日期后,用戶在RobinhoodCrypto賬戶中持有的任何ADA、MATIC和SOL都將按市場價值出售。[2023/6/9 21:27:05]

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

contractEocene{

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

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

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

??????}

}

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

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

Solana鏈上TVL較去年11月歷史高點跌近98%:12月27日消息,據 DeFiLlama 數據顯示,當前 Solana 鏈上 TVL 為 2.1496 億美元,較去年 11 月 9 日 TVL 歷史高點(101.7 億美元)下降約 97.88%。[2022/12/27 22:11:01]

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

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

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發布網絡重啟說明:10月1日消息,Solana 發布網絡重啟說明:請主網Beta驗證者按照重啟說明進行操作,已確認的最高區塊高度為solt 153139220。同時請勿刪除分類賬目錄,無論驗證者安裝的是1.10.39版本或是1.13.1版本,請停留在當前版本。

據Solana主網狀態頁面顯示,該網絡目前仍處于中斷狀態。[2022/10/1 22:43:30]

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

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

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

Solana基金會:Solana主網Beta版擁有896個質押驗證者:Solana基金會發推稱,“在像Solana這樣的PoS網絡中,最大化網絡上高質量驗證者的總數以及這些節點的權益分配非常重要。這就是我們創建Solana基金會委托計劃的原因。委托計劃通過戰略性地將SOL委托給滿足特定性能和去中心化標準的現有以及新驗證者,促進Solana網絡的發展和安全。自2021年6月以來,320多個驗證者節點上線,反映出人們對Solana生態系統各個層面的興趣激增。如今Solana主網Beta版擁有896個質押驗證者,這些驗證者位于28個國家的150個數據中心,擁有92個獨立ASN。權益和實體基礎設施的廣泛分布有助于保持Solana網絡的安全性和抵御攻擊或故障的能力,確保每個人都可以隨時訪問該網絡。”[2021/8/28 22:42:42]

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

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

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

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

Kin將于12月15日將遷移至公鏈Solana:12月14日消息,區塊鏈社交平臺Kin的開發商Kik宣布放棄以太坊鏈,并將于12月15日將加密貨幣Kin遷移至Solana區塊鏈。官方表示,在遷移之前,Solana將進行一次主網升級,以實現一些針對Kin的新??優化。與此同時,Kin生態系統有超過5500萬個賬戶,在遷移過程中,余額為1美元或1美元以上的Kin賬戶將被優先考慮。開發者正在遷移做最后的準備,以確保一切順利進行。今年5月消息,社交平臺Kin提出遷移至公鏈Solana的方案。(Decrypt)[2020/12/14 15:10:22]

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

Tags:SOLSOLALANAOLASOL幣最新價格Solaryssolana幣今日價格行情SOLARIX

酷幣交易所
SHI:盡管價格下跌,柴犬(SHIB)投資者仍表現出強烈的持有心態_加密貨幣市場是什么意思

ShibaInu(SHIB)的價值在加密貨幣市場經歷了顯著價格下跌的一周內下跌。然而,出人意料的是,它的投資者表現出了韌性,并持有他們親愛的meme代幣,抵制了在出現下跌跡象時賣出的誘惑.

1900/1/1 0:00:00
比特幣:導致ETH和加密市場持續下跌?_usdc幣與usdt幣哪個好

V神失戀了?導致以太坊和加密資產暴跌?前兩天,我看孫宇晨的推特,說是加密市場和ETH之所以持續,持續下跌,是因為V神失戀了,看來V神的情緒化也很嚴重啊,哈哈.

1900/1/1 0:00:00
比特幣:BGB 上漲 10.03%,今日加密貨幣行情分析_加密貨幣市場總市值一直會變嗎

公眾呺:Web3團子 主要亮點: 加密貨幣總市值在過去24小時內從1.16T美元增加到1.17T美元,漲幅為0.09%在過去24小時內上漲0.25%后,截至發稿時比特幣價格為27.

1900/1/1 0:00:00
BTC:機構信貸基礎設施 Credora 完成 600 萬美元融資,S&P Global 和 Coinbase Ventures 等參投_Oraichain Token

ForesightNews消息,據CoinDesk報道,跨越CeFi和DeFi的機構信貸基礎設施提供商Credora完成600萬美元融資.

1900/1/1 0:00:00
BTC:渣打說BTC能漲10萬,DOGE、LTC、FIL 怎么看?_BTC2幣

Coinbase起訴SEC,說SEC非法管控數字資產,要求SEC給個說法。前兩天SEC對Coinbase開刀,同時禁止質押和穩定幣相關業務,美國最新規定將嚴控DeFi和穩定幣,以后要避免介入De.

1900/1/1 0:00:00
LDO:Lido 發布有關質押存款狀??態的更新,其中包含詳細信息_ANC

LDO的資金流量指標上周出現了周中支點,此后實現了一些上行,證實流動性正在流入。 公眾呺:Web3團子 盡管市場低迷,但Lido每周的抵押存款都在增加.

1900/1/1 0:00:00
ads