以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

從技術角度解析:為什么通縮機制的代幣易受攻擊_RES:TOKEN

Author:

Time:1900/1/1 0:00:00

作者:EoceneResearch

概述

在區塊鏈上具有通縮機制的代幣最近經常受到攻擊。本文將討論并分析代幣令牌受到攻擊的原因,并給出相應的防御方案。

在代幣中實現通縮機制通常有兩種方式,一種是燃燒機制,另一種是反射機制。下面我們將分析這兩種實現方式可能存在的問題。

燃燒機制

通常,具有燃燒機制的代幣將在其_transfer函數中實現燃燒的邏輯。有時候會存在發送者承擔手續費的情況。在這種情況下,接收方收到的代幣數量不會發生變化,但發送方需要支付更多代幣,因為其需要承擔手續費。下面是一個簡單的例子:

function_transfer(addresssender,addressrecipient,uint256amount)internalvirtualreturns(bool){

require(_balances>=amount,"ERC20:transferamountexceedsbalance");

require(sender!=address(0),"ERC20:transferfromthezeroaddress");

require(recipient!=address(0),"ERC20:transfertothezeroaddress");

burnFee=amount*burnFeeRate;

_balances-=amount;

_burn(sender,burnFee);

_balances+=amount;

}

然后我們討論這種情況下可能存在的風險。

如果單看代幣合約,我們會發現這種寫法其實沒有什么問題,但是區塊鏈中有很多復雜的情況,需要我們考慮很多方面。

北京理工大學蓋珂珂:區塊鏈加入黃金供應鏈后從技術和多角度解決了信任的問題:12月18日,“首屆中國(莆田)國際黃金珠寶文化論壇”在福建省莆田市會展中心舉辦。北京理工大學東南信息技術研究院特別研究員、博士生導師蓋珂珂出席論壇并發表主旨演講。他認為,區塊鏈加入黃金供應鏈后從技術和多角度解決了信任的問題,對已有黃金供應鏈模型進行了優化,為黃金珠寶行業進行賦能,主要表現為以下幾方面,第一,所有的信息流、商流寫入區塊鏈,信息統一集中、公開透明、不可篡改;第二,所有節點可以審視,實時掌握業務物流資金過程;第三,對于投資者得到一定的提升;第四,企業征信數據積累;第五,可以實現資產的跨域流通。

在黃金NFT分享方面,他作出總結:黃金藝術產品認知是在不斷進步;黃金產品的用戶量特別大,資金儲備比較足,這也就決定了黃金作為NFT進行對標是具有先天性的優勢;黃金產品特性是具有流通性,與NFT特性比較吻合;黃金產業可能會存在瓶頸,比如渠道商和黃金商的壟斷,依賴中心化系統。(中國財富網)[2021/12/19 7:49:02]

通常,為了讓代幣有價格,項目方會在Uniswap、Pancakeswap等去中心化交易所為代幣添加流動性。

其中,在Uniswap中,有一個函數skim,它會將流動性池中兩種代幣的余額和儲備金的差值轉移給調用方,以平衡余額和儲備金:

functionskim(addressto)externallock{

address_token0=token0;//gassavings

address_token1=token1;//gassavings

_safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0));

_safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1));

Coinbase首席財務官:上線資產前會從技術和風險角度進行評估:金色財經報道,今日在美國國會的加密聽證會上,在眾議員Pete Sessions詢問交易所如何識別欺詐和降低風險時,Coinbase首席財務官Alesia Haas表示,該交易所在資產上市之前會從技術和風險的角度對其進行評估。[2021/12/9 12:59:42]

}

此時發送方變成了流動性池,當調用_transfer時,流動性池中的代幣將被部分銷毀,導致代幣價格部分上漲。

攻擊者利用此特性將代幣直接轉入流動性池中,然后調用skim函數轉出,然后多次重復此操作,導致流動性池中大量代幣被燃燒,價格也隨之飆升,最后賣出代幣獲利。

一個真實的攻擊案例,winnerdoge(WDOGE)?:

