來源:零時科技
2023-11-13 18:51:57 (UTC) 鏈上發生一筆針對 OKC Token 的攻擊事件,黑客通過存在缺陷的MinerPool獲取了及時收益
黑客攻擊交易:
0xd85c603f71bb84437bc69b21d785f982f7630355573566fa365dbee4cd236f08
黑客攻擊合約1:
0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9
黑客攻擊合約2:
0x617432Fc98c1fFaAB62B8cB94Cef6D75ABD95598
黑客攻擊合約3:
0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974
攻擊者地址:
0xbbcc139933D1580e7c40442E09263e90E6F1D66D
漏洞合約:
0x36016C4F0E0177861E6377f73C380c70138E13EE (MinerPool)
通過對鏈上交易數據分析,我們對其交易進行整理歸納。
黑客首先通過多個閃電貸進行對攻擊資金的籌集,共借款 2,753,399 USDT Token。
隨後立即將其中 130,000 USDT Token 兌換爲一個最小單位的 USDT Token 和 27,264 OKC Token 。
由於 PancakeSwapv2 使用的是AMM(恆定函數做市商),在該模型中,交易池中的兩種代幣的數量乘積是一個常數。可以用以下公式表示:
其中:
• x是交易池中第一種代幣的數量。
• y是交易池中第二種代幣的數量。
• k是一個常數,表示池中兩種代幣數量的乘積。
當一個交易者想要用一種代幣兌換另一種代幣時,他們會增加交易池中一種代幣的數量(dx),同時減少另一種代幣的數量(dy),以保持的不變性。這個過程會改變代幣的相對價格。
假設交易者想要用代幣A兌換代幣B,那么在交易前後,恆定乘積公式應該保持成立:
由於k是不變的,這意味着x·y在交易前後是相同的。但是,因爲交易者增加了代幣A的數量(dx)並且減少了代幣B的數量(dy),這將導致代幣B的價格上升。
代幣的即時價格可以通過計算池中兩種代幣數量的比率來得出。如果代幣A是x,代幣B是y,則代幣B相對於代幣A的價格是y/x。在交易之後,代幣B的數量減少了,代幣A的數量增加了,所以新的價格變成了(y-dy)/(x+dy) 。由於分子減小而分母增大,這個比率變小了,意味着代幣B的價格上升。
在大額交易的情況下,dx和dy可能非常大,這會導致價格的顯著變動。這是因爲爲了保持k的不變,必須從池中移除大量的dy來補償dx的增加。這種大額交易對池中代幣數量的巨大影響導致了價格的顯著變化。
故攻擊者通過使用大額閃電貸資金進行买入OKC,導致 OKC 數量減少,從而拉高了 OKC Token 的價格,將 1 OKC = 0.3 USDT 的價格提升到 1 OKC = 68.9 USDT。
後攻擊者創建了兩個合約地址,並分別向兩個地址中發送了 0.01 OKC 和 0.0001 USDT 和 一個最小單位的OKC。
然後黑客使用主要的攻擊合約對 PancakePair_USDT_OKC 池子添加流動性操作,得到約 225,705 個LP Token。
隨後將 LP Token 全部轉移至 攻擊者創建的 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 攻擊合約中隨後立即調用漏洞合約中的 processLPReward 函數,對合約內存儲的 lpHolder 地址進行獎勵分配。此處雖然攻擊者的操作只是向 MinerPool 合約轉账,但是該合約在接受轉账的回調函數中調用了processLPReward 函數。
根據下圖,我們得知攻擊合約 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 在獎勵領取中獲得了 77,890 個 OKC Token。
然後攻擊者轉出攻擊合約 0x28e7..E974 的的 LP Token 並將其銷毀移除流動性,獲得了 1,884,223 USDT Token,以及 27,264 OKC Token。
並轉移出另外兩個攻擊合約中的所有的Token至主要攻擊合約
0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9 ,分別爲:272 個,77,890 個 OKC Token。
黑客將所有的OKC ,約 104,610 OKC Token 兌換爲約 136,518 USDT Token,此時黑客總持有約 2,759,918 USDT Token。
最後,黑客歸還所有閃電貸的本金和利息,最終剩余約 6,268 USDT Token,並全部轉移至攻擊者地址
0xbbcc139933D1580e7c40442E09263e90E6F1D66D。
通過攻擊分析得知,黑客主要獲利資金是由 MinerPool 合約中 processLPReward 函數,該函數邏輯主要是獲取 lpHolder 並根據其 LP 數量直接按比例進行獎勵。
我們可以看一下攻擊者創建的第三個攻擊合約中的執行邏輯:
從該處邏輯可以看出addHolder函數中使用了 extcodesize() 來計算地址當前的大小,用來判斷地址是否是合約地址,但是在攻擊者通過 CREATE2 創建合約,由於合約在初始化時,該地址大小依然爲0,從而來攻擊者在其構造函數中調用該函數繞過其中的合約調用限制。
其在轉账時調用了 addHolder 函數將 合約地址添加到了 lpHolder 名單,所以該合約才可以通過領取獎勵獲取及時的OKC獎勵。
根據對 processLPReward 函數代碼邏輯進行分析,可以從下圖中看出,雖然設置了領取獎勵的鎖定時間,但是未設置 LP 持有時間進行校驗或限制,導致黑客通過閃電貸獲取大量臨時資金,並兌換爲LP ,並在領取獎勵後立即銷毀。
簡單來說,黑客通過閃電貸借了大量USDT,並兌換大量OKC,從而拉高了OKC的價格。並且由於OKC項目未設置LP獎勵發放的鎖倉要求,所以黑客在獲取獎勵後立刻撤回流動性,從而獲取了項目方發放的流動性提供者的獎勵。並將OKC項目方獎勵的OKC Token出售。最終獲利 6,268 USDT。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。