時間:2023-07-05|瀏覽:255
根據(jù)慢霧區(qū)情報,MDEX的XSquid和HT在代幣池中HT代幣沒有進行swap經(jīng)常抽取。慢霧安全團隊介入分析,簡要分析如下。
攻擊核心: 這次攻擊的核心是使用XSquid映射通縮代幣模型,轉賬后會發(fā)生通縮。攻擊者通過自己的合同獲得balanceOf與通過Mdexpair從游泳池獲得的reserve不匹配的問題,從而可以抽取池中的HT代幣。
攻擊細節(jié): 從鏈上的分析工具可以看出,在這筆交易中Mdexpair池最終將0轉移給攻擊者0.003枚WHT代幣。鏈上的交易記錄顯示有很多這樣的交易。
接下來,我們仔細觀察這筆交易的細節(jié)。這是XSquid和HT的MdexPair池。在XSquid進行swap轉賬前,pair合同通過getReserves接口所獲取到的池子中_reserve0為1010.50564080917497232。但是,通過XSquid合約的balanceOf獲取pair余額后,我們發(fā)現(xiàn)結果是1010.506077394782,數(shù)量有明顯差異。
我們發(fā)現(xiàn),最后一次更新reserve之后,沒有用戶將其轉移到合同中。所以我們可以定位在balanceOf獲取時造成的誤差。于是我們開始查XSquid合同,并定位為balanceOf函數(shù)合約715行。通過函數(shù)逐步跟蹤balanceOf。
其中,balanceOf調用了tokenFromReflection獲取tokenFromReflection映射傳入函數(shù)rAmount.div(currentRate)。currentRate又是由_getRate函數(shù)決定。通過_getRate然后我們跟_getCurrentSupply函數(shù)。
根據(jù)一步一步的定位,我們發(fā)現(xiàn)代幣在合同中_tTotal總量不會改變,最終會影響_getCurrentSupply輸出結果為_rTotal值的變化。從合同中發(fā)現(xiàn),XSquid是映射通縮代幣,每次轉賬時計算_rTotal都會由_reflectFee產(chǎn)生通縮使_rTotal導致currentRate減少,而rAmount.div(currentRate)增加,最終導致獲得balanceOf大于getReserves獲得的值。
這就造成了一種錯覺,讓池子覺得外面又進了XSquid進來。此時攻擊者只需調用MdexPair合約的swap函數(shù)根據(jù)上訴計算的差額提取代幣或調用skim函數(shù)直接轉移代幣。因此,這一小部分多余可以從池中抽出,而不是屬于他的HT。在這方面,我們可以在每次轉賬結束時調用sync函數(shù)強制準備金與余額匹配同步更新,避免上述不匹配問題。
總結: 抽池的核心問題是通縮映射代幣與項目合同不兼容。代幣和DeFi項目合同代碼不兼容造成的安全問題已經(jīng)是老問題,慢霧安全團隊再次提醒:因為DeFi項目需要多個合同之間的交互。在設計過程中,項目方應充分考慮不同合同之間交互的兼容性,并確保交易對兼容。
熱點:代幣