function_transfer(addresssender,addressrecipient,uint256amount)internalvirtualreturns(bool){

require(_balances.amount>=amount,"ERC20:transferamountexceedsbalance");

require(sender!=address(0),"ERC20:transferfromthezeroaddress");

require(recipient!=address(0),"ERC20:transfertothezeroaddress");

if(block.timestamp>=openingTime&&block.timestamp<=closingTime)

{

_balances.amount-=amount;

工信部電子五所相里朋:從技術角度看 區塊鏈監管需從三個方面實現:工信部電子第五研究所區塊鏈創新團隊負責人、高級工程師相里朋表示,關于區塊鏈的有效監管,應形成區塊鏈系統柔性監管平臺,實現對各類區塊鏈系統的實時態勢感知,監控非法交易、欺詐行為、非法信息發布等各類非法行為。從技術角度看,區塊鏈監管需從以下三個方面實現:一是整合鏈上鏈下數據,以及不同區塊鏈系統的數據,形成統一的綜合性區塊鏈信息庫,并實現高效智能的信息檢索查詢管理;二是實現對區塊鏈系統中各種交易模式的識別,進一步分析識別出非法的交易行為;三是分析區塊鏈鏈上數據中的非法輿情信息,以及鏈下的互聯網和現實中的區塊鏈相關輿情信息,實現全面的區塊鏈輿情感知。(證券日報)[2021/3/26 19:19:11]

_balances.amount+=amount;

emitTransfer(sender,recipient,amount);

}

else

{

uint256onePercent=findOnePercent(amount);

uint256tokensToBurn=onePercent*4;

uint256tokensToRedistribute=onePercent*4;

uint256toFeeWallet=onePercent*1;

uint256todev=onePercent*1;

uint256tokensToTransfer=amount-tokensToBurn-tokensToRedistribute-toFeeWallet-todev;

?

_balances.amount-=amount;

_balances.amount+=tokensToTransfer;

IBM區塊鏈總經理:區塊鏈正在從技術演變為真正的業務工具:10月3日消息,IBM區塊鏈總經理Alistair Lenny在接受采訪時表示,區塊鏈越來越適合企業架構,因為它允許公司與其他公司數字化其業務流程。這意味著區塊鏈正在從技術演變為真正的業務工具,這表明采用可能將會非常迅速。(JP.Cointelegraph)[2020/10/3]

_balances.amount+=toFeeWallet;

_balances.amount+=todev;

if(!_balances.exists){

_balanceOwners.push(recipient);

_balances.exists=true;

}

redistribute(sender,tokensToRedistribute);

_burn(sender,tokensToBurn);

emitTransfer(sender,recipient,tokensToTransfer);

}

returntrue;

}

在WDOGE合約的_transfer函數中,當block.timestamp>closingTime時,進入else循環。在代碼第21行中,轉賬金額從發送方的余額中扣除,在代碼第31行中,發送方又被燃燒了tokensToBurn數量的代幣。攻擊者利用這種手續費的機制,通過上述的攻擊方式竊取流動性池中的所有價值代幣(WBNB)。

反射機制

在反射機制中,用戶每次交易都會收取手續費,用于獎勵持有代幣的用戶,但不會觸發轉賬,只是單純修改一個系數。

動態 | 經濟日報:推動完善區塊鏈產業生態系統 需從技術創新等方面入手:經濟日報今日發表題為《推動完善區塊鏈產業生態系統》的分析文章。文章表示,近年來,我國區塊鏈產業發展迅猛,但在技術突破、人才支撐、安全防控等方面仍存在不小挑戰。對此,需采取有針對性的措施加以解決,不斷完善區塊鏈產業生態系統。文中提到,目前制約我國區塊鏈產業生態系統發展完善的主要因素有以下幾個方面:一是區塊鏈技術仍處于發展的初期,基礎研究與協同攻關較為薄弱;二是區塊鏈領域的人才缺口較大;三是區塊鏈安全隱患不容忽視,風險防控有待加強;四是區塊鏈產業布局需進一步統籌;五是區塊鏈產業相關政策法規尚不完善。文中建議,進一步推動完善區塊鏈產業生態系統,必須從技術創新、人才培養、風險防控、生態協調、產業監管五個方面著手,尋找解決之道。[2019/12/25]

在這個機制中,用戶有兩種類型的代幣數量,tAmount和rAmount。tAmount為實際代幣數量,rAmount為反映后的代幣數量,比率為tTotal/rTotal,一般的代碼實現如下:

functionbalanceOf(addressaccount)publicviewoverridereturns(uint256){

if(_isExcluded)return_tOwned;

returntokenFromReflection(_rOwned);

}

functiontokenFromReflection(uint256rAmount)publicviewreturns(uint256){

require(rAmount<=_rTotal,"Amountmustbelessthantotalreflections");

uint256currentRate=_getRate();

returnrAmount.div(currentRate);

}

function_getRate()privateviewreturns(uint256){

(uint256rSupply,uint256tSupply)=_getCurrentSupply();

returnrSupply.div(tSupply);

}

反射機制的代幣中一般有一個叫做deliver的函數,會銷毀調用者的代幣,降低rTotal的值,所以比率會增加,其他用戶反射后的代幣數量也會增加:

functiondeliver(uint256tAmount)public{

addresssender=_msgSender();

require(!_isExcluded,"Excludedaddressescannotcallthisfunction");

(uint256rAmount,,,,,)=_getValues(tAmount);

_rOwned=_rOwned.sub(rAmount);

_rTotal=_rTotal.sub(rAmount);

_tFeeTotal=_tFeeTotal.add(tAmount);

}

攻擊者注意到這個函數,并用它來攻擊相應的Uniswap?的流動性池。

