知道創宇:bHOME 重入攻擊事件分析

BaconProtocol遭受黑客攻擊損失約958,166美元,黑客利用重入漏洞,並憑藉閃電貸擴大收益額。 1.前言

北京時間3 月5 日,知道創宇區塊鏈安全實驗室監測到BaconProtocol 遭受黑客攻擊損失約958,166 美元,本次攻擊利用重入漏洞,並憑藉閃電貸擴大收益額。目前攻擊者地址還沒有被加入USDC 的黑名單中。

2.分析

攻擊事件如下圖所示,該次攻擊事件的問題點在於lend()函數,攻擊者利用該函數進行重入攻擊。

2.1 基礎信息

攻擊合約:0x580cac65c2620d194371ef29eb887a7d8dcc91bf

攻擊者地址:0x7c42f2a7d9ad01294ecef9be1e38272c84607593

攻擊tx:0x7d2296bcb936aa5e2397ddf8ccba59f54a178c3901666b49291d880369dbcf31

漏洞合約:0x781ad73f140815763d9A4D4752DAf9203361D07D

2.2 流程

1.攻擊者通過Uniswap V2 閃電貸借出6,360,000 USDC。

2.用閃電貸借出的6,360,000 USDC 分成3 份,去bHOME 中進行2次重入攻擊調用了3次lend()函數鑄造共8,465,943.180104 bHOME。

3.將剛才重入獲得的bHOME 拿去銷毀贖回獲得7,336,924.998 USDC。

4、歸還閃電貸借出的6,360,000 USDC,並支付19,716 的手續費,最後將剩餘的957,208.998 USDC 轉入自己的賬戶。

2.3 細節

該次攻擊事件重點在於lend() 函數,由於合約https://etherscan.io/address/0x781ad73f140815763d9a4d4752daf9203361d07d#code 並未驗證開源,所以我們只能從交易的Debugger 中尋找線索。

1、攻擊者通過Uniswap V2 閃電貸借出6,360,000 USDC。

2、用閃電貸借出的6,360,000 USDC 分成3 份,去bHOME 中進行重入攻擊2 次調用lend() 函數鑄造共8,465,943.180104 bHOME。

3、將剛才重入獲得的bHOME 拿去銷毀贖回獲得7,336,924.998 USDC。

4、歸還閃電貸借出的6,360,000 USDC,並支付19,716 的手續費,最後將剩餘的957,208.998 USDC 轉入自己的賬戶。

2.3 細節

該次攻擊事件重點在於lend() 函數,由於合約https://etherscan.io/address/0x781ad73f140815763d9a4d4752daf9203361d07d#code 並未驗證開源,所以我們只能從交易的Debugger 中尋找線索。

分析Debugger 可以看到下圖是第一次調用函數,接著進行了2 次重入。

從重入攻擊中可以找到INPUT 中調用函數的字節碼為0xa6aa57ce。

通過字節簽名可以知道重入攻擊調用的是lend() 函數。

從Debugger 中我們可以發現攻擊合約的地址0x781ad73f140815763d9a4d4752daf9203361d07d。

通過反編譯合約0x781ad73f140815763d9a4d4752daf9203361d07d 得到合約偽代碼內容,可以找到lend() 函數(465 – 550 行)。

我們在反編譯的代碼中可以看到該合約使用的ERC777 協議,會查詢recipient 的回調合約並回調tokensReceived() 函數用以重入攻擊。

通過分析可以發現_index 就是傳入的USDC 數量。

totalSupply 和balanceOf[caller] 的增量都和_index 是正比關係,和stor104 是反比關係,並且這兩個變量的更新發生在重入攻擊之前,每次都會更新。

stor104 記錄的是用戶存入的USDC 總量,該變量的更新發生在重入之後,那麼在重入的過程中stor104 的值是不變的,而上面的totalSupply 是在變大,所以最後return 的值也會相應的增大,從而使得攻擊者通過重入攻擊鑄造得到比正常邏輯更多的bHOME 代幣。

除了該次攻擊事件,BlockSec Team 還阻斷了後面發生的攻擊並將金額返還給了項目方。交易hash:0xf3bd801f5a75ec8177af654374f2901b5ad928abcc0a99432fb5a20981e7bbd1

圖片圖片

3. 總結

此次攻擊事件是由於項目方使用了ERC777 協議但沒有對回調合約的安全性進行考慮從而導致了重入攻擊的發生,當項目合約有涉及資產的轉移時,建議使用「檢查-生效-交互」模式來保證邏輯代碼的安全,當然我們也可以使用OpenZeppelin 官方提供的ReentrancyGuard 修飾器來防止重入攻擊的發生。

展開全文打開碳鏈價值APP 查看更多精彩資訊

Total
0
Shares
Related Posts