此篇文章由 Cobo 區塊鏈安全研究團隊供稿,團隊成員來自知名安全實驗室,有多
年網絡安全與漏洞挖掘經驗,曾協助谷歌 、微軟處理高危漏洞,並獲得谷歌、微軟等廠商致謝,曾在微軟 MSRC 最有價值安全研究員Top 榜單中取得卓越的成績。
團隊目前重點關注智能合約安全、DeFi 安全等方面 ,研究並分享前沿區塊鏈安全技術。
我們也希望對加密數字貨幣領域有研究精神和科學方法論的終身迭代學習者可以加
入我們的行列,向行業輸出思考洞察與研究觀點!
此篇是CoboLabs的第
7
篇文章。
日前 Stargate 跨鏈橋的底層協議 LayerZero更新了默認的交易驗證合約,經 Cobo 區塊鏈安全團隊分析,此次更新修復了之前版本中存在的嚴重漏洞,該漏洞可能導致所有依托 LayerZero 構建的跨鏈項目的資產受到影響。
Stargate Finance(https://stargate.finance/ )是近日最受人矚目的跨鏈橋項目,截至發文時 TVL 已超過 35 億美金。
Stargate 跨鏈橋底層基於 LayerZero 實現跨鏈消息傳遞。LayerZero 完成跨鏈消息傳遞的基本原理是:
Oracle 會將源鏈上的 blockhash 和 block receiptsRoot 提交到目標鏈上Relayer 會將源鏈上跨鏈消息所在交易的 receipt 以及該 receipt 與 block receiptsRoot 的路徑關係提交到目標鏈上,此時目標鏈上的交易驗證合約會基於 Ethereum MPT [1] 的依賴關係,對 Relayer 所提交的 receipt 和 Oracle 所提交的 receiptsRoot 的對應關係進行驗證如果驗證通過,該 receipt 被認為是合法的 receipt,並向上層協議轉發,觸發後續的跨鏈資產操作
LayerZero 3 月 28 日在未發表任何公告的情況下更新了跨鏈使用的驗證合約[2]。Cobo 安全團隊通過對比原始驗證合約(MPTValidator)和新驗證合約(MPTValidatorV2)代碼[3],發現本次更新是對之前重大安全漏洞的修復。
補丁核心代碼如下:
原始漏洞代碼在進行 MPT 驗證時,通過外部傳入的 pointer 來獲取下一層計算所用到的 hashRoot。這裡使用 solidity 底層 add, mload 等彙編指令從 proofBytes 中獲取 hashRoot ,由於沒有限制 pointer 在 proofBytes 長度內,因此攻擊者可以通過傳入越界的 pointer,使合約讀取到 proofBytes 以外的數據作為下一層的 hashRoot。這樣就存在偽造 hashRoot 的可能,進一步導致偽造的交易 receipt 可以通過 MPT 驗證。最終可造成的後果是,在 Oracle 完全可信的前提下,Relayer 仍可以單方面通過偽造 receipt 數據的方式來實現對跨鏈協議的攻擊,打破了 LayerZero 之前的安全假設。
目前 LayerZero 協議的 Oracle 是一個類似多籤的合約,三位 admin 中的兩位提交相同的數據後,會被認為數據是有效的。但是 Relayer 是單籤 EOA 控制,任何一個 Relayer 都可以提交攻擊數據,完成所有的攻擊流程。
補丁後的代碼使用傳入的 path 並使用 safeGetItemByIndex 函數獲取 MPT 下一層的 hashRoot,保證了 hashRoot 存在於當前的 proofBytes 中,從而可以使 MPT 驗證正確的進行下去。
此次爆出漏洞的代碼是 LayerZero 協議中最核心的 MPT 交易驗證部分的代碼,是整個 LayerZero 及上層協議(例如 Stargate)正常運作的基石。雖然LayerZero項目方已經修復了目前明顯的漏洞,但是不排除還存在其他被攻擊漏洞的可能性。此外,LayerZero 項目的關鍵合約目前大都還被 EOA 控制,沒有採用多簽機製或者時間鎖機制。如果這些特權 EOA 的私鑰一旦洩漏,也可能會導致所有上層協議的資產受到影響。
在此,Cobo 區塊鏈安全團隊提醒投資者註意新項目的風險,同時呼籲 LayerZero 項目方在對合約代碼進行深度審計的同時,也盡快將目前 EOA 控制的特權轉移給多籤或者時間鎖合約,減少攻擊風險敞口。