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

新加坡安全公司Numen發現Aptos公鏈首個高危0day漏洞_BSP

Author:

Time:1900/1/1 0:00:00

1.前言

相對于ethereum的soldity語言,move語言最近越來越火,而且由于其自身相對于soldity的強大優勢,越來越受到重視。其中move語言被用于很多明星項目,比如Aptos,sui。近期我們的Web3 安全漏洞檢測產品發現了一個整數溢出的漏洞。可以導致Aptos節點崩潰,造成拒絕服務。本文通過對該漏洞的介紹,希望大家對move語言以及其安全性有更多的認識和理解。作為move語言安全性研究的領導者,我們會持續關注move語言的安全性,為move的生態安全做出我們的貢獻。 

2.Move語言的重要概念

模塊和腳本 

Move 有兩種不同類型的程序:模塊(Modules)和腳本(Script)。模塊是定義結構類型以及對這些類型進行操作的函數的庫。結構類型定義了 Move 的全局存儲的模式,模塊函數定義了更新存儲的規則。模塊本身也存儲在全局存儲中。腳本是可執行文件的入口點,類似于傳統語言中的主函數 main。腳本通常調用已發布模塊的函數來更新全局存儲。腳本是臨時代碼片段,不會發布在全局存儲中。一個 Move 源文件(或編譯單元)可能包含多個模塊和腳本。然而,發布模塊或執行腳本都是獨立的虛擬機(VM)操作。 

對于熟悉操作系統的人來說,move的module就類似系統的可執行文件運行的時候加載的動態庫模塊,而script類似主程序。用戶可以通過自己編寫script,來訪問全局存儲,包括調用module模塊的代碼。 

全局存儲 

Move 程序的目的是讀取和寫入樹形的持久全局存儲。程序不能訪問文件系統、網絡或任何此樹以外的數據。 

在偽代碼中,全局存儲看起來像: 

