hao86下載站:值得大家信賴的游戲下載站!

首頁 > 區(qū)塊鏈 > OKC 項目被攻擊事件分析

OKC 項目被攻擊事件分析

時間:2024-01-03 14:35:48
來源:hao86下載
區(qū)塊鏈

【#區(qū)塊鏈# #OKC 項目被攻擊事件分析#】

來源:零時科技

事件背景

2023-11-13 18:51:57 (UTC) 鏈上發(fā)生一筆針對 OKC Token 的攻擊事件,黑客通過存在缺陷的MinerPool獲取了及時收益

黑客攻擊交易:

0xd85c603f71bb84437bc69b21d785f982f7630355573566fa365dbee4cd236f08

黑客攻擊合約1:

0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9

黑客攻擊合約2:

0x617432Fc98c1fFaAB62B8cB94Cef6D75ABD95598

黑客攻擊合約3:

0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974

攻擊者地址:

0xbbcc139933D1580e7c40442E09263e90E6F1D66D

漏洞合約:

0x36016C4F0E0177861E6377f73C380c70138E13EE (MinerPool)

攻擊分析

通過對鏈上交易數(shù)據(jù)分析,我們對其交易進(jìn)行整理歸納。

黑客首先通過多個閃電貸進(jìn)行對攻擊資金的籌集,共借款 2,753,399 USDT Token。

隨后立即將其中 130,000 USDT Token 兌換為一個最小單位的 USDT Token 和 27,264 OKC Token 。

由于 PancakeSwapv2 使用的是AMM(恒定函數(shù)做市商),在該模型中,交易池中的兩種代幣的數(shù)量乘積是一個常數(shù)。可以用以下公式表示:

其中:

? x是交易池中第一種代幣的數(shù)量。

? y是交易池中第二種代幣的數(shù)量。

? k是一個常數(shù),表示池中兩種代幣數(shù)量的乘積。

當(dāng)一個交易者想要用一種代幣兌換另一種代幣時,他們會增加交易池中一種代幣的數(shù)量(dx),同時減少另一種代幣的數(shù)量(dy),以保持的不變性。這個過程會改變代幣的相對價格。

假設(shè)交易者想要用代幣A兌換代幣B,那么在交易前后,恒定乘積公式應(yīng)該保持成立:

由于k是不變的,這意味著x·y在交易前后是相同的。但是,因為交易者增加了代幣A的數(shù)量(dx)并且減少了代幣B的數(shù)量(dy),這將導(dǎo)致代幣B的價格上升。

代幣的即時價格可以通過計算池中兩種代幣數(shù)量的比率來得出。如果代幣A是x,代幣B是y,則代幣B相對于代幣A的價格是y/x。在交易之后,代幣B的數(shù)量減少了,代幣A的數(shù)量增加了,所以新的價格變成了(y-dy)/(x+dy) 。由于分子減小而分母增大,這個比率變小了,意味著代幣B的價格上升。

在大額交易的情況下,dx和dy可能非常大,這會導(dǎo)致價格的顯著變動。這是因為為了保持k的不變,必須從池中移除大量的dy來補償dx的增加。這種大額交易對池中代幣數(shù)量的巨大影響導(dǎo)致了價格的顯著變化。

故攻擊者通過使用大額閃電貸資金進(jìn)行買入OKC,導(dǎo)致 OKC 數(shù)量減少,從而拉高了 OKC Token 的價格,將 1 OKC = 0.3 USDT 的價格提升到 1 OKC = 68.9 USDT。

后攻擊者創(chuàng)建了兩個合約地址,并分別向兩個地址中發(fā)送了 0.01 OKC 和 0.0001 USDT 和 一個最小單位的OKC。

然后黑客使用主要的攻擊合約對 PancakePair_USDT_OKC 池子添加流動性操作,得到約 225,705 個LP Token。

隨后將 LP Token 全部轉(zhuǎn)移至 攻擊者創(chuàng)建的 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 攻擊合約中隨后立即調(diào)用漏洞合約中的 processLPReward 函數(shù),對合約內(nèi)存儲的 lpHolder 地址進(jìn)行獎勵分配。此處雖然攻擊者的操作只是向 MinerPool 合約轉(zhuǎn)賬,但是該合約在接受轉(zhuǎn)賬的回調(diào)函數(shù)中調(diào)用了processLPReward 函數(shù)。

根據(jù)下圖,我們得知攻擊合約 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 在獎勵領(lǐng)取中獲得了 77,890 個 OKC Token。

然后攻擊者轉(zhuǎn)出攻擊合約 0x28e7..E974 的的 LP Token 并將其銷毀移除流動性,獲得了 1,884,223 USDT Token,以及 27,264 OKC Token。

并轉(zhuǎn)移出另外兩個攻擊合約中的所有的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,并全部轉(zhuǎn)移至攻擊者地址

0xbbcc139933D1580e7c40442E09263e90E6F1D66D。

漏洞分析

通過攻擊分析得知,黑客主要獲利資金是由 MinerPool 合約中 processLPReward 函數(shù),該函數(shù)邏輯主要是獲取 lpHolder 并根據(jù)其 LP 數(shù)量直接按比例進(jìn)行獎勵。

我們可以看一下攻擊者創(chuàng)建的第三個攻擊合約中的執(zhí)行邏輯:

從該處邏輯可以看出addHolder函數(shù)中使用了 extcodesize() 來計算地址當(dāng)前的大小,用來判斷地址是否是合約地址,但是在攻擊者通過 CREATE2 創(chuàng)建合約,由于合約在初始化時,該地址大小依然為0,從而來攻擊者在其構(gòu)造函數(shù)中調(diào)用該函數(shù)繞過其中的合約調(diào)用限制。

其在轉(zhuǎn)賬時調(diào)用了 addHolder 函數(shù)將 合約地址添加到了 lpHolder 名單,所以該合約才可以通過領(lǐng)取獎勵獲取及時的OKC獎勵。

根據(jù)對 processLPReward 函數(shù)代碼邏輯進(jìn)行分析,可以從下圖中看出,雖然設(shè)置了領(lǐng)取獎勵的鎖定時間,但是未設(shè)置 LP 持有時間進(jìn)行校驗或限制,導(dǎo)致黑客通過閃電貸獲取大量臨時資金,并兌換為LP ,并在領(lǐng)取獎勵后立即銷毀。

總結(jié)

簡單來說,黑客通過閃電貸借了大量USDT,并兌換大量OKC,從而拉高了OKC的價格。并且由于OKC項目未設(shè)置LP獎勵發(fā)放的鎖倉要求,所以黑客在獲取獎勵后立刻撤回流動性,從而獲取了項目方發(fā)放的流動性提供者的獎勵。并將OKC項目方獎勵的OKC Token出售。最終獲利 6,268 USDT。

小編推薦下載

相關(guān)文章

更多>>

同類軟件下載