那他該如何進行利用呢?同樣從Uniswap的skim?函數開始:

functionskim(addressto)externallock{

address_token0=token0;//gassavings

address_token1=token1;//gassavings

_safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0));

_safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1));

}

Uniswap中reserve是儲備金,與token.balanceOf(address(this))不同。

攻擊者先調用deliver函數銷毀自己的代幣,導致rTotal的值減少,比率隨之增加,所以反射后的代幣的值也會增加,token.balanceOf(address(this))也會相應變大,與reserve?的值出現了差距。

因此,攻擊者可以通過調用skim函數轉出數量為兩者之間差值的代幣從而進行獲利。

Attacker:token.deliver

rtotal:decrease

rate:increase

tokenFromReflection:increase

balanceOf:increase->token.balanceOf(address(this))>reserve

Attacker:pair.skim

token.balanceOf(address(this))>reserve

token.transfer

一個真實的攻擊案例,BEVONFTArtToken(BEVO):

而當代幣合約中存在burn函數時,存在了另外一種相似的攻擊手法:

functionburn(uint256_value)public{

_burn(msg.sender,_value);

}

function_burn(address_who,uint256_value)internal{

require(_value<=_rOwned);

_rOwned=_rOwned.sub(_value);

_tTotal=_tTotal.sub(_value);

emitTransfer(_who,address(0),_value);

}

當用戶調用burn函數時,自己的代幣會被銷毀,同時tTotal的值會減少,所以比率會降低,對應的反射后的代幣數量也會減少,所以在此時流動性池的代幣的數量也會減少,從而代幣的價格會上漲。

攻擊者利用這個特性通過多次調用burn函數來減少tTotal的值,然后調用流動性池的sync函數同步reserve和balances。最后,流動性池中的代幣大幅減少,價格飆升。然后攻擊者出售代幣以獲取利潤。

Attacker:token.burn

tTotal:decrease

rate:decrease

tokenFromReflection:decrease

balanceOf:decrease

Attacker:pair.sync

token.balanceOf(address(this))>reserve

token.transfer

一個真實的攻擊案例,SheepToken(SHEEP):

防御方案

通過解讀針對燃燒機制和反射機制代幣的攻擊手法,不難發現攻擊者攻擊的核心點是操縱流動性池的價格,因此將流動性池的地址加入白名單,不涉及代幣的銷毀,不參與代幣的反射機制,可以避免此類攻擊。

總結

本文分析了通縮機制代幣的兩種實現機制以及針對這兩種機制的攻擊手段,最后給出了相應的解決方案。在編寫合約時,項目方必須考慮代幣與去中心化交易所結合的情況,以避免此類攻擊。

Tags:RESTOKENTOKETOKWeAreSatoshiThe Fire Tokenitoken錢包怎么提現人民幣World Token

火幣網下載官方app
從 Dark Forest 與 Loot 一窺鏈游形態的頂點:全鏈上游戲(上)_DAR:dar幣最新消息有價值嗎

作者:Kaspar,MaskNetwork特別感謝Loot中文社區核心成員&布道者、Loot元老級持有者@TaylorZhang.

1900/1/1 0:00:00
晚報|ChatGPT-4 能實時檢查智能合約漏洞;穩定幣項目 CNHC 完成 1000 萬美元 A+輪融資_COI:OIN

整理:西昻翔,ChainCatcher“過去24小時都發生了哪些重要事件”?1、ChatGPT-4能實時檢查智能合約漏洞.

1900/1/1 0:00:00
幣安回應福布斯挪用資金指控:轉賬均為用戶自發行為,資產始終保持 1:1 儲備

幣安官方發布《關于福布斯2月27日不實指控的回應》,表示幣安每天都有大量的加密資產充值進入用戶的賬戶地址,也有大量用戶提現去不同的錢包地址.

1900/1/1 0:00:00
HashKey Group 獲香港證監會批準,可開展虛擬資產場外交易業務 (OTC)_HASH:onekey一鍵還原不顯示還原分區

數字資產金融服務提供商?HashKeyGroup宣布,其已獲得香港證券及期貨事務監察委員會的批準.

1900/1/1 0:00:00
首屆 R3AL WORLD 峰會將于 3 月 3 日舉行,將展示 DePIN 最具潛力的賽道和項目_WOR:ORL

IoTeX主辦的首屆R3ALWORLD峰會(R3alworld.com)將于3月3日在以太坊年度盛會EthDenver期間舉行,這是聚焦DePIN和MachienFi領域的首次項目展示峰會.

1900/1/1 0:00:00
Wintermute 研究負責人:UST 脫鉤事件相關的錢包可能與 Jane Street 有關聯_COI:OIN

Wintermute研究負責人IgorIgamberdiev發推稱,與去年TerraUSD脫鉤事件相關的錢包可能與交易公司JaneStreet有關聯.

1900/1/1 0:00:00
ads