漏洞詳情
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的NFT系列Okay Bears與RED合作為全球衛生工作提供資金:金色財經報道,基于Solana的NFT系列Okay Bears周二表示,它正在與全球衛生組織(RED)合作籌集資金,以抗擊艾滋病和全球衛生不公正現象。這兩個實體正在合作開發商品系列,利用兩個品牌的知識產權(IP)發布連帽衫、T恤和腕帶。部分收益將捐贈給全球基金,這是一個致力于為抗擊艾滋病提供資源的組織。Okay Bears首席傳播官彼得古爾德在一份新聞稿中表示,NFT系列是該領域“文化轉變”的象征,利用NFT為慈善事業提供動力。古爾德說,“我們很自豪能與(RED)合作,并在我們使用商品和數字收藏品解決我們這個時代最重要的人權問題的共同歷史的基礎上。”RED的開發業務主管Greg Sheps表示,他將鏈上藝術視為一種創新的籌款工具。[2023/4/14 14:02:46]
為了便于后面的漏洞原理探索,考慮如下形式的合約代碼:
contractEocene{
????????eventVerifyABI(bytes,?uint);
????????functionverifyABI(bytescalldataa,uintcalldatab)public?{
????????????????emitVerifyABI(a,b);?//Event數據會按照?ABI?格式編碼之后存儲到鏈上
Solana流支付協議Zebec完成850萬美元融資,Circle Ventures等參投:8月27日消息,Solana生態流支付協議Zebec以10億美元完全稀釋估值完成850萬美元融資,Circle Ventures、Shima Capital、Resolute Ventures參投。
預計到2022年底,Zebec的收入將達到2000萬美元,凈利潤為600萬美元。今年早些時候,Zebec與Visa合作,加入其Fintech Fast Track Program。Zebec很快將推出定制借記卡。此外,到2024年,Zebec用戶數量預計將達到200萬個。Zebec還計劃在收入達到1萬億美元后推出穩定幣。
據此前報道,今年3月,Zebec已通過代幣公開銷售和私募融資2800萬美元,并推出ZBC代幣。其中2100萬美元的私募投資者包括Circle、Coinbase、Solana Ventures、Lightspeed Venture Partners和Alameda Research,另外700萬美元的代幣公開銷售是與Republic合作完成。(Bitcoinist)[2022/8/27 12:51:47]
??????}
}
合約?Eocene?中?verifyABI?函數的作用,僅僅是將函數參數中的不定長?bytesa?和定長?uintb?進行?emit。
這里需要注意,event?事件也會觸發?ABI?編碼。這里參數?a,?b?會編碼成?ABI?格式后再存儲到鏈上。
加密貨幣托管公司Copper與Solana合作集成DeFi入口:金色財經報道,加密貨幣托管公司Copper宣布與Solana合作集成DeFi入口,使用戶能夠使用該公司的CopperConnect多方計算(MPC)技術安全地進行交易。據悉,CopperConnect于2020年11月推出,是一種專用的DeFi工具,供Copper的機構客戶借出、借入、質押和交換Token。[2022/8/19 12:34:59]
我們使用?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
Neodyme:solana代幣借貸合同中的漏洞已修復:金色財經報道,據Neodyme的安全研究人員稱,我們最近在 solana-program-library (SPL) 的代幣借貸合同中發現了一個嚴重錯誤。存在風險的TVL總額約為26億美元。其中一些價值被借出,其他一些低價值的代幣在經濟上是不可行的,但潛在的利潤很容易達到數億。
這個漏洞被修復了,dapps也及時更新,關閉了這個漏洞。我們相信最安全的代碼是開源的,作為審計師,我們相信編寫更好的代碼的最好方法之一是了解漏洞。[2021/12/5 12:52:40]
0000000000000000000000000000000000000000000000000000000000000002??????//lengthofa
0000000000000000000000000000000000000000000000000000000000000040??????//indexofa
0000000000000000000000000000000000000000000000000000000000000080??????//indexofa
0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa
動態 | 2019年12月Rust語言區塊鏈生態開發活躍度調查:Solana排行第一:自從去年起被廣泛應用于眾多明星項目后,區塊鏈領域被認為是新一代系統級語言的Rust成為了加密生態的重要技術組成部分。在2019年12月活躍度統計中,Solana以343次合并位居第一。根據Rust社區12月對區塊鏈技術的生態進展總結報告,眾多Rust明星項目大多數保持著活躍的開發表現:其中以超高性能著稱的公鏈Solana以343次Github合并數位列活躍度第一、以太坊Parity客戶端以192次合并排行第二,原子跨鏈項目COMIT和分片公鏈NEAR緊隨其后。[2020/1/3]
aaaaaa?0000000000000000000000000000000000000000000000000000000000??????//a
0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa
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
BothLock-up&EarnGXE(14days)andFlexibleStaking&EarnGXE(28days)areavailableonGate.
1900/1/1 0:00:00ShibaInu正在交易具有四個“零”的指數,并且在過去18個月中努力刪除一個“零”。SHIB在2021年10月打破了“零”,在3天內飆升1,000%,達到0.00008616美元的歷史新高.
1900/1/1 0:00:00鯨魚銷售是今天下跌的幕后推手,BTC突然下跌超過2,000美元。在期貨中尋求利潤的投資者在短短一個小時內就損失了超過1億美元。考慮到交易量已經下跌到每天300億美元的水平,這個數字已經相當高了.
1900/1/1 0:00:004月27日消息,DBNEWSWIRE發推特稱,今日凌晨收到區塊鏈情報公司ArkhamIntelligence發布的警報,稱Mt.Gox和美國政府的比特幣錢包進行交易,隨后DB發布提醒推文.
1900/1/1 0:00:00當前整體市場走勢還是很弱勢,香港大會以及上次加息25到來的fomo已經逐漸褪熱,行情回歸到了暴漲之前!很多人都在說大餅3萬是牛熊的分界線,這次大餅上了3萬以上之后并未穩住,這幾天連續下跌.
1900/1/1 0:00:00在歷史性的銀行擠兌之后,比特幣價格在整個2023年一直處于上升趨勢,但最近被拒絕突破關鍵的30,000美元水平.
1900/1/1 0:00:00