天天看點

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

作者:知道創宇區塊鍊實驗室

1.前言

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

2.分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

2.1 基礎資訊

攻擊合約:0x580cac65c2620d194371ef29eb887a7d8dcc91bf

攻擊者位址:0x7c42f2a7d9ad01294ecef9be1e38272c84607593

攻擊 tx:0x7d2296bcb936aa5e2397ddf8ccba59f54a178c3901666b49291d880369dbcf31

漏洞合約:0x781ad73f140815763d9A4D4752DAf9203361D07D

2.2 流程

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

2.3 細節

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

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析
知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析
知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

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

知道創宇區塊鍊安全實驗室|bHOME 重入攻擊事件分析

3. 總結

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

繼續閱讀