北京時間2022年8月2日,CertiK安全團隊監測到Nomad Bridge遭受攻擊,導致了價值約1.9億美元的損失。
合約的問題在於在initialize() 函數被調用的時候,“committedRoot” 被設成了0x00地址。因此,攻擊者可以通過消息的驗證,將在橋合約中的代幣轉移。
攻擊步驟
① 攻擊者調用process()函數开始攻擊。
② process()函數中調用了acceptableRoot(messages[_messageHash]),這個函數檢查了被提交的root以及OptimisticTimeOut是否過期。
③此時函數acceptableRoot(messages[_messageHash])返回了true,也就是說這條message就被批准了。這是因爲0x0000在初始化過程中被設置爲了true(CertiK安全專家認爲這是部署過程中產生的錯誤)。
④當這條message被批准後,攻擊者即可從橋中轉移資金。
攻擊交易
攻擊示例:
○ 在Moonbeam Bridge上轉移了0.01 WBTC: https://moonscan.io/tx/0xcca9299c739a1b538150af007a34aba516b6dade1965e80198be021e3166fe4c
○ 在Etherem Bridge接受了100WBTC代幣轉移:https://etherscan.io/tx/0xa5fe9d044e4f3e5aa5bc4c0709333cd2190cba0f4e7f16bcf73f49f83e4a5460
漏洞分析
在Replica合約中,“committedRoot”被錯誤地初始化爲0 (https://etherscan.io/tx/0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad)。
合約地址:https://etherscan.io/address/0x88a69b4e698a4b090df6cf5bd7b2d47325ad30a3
函數process通過調用函數acceptableRoot()確保message hash能通過驗證。
函數acceptableRoot()會檢查root是否已經被proven, processed或者confirmed。
然而在初始化的交易中0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad,owner傳入了0x00並且它對應的`confirmAt`也會在初始化中被設爲1。
因此0x00可以被當作一個`acceptableRoot`,這也可以在replica合約中查詢到https://etherscan.io/address/0xb92336759618f55bd0f8313bd843604592e27bd8。
Prove函數的實現導致了一條unproven message的root是0,而0作爲一個有效的confirmed root可以通過require的檢查。攻擊者只需調用process函數就能從橋中轉移資金。
資金去向
大約價值1.9億美元的代幣從橋合約中轉移出去。
https://defillama.com/protocol/nomad?denomination=USD
寫在最後
由於該問題是由部署參數中的錯誤引起的,我們假設所有的部署和配置都是正確的,那么在傳統的審計中確實很難發現該問題。然而,在包含驗證部署過程等更廣泛的審計過程中,是可以有效指出該問題的。
CertiK可提供部署階段後的附加服務——合約驗證,其中包括對智能合約的分析和部署後合約驗證的深入分析。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
標題:驚天魔盜 近2億美金損失——Nomad Bridge攻擊事件分析
地址:https://www.torrentbusiness.com/article/9477.html
標籤: