By:[email protected]慢霧安全團隊
據慢霧區情報,MDEX 的 XSquid 和 HT 代幣池子中 HT 代幣在沒有進行 swap 的情況下被頻繁抽取,慢霧安全團隊對此介入分析,並將簡要分析分享如下。
攻擊核心
本次攻擊的核心在於利用 XSquid 映射通縮型代幣的模型,在轉賬後會發生通縮,自身合約所獲取的 balanceOf 與通過 Mdex pair 池所獲取到的 reserve 不匹配的問題,使得攻擊者可以抽取池中的 HT 代幣。
攻擊細節
由鏈上分析工具我們可以看到,這筆交易中 Mdex pair 池最終向攻擊者轉移了 0.003 枚 WHT 代幣,而鏈上的交易記錄顯示還有很多筆這樣的交易與之相同。
接下來我們仔細觀察這筆交易的細節,這是一個 XSquid 和 HT 的 Mdex Pair 池,在對 XSquid 進行 swap 轉賬前 pair 合約通過 getReserves 介面所獲取到池子中 _reserve0 為 1010.505640800917497232。但在下一步通過 XSquid 合約的 balanceOf 獲取 pair 餘額後我們卻發現結果為 1010.5060773394782 ,數量上存在明顯的差異。
但是在最後一次更新 reserve 之後並沒有用戶向合約中進行轉賬。於是我們就可以定位到,是在 balancOf 獲取時造成的誤差。於是我們開始查看 XSquid 合約,並定位到 balanceOf 函數合約的 715 行。通過函數的一步步跟蹤 balanceOf。
其中 balanceOf 調用了 tokenFromReflection 來獲取。而 tokenFromReflection 函數中傳入的是所映射的 rAmount.div(currentRate)。currentRate 又是由 _getRate 函數決定的。通過 _getRate 我們接著跟蹤到 _getCurrentSupply 函數。
根據一步步的定位我們發現,合約中代幣的 _tTotal 總量是不會發生變化的,最終影響 _getCurrentSupply 輸出結果的是由於 _rTotal 值的變化而造成的。從合約我們發現 XSquid 是映射通縮型代幣,而在每一次轉賬時計算 _rTotal 都會由 _reflectFee 產生通縮使得 _rTotal 值減少,而造成 currentRate 因此減少,而 rAmount.div(currentRate) 增大,最終造成所獲取到的 balanceOf 大於 getReserves 所獲取到的值。
這樣就造成了一種假象,使得池子認為外部又多打入了 XSquid 進來。這時攻擊者只需要調用 Mdex Pair 合約的 swap 函數根據上訴計算的差額來抽取代幣,或者是調用 skim 函數直接轉走代幣。由此,可從池子中抽離這一小部分「多餘」而不屬於他的 HT。對此,我們可以在每次轉賬最後通過調用 sync 函數強制準備金與餘額匹配同步更新,來避免以上不匹配的問題。
總結
此次抽池的核心問題在於「通縮映射型代幣」與項目合約不兼容所導致的。而代幣與 DeFi 項目合約代碼不兼容所導致的安全問題已是重複出現的老問題了,慢霧安全團隊再次提醒:由於 DeFi 項目需要多個合約間進行交互,在進行設計時項目方應充分考慮不同合約間交互的兼容性問題,並確保交易對與項⽬是相互兼容的。
冷萃財經原創,作者:awing,轉載請註明出處:https://www.lccjd.top/2021/11/30/%e8%80%81%e8%b0%83%e9%87%8d%e5%bc%b9%ef%bc%8c%e6%b5%85%e8%b0%88-%e9%80%9a%e7%bc%a9%e5%9e%8b%e4%bb%a3%e5%b8%81-%e5%85%bc%e5%ae%b9%e6%80%a7%e9%97%ae%e9%a2%98/?variant=zh-tw
文章評論