MAS高管:新加坡央行審查加密貨幣服務許可證申請已至最后階段:7月27日消息,新加坡金融管理局(MAS)負責監管金融機構的部長Tharman Shanmugaratnam表示,新加坡中央銀行正處于審查提供加密服務的許可證申請的最后階段,加密服務包括支付和加密貨幣交易所的運營。迄今為止,新加坡已根據去年1月生效的《支付服務法》收到了480多項加密服務許可證申請。其中,約170名申請人(即35%已申請提供DPT(數字支付代幣)服務。[2021/7/27 1:18:05]

從結構上講,全局存儲是一個森林(forest),這個森林由以賬戶地址(address)為根的樹組成。每個地址可以存儲資源(resource)數據和模塊(module)代碼。如上面的偽代碼所示,每個地址(address)最多可以存儲一個給定類型的資源值,最多可以存儲一個給定名稱的模塊。  

MOVE虛擬機原理 

movevm 與evm虛擬機都一樣,需要將源碼編譯成字節碼,然后在虛擬機中執行,下圖是整體的流程: 

1.將字節碼通過函數execute_script被加載進來 

2.執行load_script函數,這個函數主要用來反序列化字節碼,并校驗字節碼是否合法,如果校驗失敗,就會返回失敗 

3.校驗成功之后就會開始執行真正的字節碼代碼 

新加坡WBF交易所將于9月15日正式上線IDOO:據官方消息顯示,新加坡時間2020年9月15日,WBF交易所將正式上線IDOO,并于當日18時在Defi區上線IDOO/USDT交易對,而IDOO充值將于14日11時開啟,且16日16時即可提幣。

idoo為io chain的通證治理代幣,為io chain的抵押借貸即挖礦模式創造流通性,io chain致力于打造去中心化商業金融公鏈,即高tps的處理和精確的算法,達到全模式上鏈,全生態的idoo體系。[2020/9/14]

4.執行字節碼,訪問或修改全局存儲的狀態,包括資源,modules 

注:move語言還有很多特性,這里我們就不一一介紹,后續我們會從安全性角度繼續分析move語言的特性。 

3.漏洞描述

本漏洞主要設計驗證模塊,在講具體漏洞之前先介紹下驗證模塊的功能以及StackUsageVerifier::verify。 

驗證模塊 

通過前面,我們知道在真正執行字節碼代碼之前,會有驗證字節碼的環節,而驗證環節有可以細分為好多子過程, 

分別是: 

BoundsChecker,邊界檢查,主要是用來檢查module與script的邊界安全。具體包括檢查signature,constants等的邊界 

DuplicationChecker, 該模塊實現了一個檢查器,用于驗證 CompiledModule 中的每個向量是否包含不同的值 

SignatureChecker,用于檢查signature被用于函數參數,本地變量,結構體成員時,字段結構正確 

動態 | 新加坡本地數碼銀行執照申請競爭激烈:新加坡至少有五方將競標兩張全面數碼銀行執照,以及14方至17方競標三張批發數碼銀行執照。其中一家可能競標全面數碼銀行執照的公司是職總創優企業合作社,它將于渣打銀行合組財團聯手競標。另一家有意競標的本地企業是EZ-Link,而Grab和新電信和大東方合作告吹。新加坡金融管理局在今年八月開放了純數碼銀行執照供非銀行業者申請,申請成功者將在2021年中開始營業。金管局也列出申請數碼銀行的詳細準則,包括全面數碼銀行(digital full bank)不準利用提款機或存款機,或加入現有提款機或存款機網絡。不過,它可通過銷售點電子轉賬服務(EFTPOS)讓客戶提取現款。該局表示,這是因為數碼銀行的宗旨是采納創新數碼方式來服務客戶,以及支持未來數碼經濟。(聯合早報)[2019/12/24]

InstructionConsistency,驗證指令一致性 

constants用于驗證常量,常量的類型必須是原始類型,常量的數據正確的序列化為其類型 

CodeUnitVerifier,驗證函數體代碼的正確性,分別通過stack_usage_verifier.rs與abstract_interpreter.rs來達到目的 

script_signature,用于驗證一個腳本或入口函數是否是一個有效的簽名 

該漏洞發生在verify環節 CodeUnitVerifier::verify_script(config, script)?;函數中。可以看這里有許多的verify子流程。 

動態 | 新加坡理工學院將于明年開設區塊鏈相關課程:據Straitstimes消息,新加坡理工學院(SP)將在明年2月開設新的區塊鏈課程,以滿足區塊鏈技術對人才不斷增長的需求。該課程主要針對專業人士,課程內容包括創建加密貨幣、建立區塊鏈生態系統和開發智能合約。課程主要由IBM新加坡區塊鏈創新中心的前研究科學家Ernie Teo博士主持。[2018/12/21]

分別是stack安全校驗,類型安全校驗名,本地變量安全性校驗,以及引用安全校驗。而漏洞產生的地方就在棧安全校驗過程中。 

棧安全校驗(StackUsageVerifier::verify) 

該模塊用于驗證函數的字節碼指令序列中的基本塊是否以平衡的方式使用。 每個基本塊除了那些以 Ret(返回給調用者)操作碼結尾的,必須確保離開block時候棧高度 與開頭時候相同。 此外,對于任何基本塊的塊,棧高度不得低于開始時的棧高度。 

循環校驗所有代碼塊是否滿足以上條件:  

即循環遍歷驗證所有基本塊的合法性。 

漏洞詳情 

前面已經介紹過,由于movevm是棧虛擬機,在驗證指令合法性的時候,很顯然,第一需要確保指令字節碼是否正確,第二需要確保棧空間經過一個block代碼塊調用之后,棧內存合法,即棧操作之后,棧保持平衡。verify_block函數正是用來完成第二個目的的。 

聲音 | 火幣律林楊錦炎: 新加坡《數字代幣發行指引》有六大亮點:對于新加坡《數字代幣發行指引》的修訂,火幣律林總經理楊錦炎表示其具有以下亮點,一、新指引將數字代幣的商業信托納入“資本市場產品”,所增加的商業信托和衍生品不過是新加坡金管局對于市場中經常出現的資本市場產品的列舉,讓從業者對金管局的判斷尺度有更清晰的概念;二、強化了監管主體和反洗錢反恐監管,被監管的主體幾乎涵蓋金融市場的全部玩家;三、支付型代幣和穩定幣要持牌經營,依據新法,任何從業者提供任何涉及支付型代幣的或者運營平臺交易任何支付型代幣的必須獲得證照,并且遵守支付法案關于反洗錢和反恐怖融資的規定。一旦代幣具備支付功能,則任何提供支付代幣交易服務的公司必須依據支付法案申請牌照;四、強調新加坡證券幣標準有別于美國,新加坡依據其本國法律對某一種代幣是否構成新加坡證券和期貨定義下的“資本市場產品”進行獨立的判斷;五、積分不構成“資本市場產品”,積分型代幣不是證券和期貨法定義下的“資本市場產品”。但是,發幣者必須遵守反洗錢和反恐融資的相關法律以及個人信息保護法;六、代幣回購具有證券屬性,需持牌進行。[2018/12/3]

從verify_block代碼中我們可以看到,for循環會循環解析block代碼塊中的所有指令,然后通過對num_pops, num_pushes加減操作來驗證指令塊的對棧的影響是否合法,首先通過對stack_size_increment < num_pops來判斷棧空間是否合法,如果num_pops大于stack_size_increment就說明字節碼pop的數目大于棧本身的大小,就返回錯誤,字節碼校驗失敗。然后通過 stack_size_increment -= num_pops; stack_size_increment += num_pushes; 這兩條指令來修改每個指令執行之后對棧的高度的影響,最后當循環結束之后,stack_size_increment需要等于0,即保持本block內的操作之后,需要保持棧的平衡。 

看起來這里似乎沒什么問題,但是由于這里在執行16行代碼的時候,沒有去判斷是否存在整數溢出,導致可以通過構造超大num_pushes,間接控制stack_size_increment,從而產生整數溢出漏洞。那么如何構造構造這樣一個巨大的push數目呢?這里首先需要介紹一下move bytecode 文件格式。 

move bytecode 文件格式 

如同Windows PE文件,或者linux ELF文件,move的字節碼文件以.mv為結尾,文件本身也是有一定的格式的,總的來說move bytecode文件格式如圖所示: 

首先是macgic,值為A11CEB0B,接下來是版本信息,以及table的數目,之后是tables headers,這里可以有很多個tables,table kinds就是table的類型,總共有0x10種(如圖的右邊所示),更多詳細信息可以去看move語言文檔,接下來是table的偏移,以及table的長度。之后就是table的contents了,最后是Specific Data,有兩種,對于module來說就是Module Specific Data,對于script類型來說就是Script Specific Data。 

構造的惡意文件格式 

這里我們與aptos交互的時候,是以script來完成的,所以我們構造了下圖所示的文件格式,就可以造成stack_size_increment溢出: 

首先來解釋一下這個字節碼文件的格式: 

+0x00-0x03: 是macgic word 0xA11CEB0B 

+0x04-0x7: 文件格式版本,這里為版本4 

+0x8-0x8: 為table count這里為1 

+0x9-0x9: 為table kind 這里是 SIGNATURES 類型 

+0xa-0xa: 為table offset, 這里為0 

+0xb-0xb: 為table length,這里為0x10 

+0xc-0x18:為 SIGNATURES Token數據 

從0x22開始為scrip的mian函數code代碼部分 

通過move-disassembler工具,我們可以看到指令的反匯編代碼如下: 

其中 0,1,2三條指令對應的代碼就是紅框,綠框,黃框的數據。 

LdU64與漏洞本身無關,我們這里就不做過多解釋,感興趣的可以自行查看代碼。這里重點解釋下VecUnpack指令,VecUnpack的作用就是在代碼中碰到vector對象的時候,需要將數據全部push到棧上。 

在構造的這個文件中,我們構造了兩次VecUnpack,其vector的num分別是3315214543476364830,18394158839224997406, 

當執行函數instruction_effect的時候,實際上執行的是下面第二行代碼: 

執行完instruction_effect函數第一次返回(1,3315214543476364830),此時stack_size_increment為0,num_pops為1,num_pushes為3315214543476364830,執行第二次返回(1,18394158839224997406)。當再次執行 stack_size_increment += num_pushes; 

stack_size_increment已經為0x2e020210021e161d(3315214543476364829), 

num_pushes為0xff452e02021e161e(18394158839224997406),當兩者相加之后,大于u64的最大值,產生了數據截斷,stack_size_increment的值成為了0x12d473012043c2c3b,造成了整數溢出,從而造成了aptos節點崩潰,進而導致節點運行停止的嚴重影響(由于rust語言的安全特性,并不會向c/c++那樣造成更進一步的代碼安全影響)。 

4.漏洞影響

本漏洞由于是發生在movevm 執行模塊,所以對于鏈上節點,只要執行該字節碼代碼,就會造成DoS攻擊,嚴重的情況下,可以使得aptos網絡完全停止運行,會對其生態造成難以估量的影響,以及對節點的穩定性產生嚴重影響。 

5.官方修復

當我們發現這個漏洞之后,第一時間報告給了官方,官方也很快修復了漏洞: 

官方的修復也很簡單,就是對stack_size_increment的加減分別做了溢出檢測。如果有溢出就直接返回異常。 

金色財經Maxwell

Bankless

金色薦讀

FastDaily

中國金融雜志

巴比特資訊

元宇宙之道

Tags:BSPNBSMOVMOVEBSPAY價格nbs幣發行量MOVEY價格MoveCash

歐易交易所
三分鐘讀懂 Taiko:EVM 等效的 ZK Rollup_以太坊

撰文:0x5b79 編譯:aididiaojp.eth,Foresight News以太坊作為一個全球性的、可信的中立結算層,引入了強大的數字所有權,并為用戶提供了隨時隨地轉移價值的可能.

1900/1/1 0:00:00
金色觀察 | 都在談論的XEN是個啥 11個問題讀懂_XEN

2022年10月9日一開始,加密社區都在談論XEN。因為據ultrasound.money數據,XEN上線僅約8個小時,XEN燃燒的ETH就達到1300枚ETH.

1900/1/1 0:00:00
比特幣急需一個答案:鮑威爾是2022年的保羅·沃爾克嗎_比特幣

如果美聯儲主席杰羅姆·鮑威爾贏得通脹戰怎么辦?比特幣能剛得住嗎?如果美聯儲主席杰羅姆·鮑威爾(Jerome Powell)贏得通脹戰怎么辦?美聯儲再次大幅加息之后.

1900/1/1 0:00:00
微信公眾平臺《行為規范》:提供數字藏品二級交易服務將被封號_區塊鏈

微信公眾平臺《行為規范》新增數字藏品交易行為相關條款,明確提出從事虛擬貨幣或數字藏品類業務為違規經營行為,提供數字藏品二級交易服務將被封號.

1900/1/1 0:00:00
關注:DeFi 堆棧中的風險_DEFI

去中心化金融(DeFi)是一種基于區塊鏈的金融形式,在沒有任何中心化的中介的情況下提供金融服務.

1900/1/1 0:00:00
在上海舉行的藝術展上 觀眾紛紛領取數字藏品_NFT

昨天,“帶你走進NFT的奇幻世界”主題活動在上海世博文化公園原意大利館舉行,來自樹圖區塊鏈研究院、淘派科技的區塊鏈專家與“窗——杜海軍藝術展”策展人、藝術家共聚一堂.

1900/1/1 0:00:00
ads