以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads

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

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

數據:當前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]

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

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

Solana鏈上NFT交易額突破13億美元:金色財經報道,據3 月 11 日最新數據顯示,Solana鏈上NFT交易總額已突破13億美元,本文撰寫時為1,302,485,898美元,鏈上交易量達到1,416,473筆。當前Solana區塊鏈上NFT交易額最大的NFT項目是Solana Monkey Business,交易額為158,606,010美元,其次是Degenerate Ape Academy,交易額為126,335,802美元,這兩個NFT項目交易額約占Solana鏈上交易總額的四分之一。[2022/3/11 13:50:42]

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

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

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

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

Solana網絡故障超12小時等待重啟,超過70%節點已升級至1.6.24最新版本:9月15日消息,公鏈Solana的主網Beta版自北京時間昨夜19:52開始出現不穩定狀況,至今已達12小時,Solana鏈上應用至今無法正常運轉。SolanaStatus發布的信息稱,Solana驗證人社區選擇協同重啟網絡,快照高度為slot96542804。Solana Status建議驗證節點更新至Mainnet-Beta1.6.24版本。

截止發稿時,Solana瀏覽器Solana Beach數據顯示,目前有71.4%的驗證人已經升級至1.6.24版本。Solana的主網Beta版進行重啟需要驗證節點達到80%的絕對多數同意。[2021/9/15 23:25:52]

0000000000000000000000000000000000000000000000000000000000000002??????//lengthofa

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

Solana將與韓國資本合作進軍韓國市場:Solana基金會已與韓國大型區塊鏈加速器 ROK Capital 合作推出了 2000 萬美元的基金,旨在通過助力各種項目來發展 Solana 區塊鏈生態系統。通過與韓國企業合作,該基金還將使 Solana 能夠擴大其在當地的影響力。新基金已經在幾個項目中分配了資金,其中包括 Mercurial Finance、Synthetify、Symmetry 和 Parrot。(U.today)[2021/6/3 23:09:20]

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

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

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

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

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

金色晨訊 | BTC重新站上10700美元,VanEck,SolidX將于周四向機構投資者出售比特幣ETF:1.體育技術巨頭FanDuel接受比特幣存款

2.美聯儲羅森格倫:對加密貨幣匿名性的特點存在顧慮

3.Morgan Creek創始人:第一個擁抱比特幣的國家將具有顯著的優勢

4.美國資產管理巨頭計劃推出投資于區塊鏈股票的政府貨幣市場基金

5.BTC重新站上10700美元

6.Fusion Foundation與日內瓦大學合作對學生進行區塊鏈教育

7.美國前財政部官員敦促國會對加密礦工進行監管

8.三星為支持區塊鏈的固態硬盤申請專利

9.華爾街日報:VanEck,SolidX將于周四向機構投資者出售比特幣ETF[2019/9/4]

!!震驚,緊跟?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:SOLOLASolanaLANASolalgoPOLAsolana幣挖礦solana幣怎么挖礦

火幣網下載官方app
THE:Euro Tether (EURT)

一、項目簡介? Tether于2014年推出,是一個支持區塊鏈的平臺,旨在促進以數字方式使用法定貨幣。Tether致力于通過更現代的貨幣方法來破壞傳統的金融體系.

1900/1/1 0:00:00
OIN:關于部分ETF產品合股的公告

尊敬的CoinW用戶: 幣贏CoinW將于2023年4月28日15:00(UTC8)進行BONK3S,INJ4S,RNDR4S,WOOF4L,DYDX4S,LRC4S,RARI4L,OKT6L.

1900/1/1 0:00:00
FLO:這個行情都能暴漲55%的FLOKI,是下一個百倍幣嗎?

公眾號:小七財圈 4月24日FLOKI宣布即將在Binance.US上架,隨即FLOKI迎來暴漲,價格最高漲幅達到了55.39%,交易量漲幅達到818.48%.

1900/1/1 0:00:00
數字資產:響應「上海升級」!ETH 質押提取激活后,我們需要關注什么?

「Shapella網絡升級」完成后,以太坊信標鏈質押提取功能被激活,這標志著以太坊即將進入一個新的發展時期.

1900/1/1 0:00:00
ADA:卡爾達諾價格可能會在上漲 20%之前吸引早期的 ADA 多頭

在周末緊密盤整后,卡爾達諾價格在過去12小時內上漲了5%。最初的反彈可能會困住早期的ADA多頭,并在強勁的15%反彈開始之前平倉空頭.

1900/1/1 0:00:00
TEL:GateLive直播挖礦計劃-收益發放通知(4.17-4.23)

親愛的Gate.io用戶:2023年4月17日至2023年4月23日期間,GateLive主播專享直播返傭收益已結算,發放獎勵已以USDT的形式發放到各主播現貨賬戶,請注意查收.

1900/1/1 0:00:00
ads