背景

根據Numen鏈上監控顯示,Mar-15-2023 03:16:02 AM +UTC,Ethereum、Binance、Polygon鏈上Poolz遭到攻擊,共損失2,805,805枚MEE,525,134枚ESNC,774,997枚DON,2,007,504,238枚ASW ,6,510,689枚KMON,2,521,065枚POOLZ,35,976,107枚DCD,760,845枚PORTX,252,153,413枚ECIO,35,975,489枚WOD,29,032,394枚SIP,61,856,885枚MNZ,465,116枚EBA,157,696枚GEMG,202,442枚WANA,223,500枚KXA,82,067枚MSTR,1,717,102枚CHRP,822,631枚CVZ,37,053枚CHIM,8,577,867枚QZA,總價值約665000美元。攻擊者已將部分Token兌換為BNB,目前資金暫未轉出。

攻擊者地址:0x190Cd736F5825ff0Ae0141B5C9cb7Fcd042cef2a

攻擊者合約:0x058bae36467a9fc5e1045dbdffc2fd65b91c2203

其中一筆攻擊交易

0x39718b03ae346dfe0210b1057cf9f0c378d9ab943512264f06249ae14030c5d5

Poolz因算數溢出問題遭受攻擊,損失約665K美元!

攻擊流程

1. 攻擊者先通過pancakeswap兌換了一下mnz代幣。

2. 攻擊者調用CreateMassPools,主要問題就存在於這個函數。 Poolz因算數溢出問題遭受攻擊,損失約665K美元!

正常功能是用戶可以批量創建池子,然後提供初始流動性。再通過CreatePool把池子創建出來,並用一個mapping記錄池子屬性,如下圖所示。

Poolz因算數溢出問題遭受攻擊,損失約665K美元!

問題出在getArraySum函數。 TransferInToken給池子建立流動性,amount通過getArraySum控制。 Poolz因算數溢出問題遭受攻擊,損失約665K美元!

通過傳入的_StartAmount數組遍歷,然後進行累加。然後通過調用棧看到[115792089237316195423570985008687907853269984665640502182660492372007802789937,61856797091635905326850000]。數組累加超過uint256,即返回1。但是CreatePool中做的記錄是通過_StartAmount來實現的。所以攻擊者轉入了1個token,但_StartAmount是個大數。

3.黑客調用withdraw提幣,完成攻擊。

總結

此次事件,攻擊者獲利的根本原因是算數溢出。為了防止此類問題,Numen建議使用Solidity 的高版本進行編譯,以便在編譯過程中自動進行溢出檢查。另外,您也可以在低版本Solidity 中使用OpenZeppelin 的SafeMath 庫來解決整數溢出問題。

原文鏈接: Poolz因算數溢出問題遭受攻擊,損失約665K美元!