背景介紹

2025年3月14日,我們監控到一起針對BNB Smart Chain 鏈上項目H2O攻擊事件,攻擊hash為:

https://bscscan.com/tx/0x729c502a7dfd5332a9bdbcacec97137899ecc82c17d0797b9686a7f9f6005cb7

https://bscscan.com/tx/0x994abe7906a4a955c103071221e5eaa734a30dccdcdaac63496ece2b698a0fc3

被攻擊的項目為H2O ,攻擊共造成22,000 USD 的損失。

攻擊及事件分析

在第一次攻擊中,攻擊者首先從PancakeSwapV3 Pool 中利用flashloan 貸款了100,000 USDT 作為攻擊的初始資金。

零時科技 || H2O 攻擊事件分析

隨後,用貸來的初始資金在USDT-H2O 的PancakeSwap Pair 中兌換了66,439,209 H2O。

零時科技 || H2O 攻擊事件分析

攻擊者隨後頻繁將H2O 轉給PancakeSwap Pair USDT-H2O ,然後使得Pair 中USDT reserve 和H2O reserve 不平衡,隨後利用skim 平衡Pair 中的reserve0 和reserve1 來實施攻擊。 H2O 的漏洞出現在transfer 函數中,我們可以看到transfer 函數的具體實作。

零時科技 || H2O 攻擊事件分析

問題具體出現在函數中,當from 為PancakeSwap Pair 時,呼叫_calulate 函數。由於攻擊者利用Pair 的Reserve0 和Reserve1 不平衡,調用skim 給自身transfer ,所以該transfer 的sender 為Pair address 。接下來,我們來看看該函數的具體實作。

零時科技 || H2O 攻擊事件分析

這個函數的邏輯很簡單根據合約本身持有的H2O 代幣餘額動態設定獎勵費率(1%-5%,餘額越少費率越低),透過鏈上隨機數向用戶按比例分發H2 或O2 代幣;當用戶持有至少10 H2 和5 O2時,可銷毀2:1 比例的代幣(當用戶持有至少10 H2 和5 O2時,可銷毀2:1 比例的代幣(12H1231231272222312)222:1 比例的1127127222312223130230230302),兌換合約。受合約餘額限制。

合約產生鏈上隨機數的邏輯如下:

零時科技 || H2O 攻擊事件分析

根據blocktime , blocknumber 和msg.sender 的keccak256 來計算。在第一次攻擊中,由於攻擊者沒有H2 Token 和O2 Token ,所以在此次攻擊中獲得了169,731,921 O2 Token 。接下來,只要攻擊者使得getRandomOnchain()%2 == 1 即可完成攻擊,隨後攻擊者又進行了三次嘗試,但是前兩次getRandomOnchain()%2 均為0,導致攻擊失敗,第四次才真正完成攻擊。

零時科技 || H2O 攻擊事件分析

在第四次攻擊時,攻擊者首先從PancakeSwapV3 Pool 中利用flashloan 貸款了100,000 USDT 作為攻擊的初始資金,

零時科技 || H2O 攻擊事件分析

隨後,用貸來的初始資金在USDT-H2O 的PancakeSwap Pair 中兌換了66,439,209 H2O。

零時科技 || H2O 攻擊事件分析

攻擊者隨後頻繁將H2O 轉給PancakeSwap Pair USDT-H2O ,然後使得Pair 中USDT reserve 和H2O reserve 不平衡,隨後利用skim 平衡Pair 中的reserve0 和reserve1 來實施攻擊。

零時科技 || H2O 攻擊事件分析

根據我們上述的分析可知,此次攻擊中getRandomOnchain()%2 為1,所以H2O 會mint H2Token 。又因為攻擊者利用第一次攻擊時,getRandomOnchain()%2 為0,所以獲得mint 的大量O2 Token 。所以,H2O burn 了H2 和O2 後將自身的H2O 轉給攻擊者。

最後,攻擊者用憑空的來的H2O 兌換了122,820 USDT 。歸還完100,000 USDT 的flashloan 和50 USDT 的利息,最終獲利22,770 USDT 。

總結

這次漏洞成因主要是因為H20 Token 合約設計從PancakeSwap Pair 上買入的經濟模型時,在修改ERC20 transfer 函數沒有考慮到skim 也可以達到相同目的,導致攻擊者利用skim 憑空獲得大量激勵。建議專案方在設計經濟模型、價格電腦制和程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。