買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > 瑞波幣 > Info

LID:Solidity編譯器漏洞分析:ABI重編碼的缺陷_Aditus

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

Cyber Capital創始人:SOL有太多危險訊號:金色財經報道,加密風投基金Cyber Capital創始人兼首席投資官Justin Bons在社交媒體發布長文稱,Solana(SOL)有太多危險信號,他首先強調區塊鏈永遠不應該宕機,但Solana是過去幾個月中唯一宕機七次的區塊鏈,此外SOL團隊在2020年4月聲稱 Token 總流通量為 820 萬枚,但其實超過 2000 萬枚,因此涉嫌公然欺詐,而且還被第三方發現一個未鎖定的Solana錢包,其中包含1300萬枚SOL。Justin Bons還表示,Solana圍繞TPS指標做出虛假陳述,比如SOL網絡因執行40萬TPS而癱瘓。Justin Bons聲稱,希望Solana能改變并修復這些缺陷。[2022/7/24 2:33:48]

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

contractEocene{

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

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

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

??????}

}

Solana DeFi協議Exotic Markets籌集500萬美元:金色財經報道,Solana DeFi協議Exotic Markets在由Multicoin和Ascensive Assets共同領導的代幣銷售中籌集了500萬美元。Exotic Markets在由EXO代幣管理的基于Solana的平臺上提供一系列結構化產品。Exotic Markets聯合創始人Joffrey Dalet表示,新資金將用于加強團隊和營銷工作。部分融資將用于平臺上的做市活動,以幫助推動計劃于2月下旬推出的主網。[2022/1/6 8:27:59]

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

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

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

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

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

Solana成立基金會 并公開理事會成員:公鏈項目開發團隊Solana Labs宣布已于4月8日將Solana項目的相關的知識產權和大多數代幣SOL轉交給了Solana基金會。官方表示,Solana基金會初期的重點是擴張和開發基于Solana協議的生態系統,其具體的舉措為:資助和委托項目、教育、開發、研究(可驗證延遲函數、密碼學、共識算法等)。Solana基金會的理事會成員分別是Solana聯合創始人Anatoly Yakovenko、加密貨幣工程師James Prestwich、Patrick von Felton、Multicoin執行董事Mable Jiang,基金會的執行理事是Eric Williams。[2020/6/8]

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

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

0000000000000000000000000000000000000000000000000000000000000002??????//lengthofa

動態 | 以太坊基金會:Solidity最新版本已修復近期發現的全部漏洞:據ambcrypto報道,根據以太坊基金會新發布的一篇博文,以太坊基金會在ABI編碼器中發現了一個漏洞,在優化器中發現了兩個漏洞。此外,該團隊在過去的兩周還在Solidity Optimizer中發現了兩個漏洞。但是,這些錯誤的影響不大。該博客稱,昨天發布的Solidity最新版本0.5.7包含了對所有漏洞的修復。[2019/3/28]

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

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

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

美國國家網絡安全中心正推動科羅拉多州的大學教授編程語言Solidity:據華爾街日報報道,美國國家網絡安全中心(NCC)總長Vance Brown表示,該組織在科羅拉多州的中心與該地區的大學合作,推動這些大學開始教授用于向區塊鏈平臺添加智能合約的編程語言Solidity。[2018/5/26]

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

如果?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

Tags:SOLSOLIDLIDDITSOL幣很垃圾SOLID價格MOSOLIDAditus

瑞波幣
SWAP:CAKE為何暴跌?LSD、Layer2和DeFi 這三個賽道_PAN

CAKE暴跌原因竟是這個?BSC鏈DEX要大變局?首先大家要知道博餅是什么,他是幣安一手捧起來的DEX,幣安鏈的太子爺,幣安鏈交易首選產品.

1900/1/1 0:00:00
區塊鏈:幣圈院士:4.26比特幣(BTC)以太坊(ETH)吸籌結束?_MAC

文章編輯時間:2023.4.26凌晨00:50,文章發布到網站審核有延遲,主要做參考為主,具體以實時策略為主雖然早有預期,但第一共和銀行上個月存款流失超過1000億美元還是震驚了市場.

1900/1/1 0:00:00
COM:XT.COM關於暫停GALA充提的公告_HTT

尊敬的XT.COM用戶:因GALA錢包升級維護,XT.COM現已暫停GALA充提業務。給您帶來的不便,請您諒解!感謝您對XT.COM的支持與信任.

1900/1/1 0:00:00
ECT:Pro-XRP律師放棄了針對SEC的重磅炸彈索賠!_0XPROOF

Coinbase已對美國證券交易委員會(SEC)采取法律行動,因為他們沒有對其提交的文件做出回應,他們聲稱這是他們做出決定的主要原因.

1900/1/1 0:00:00
USH:SHIB 較 21 年歷史高點下跌 88%_USHA價格

喬治·奧威爾(GeorgeOrwell)在1984年的名言“誰控制了過去,誰就控制了未來,誰控制了現在,誰就控制了過去”,這句話適用于互聯網還不是世界主導力量的時代.

1900/1/1 0:00:00
BAL:BKEX 關于上線 OPTIMISMDOGE(Optimism Doge)的公告_GLO

尊敬的用戶:?????????BKEX即將上線OPTIMISMDOGE,詳情如下:上線交易對:OPTIMISMDOGE/USDT??幣種類型:BEP20充值功能開放時間:已開放交易功能開放時間:.

1900/1/1 0:00:00
ads