OKC 項目被攻擊事件分析

2024-01-03 16:01:19

來源:零時科技

事件背景

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。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

btc日內再次下跌 短线應當如何處理?

盡管以太坊現貨ETF獲批是個好消息,但市場反應卻不如預期。在消息公布後,以太坊價格出現了小幅下跌,...

加密蓮
66 1個月前

7月23日、BTC(合約)ETH(合約)行情分析及操作策略

昨日收益還是不錯的,日內給出的現價空單分別止盈我們目標點位,恭喜跟上的朋友喫肉。時間一晃到月底了,...

倪老師
66 1個月前

幣圈院士:血與淚的教訓!交易者為何總是撞死在同一棵樹上?

幣圈院士談。交易市場中的幾種“死法” 在幣圈市場鱗次櫛比的海洋,風起雲湧,時常讓人感到驚手不及。在...

幣圈院士
58 1個月前

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...

168超神
65 1個月前

悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤

一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...

我是周悅盈
56 1個月前

btc完美盈利 晚間波動較大注意

昨日btc空單完美給到,最大化走出一千七百點空間~ btc: 日內开盤下跌繼續測試66000一线,...

加密蓮
59 1個月前