<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Hundred Finance 攻擊事件分析

      Hundred Finance

      背景知識

      Hundred Finance 是 fork Compound 的一個借貸項目,在2023/04/15遭受了黑客攻擊。攻擊者在發起攻擊交易之前執行了兩筆準備交易占據了池子,因為發起攻擊的前提是池子處于 empty 的狀態(發行的 hToken 數量為 0)。

      準備交易:

      1. https://optimistic.etherscan.io/tx/0xf479b1f397080ac01d042311ac5b060ceccef491867c1796d12ad16a8f12a47e
      2. https://optimistic.etherscan.io/tx/0x771a16e02a8273fddf9d9d63ae64ff49330d44d31575af3dff0018b04da39fcc

      攻擊交易:Phalcon || Tendery

      交易分析

      兩次準備交易一共存入 63816 + 30000000 = 30063816 wei WBTC,獲得 3190800 + 1499976495 = 1503167295 wei hWBTC

      WBTC decimal = 8,hWBTC decimal = 8


      執行攻擊交易,首先從 AAVE V3 閃電貸出來 500 WBTC

      image

      通過 tendery 的模擬交易可以查詢到,在攻擊交易執行前,池子中存在 30064194 wei WBTC

      image

      首先 redeem 之前存入的所有 WBTC,將池子還原到 empty 的狀態。

      image

      redeem 之后池子中存在 378 wei WBTC(其中1wei為留存資金,377wei為reserve資金),發行 0 hWBTC。empty狀態僅代表 hWBTC 的 totalsupply 為 0。(如果先入為主地認為 WBTC的數量也為0,那么當你看到后面的時候會發現憑空多redeem出來了1 wei WBTC)

      創建合約 0xd340 并往其中發送 50030063816 wei WBTC


      合約 0xd340:

      首先存入 4 WBTC,mint 200 hWBTC

      image

      redeem 19999999998 wei hWBTC,收到 4 WBTC。此時合約持有 2 wei hWBTC

      image

      向池子轉入 50030063816 wei WBTC,然后借出 1021.915074492787011273 ETH

      image

      調用 redeemUnderlying 函數取出 50030063815 wei WBTC,消耗 1 wei hWBTC。此時合約持有 1 wei hWBTC。

      image


      攻擊合約調用 liquidateBorrow 函數對創建的 0xd340 合約的債務進行清算。支付 0.000000267919888739 ETH,獲得 1 wei hWBTC。

      image

      redeem 1 wei hWBTC,獲得 2 wei WBTC,此時池子重新回到 empty 狀態。這樣做的目的是為了可以再次掏空其他池子。

      image

      把 50030063817 wei WBTC 轉移走

      image

      隨后攻擊者又再進行了6次相同的操作來掏空其他的池子完成獲利,文章篇幅有限就不再展開說明。

      漏洞代碼分析

      合約 0xd340 在進行 redeem 操作時利用了精度丟失的漏洞,獲取超額的 WBTC 。漏洞的發生在于 redeemFresh 函數中。

      image

      進入到 trace 分析,發現在 truncate 函數中進行了精度丟失。

      image

      跟進代碼查看 truncate 函數的具體實現方法,在對輸入參數 exp1e18 的時候發生了精度丟失。

      image

      攻擊細節分析

      在分析攻擊的過程中,對一些細節的部分存在著困惑,嘗試著用生疏的技巧淺淺的分析一下。

      為什么要先 mint 再 redeem,剩余 2 wei hWBTC

      因為 mint 函數只能根據抵押物的數量來 mint hToken。也就是說在 initialExchange = 0.02 WBTC/hWBTC 的情況下,即使是傳入 1 wei 的 WBTC,也會 mint 出 50 wei hWBTC。想要得到 2 wei hWBTC的剩余,沒辦法通過直接 mint 2 hWBTC 的方式(因為你無法提供 0.04 wei WBTC),所以只能先 mint 出大量的 hWBTC,然后再 redeem 使其剩余 2 wei。

      所以按道理來說是不是先 mint 出 50 wei hWBTC,再 redeem 48 wei hWBTC 也可以?

      image

      為什么要剩余 2 wei hWBTC,而不是其他數量

      剩余一定數量的 hWBTC 是為了后續構造精度丟失的攻擊,使得合約從 hWBTC 的數量來計算抵押率是滿足的,從而批準這筆 redeem,而實際上借出的 WBTC 數量是不滿足抵押率要求的。而攻擊者構造 2 wei 的這個數量就是為了通過精度丟失,是的超額借出的 WBTC 數量最大化。

      假設在 2 wei 的情況下,borrow 了一半價值(1 wei)的資產:

      贖回價值 1.99… wei hWbtc 的 WBTC,實際銷毀 1 wei hWbtc。此時超額部分為 0.99… wei hWBTC,獲得的 WBTC 占總資金的 1.99 / 2 。

      在 20 wei 的情況下,borrow 了一半價值(10 wei)的資產:

      贖回價值 10.99… wei hWbtc 的 WBTC,實際銷毀 10 wei hWbtc。此時超額部分為 0.99… wei hWBTC,獲得的 WBTC 占總資金的 10.99 / 20 。

      通過上面兩個例子我們可以得出,剩余的 hWBTC 數量越少,攻擊者通過精度丟失所獲得的超額 WBTC 比例就越大。

      剩余的 hWBTC 數量可不可以為 1 wei 呢?

      假設剩余 1 wei hWBTC,攻擊者可以借出 100% 價值的資產,此時贖回價值 0.99… wei hWBTC 的 WBTC,利用精度丟失實際 burn 0 hWBTC。這樣構造最大的好處是借出的資產可以達到 100%,而 2 wei 的方案借出資產只能借出 50%。

      在 comptoller.redeemVerify 函數中,進行了一定程度的校驗:

      function redeemVerify(address cToken, address redeemer, uint redeemAmount, uint redeemTokens) override external {
      	// Shh - currently unused
      	cToken; redeemer;
      	// Require tokens is zero or amount is also zero
      	if (redeemTokens == 0 && redeemAmount > 0) { 
      		revert("redeemTokens zero");
      	}
      }
      

      如果 redeemTokens 為 0 ,且 redeemAmount 大于 0 時,交易會進行revert,所以攻擊者選擇剩余 2 wei 而不是 1 wei。

      攻擊者是如何構造獲利場景的

      攻擊者只消耗 1 wei hWBTC ,然后 redeemUnderlying 出了 50030063815 wei WBTC

      image

      攻擊者先 deposit 50030063816 wei WBTC,然后 redeem 50030063815 wei WBTC,希望通過 redeem (deposit amount - 1) 的方式構造精度丟失的場景:redeem 出價值 1.999… wei hWBTC 的 WBTC,最終會 burn 1 wei hWBTC,超額收益 0.999... hWBTC。

      image

      但是由于在攻擊執行前池子里剩余有 1 wei WBTC,所以攻擊者直接 redeem 50030063816 wei WBTC 也是可以達到 burn 1 wei hWBTC 的目的的。也就是說只有當 redeem 50030063817 wei WBTC 的時候才會 burn 2 wei hWBTC。

      image

      這個精度缺失攻擊的前提是池子中 WBTC 的數量大于 hWBTC 的數量

      假設 3 WBTC,2 hWBTC,可得 exchangeRateStoredInternal = 3 / 2 = 1.5

      贖回 2 WBTC,計算需要 burn 的 hWBTC 數量:2 / 1.5 = 1.333… → 1 hWBTC

      可以通過一個公式來計算出攻擊者持有部分 hWBTC 的情況下通過精度丟失得到最大獲利的情況嗎?

      1. 假設池子持有 x WBTC,總共發行了 y hWBTC。攻擊者持有 z hWBTC (z < y),贖回 kx WBTC (0 < k < 1)
      2. exchangeRateStoredInternal = x / y
      3. 由 1 和 2 可得,要 burn 的 hWBTC 數量 = kx / (x / y) = ky
      4. 攻擊者為了獲取盡可能大的超額收益,需要通過精度丟失漏洞構造 burn z + 0.999… hWBTC → burn z hWBTC
      5. 由 3 和 4 可得,ky = z + 0.999 → k = (z + 0.999) / y

      舉例說明:

      1. 假設池子持有 20000 WBTC,總共發行了 100 hWBTC,exchangeRateStoredInternal = 200。攻擊者持有 50 hWBTC
      2. k = (z + 0.999) / y = (50 + 0.999) / 100 = 0.5099
      3. 贖回 kx = 0.5099 * 20000 = 10198 WBTC
      4. burn 的 hWBTC 數量為 kx / (x / y) = 10198 / 200 = 50.99 → 50

      如何計算出清算所需要的 token 數量

      通過 liquidateCalculateSeizeTokens 函數,計算得出提供 267919888739 wei ETH,能夠清算獲得 1 wei hWBTC

      image

      然后攻擊者執行 liquidateBorrow 函數,提供 267919888739 wei ETH 進行清算,獲得 1 wei hWBTC 。具體的計算過程以及涉及的參數如下圖所示:

      image

      后記

      都周末了還擱這寫分析文章博主是沒有自己的生活的嗎?

      posted @ 2023-11-05 14:24  ACai_sec  閱讀(912)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 免费人成视频在线观看网站| 蜜桃一区二区三区免费看| 久久综合久中文字幕青草| 国产成人av性色在线影院| 久久99精品久久久久麻豆| 日本韩国日韩少妇熟女少妇 | 亚洲AV无码东方伊甸园| 成人亚欧欧美激情在线观看| 国产高清在线精品一区二区三区 | 亚洲V天堂V手机在线| 国产午夜精品久久一二区| 无线日本视频精品| 国语对白刺激在线视频国产网红 | 四虎成人精品永久网站| 壤塘县| 九九热在线精品视频99| 日韩一级伦理片一区二区| 国产精品乱子乱xxxx| 乱老年女人伦免费视频| 亚洲国产精品久久电影欧美| 国产成人精彩在线视频| 亚洲av日韩av一区久久| 国产欧美日韩精品第二区| 国产精品一区二区三区性色| 国产白嫩护士在线播放| 丁香五月婷激情综合第九色| 男人的天堂av社区在线| 国产丝袜视频一区二区三区 | 亚洲一二三四区中文字幕| 亚洲精品日韩在线观看| 少妇愉情理伦片丰满丰满午夜| 亚洲精品一区二区三区蜜| 最新国产麻豆AⅤ精品无码| 亚洲一二三区精品美妇| 欧美色丁香| 国产成人高清精品免费软件| 国产无套内射又大又猛又粗又爽| 国产成人亚洲综合图区| 1区2区3区高清视频| 国产三级精品三级在线区| 亚洲国产精品久久久天堂麻豆宅男|