以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads

INT:區塊鏈安全—深入分析ATN漏洞

Author:

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

作者:Pinging

一、ATN介紹

ATN作為全球首個區塊鏈AI項目,是一個去中心化的、無需授權的、用戶自定義人工智能即服務(AIaaS)和使用接口的開放區塊鏈平臺。ATN公有鏈將引入DBot的Oracle預言機、跨鏈互操作技術,且通過石墨烯架構實現高并發TPS,側重解決人工智能服務(AIaas)與EVM兼容的智能合約之間互操作性的問題。ANT旨在提供下一代的區塊鏈平臺,提供AIaaS人工智能即服務和智能合約,為各個DApp服務,讓其可以具備調用人工智能能力,繁榮DBot生態。

然而在2018年5月11日中午,ATN安全檢測人員收到了異常的監控報告,并發現其ATN存在漏洞并遭受攻擊。黑客利用了ERC223合約可傳入自定義的接收調用函數與ds-auth權限校驗等特征,在ERC223合約調用這個自定義函數時,合約調用自身函數從而造成內部權限控制失效。而本文,我們就針對這次事件進行漏洞分析,并在文章中對漏洞詳情進行復現操作,以方便讀者進行深入研究。

二、合約詳解

ATNToken合約采用的是在傳統ERC20Token合約基礎上的擴展版本ERC223,并在此基礎上調用了dapphub/ds-auth庫。而我們在前文中提到的合約代碼均為ERC20,這里為何使用ERC23呢?下面我們介紹一下ERC23與ERC20的區別。

ERC223是由Dexaran于2017年3月5日提出的一個Token標準草案,用于改進ERC20,解決其無法處理發往合約自身Token的這一問題。ERC20有兩套代幣轉賬機制,一套為直接調用transfer()函數,另一套為調用approve()transferFrom()先授權再轉賬。當轉賬對象為智能合約時,這種情況必須使用第二套方法,否則轉往合約地址的Token將永遠無法再次轉出。

下面我們具體來看一下ATN合約代碼的具體函數。

contractDSAuthority{functioncanCall(addresssrc,addressdst,bytes4sig)publicviewreturns(bool);}contractDSAuthEvents{eventLogSetAuthority(addressindexedauthority);eventLogSetOwner(addressindexedowner);}

首先,代碼定義了兩個合約,第一個合約作為接口,而第二個合約聲明了兩個事件,用于記錄Authority以及設置owner。

騰訊關聯企業公開區塊鏈的相關專利:金色財經報道,企查查APP顯示,12月22日,騰訊科技(深圳)有限公司公開了申請的區塊鏈相關專利,專利名為“基于區塊鏈的案件比查詢方法、裝置、設備和存儲介質”,專利公開號為CN112115193A,專利摘要顯示:本申請實施例公開了一種基于區塊鏈的案件比查詢方法、裝置、設備和存儲介質,可以基于區塊鏈融合多個不同執法機構的數據庫,實現了去中心化數據庫,保證數據不可篡改和可追溯,且案件對應的訴訟環節容易查找,使計算結果準確。[2020/12/23 16:12:44]

下面是DSAuth合約。

contractDSAuthisDSAuthEvents{DSAuthoritypublicauthority;addresspublicowner;functionDSAuth()public{owner=msg

functionsetOwner(addressowner_)publicauth{owner=owner_;LogSetOwner(owner);}functionsetAuthority(DSAuthorityauthority_)publicauth{authority=authority_;LogSetAuthority(authority);}modifierauth{require(isAuthorized(msg

functionisAuthorized(addresssrc,bytes4sig)internalviewreturns(bool){if(src==address(this)){returntrue;}elseif(src==owner){returntrue;}elseif(authority==DSAuthority(0)){returnfalse;}else{returnauthority

}}

此合約定義了一些基本的函數,而該合約大部分的功能是用于進行身份認證。例如setOwner用于更新owner的身份。而下面定義了一個auth修飾器,其中調用了下文的isAuthorized函數。次函數是來判斷該地址是否為合約為owner或者是否被授權。

下面合約定義了DSStop。

contractDSStopisDSNote,DSAuth{boolpublicstopped;modifierstoppable{require(!stopped);_;}functionstop()publicauthnote{stopped=true;}functionstart()publicauthnote{stopped=false;}}

現場 | 數字資產研究院技術委員會主席朱嘉明:區塊鏈可以將世界游戲規則變成“正和博弈”:金色財經現場報道,2020年8月14日,全球區塊鏈創新發展大會于江西贛州開幕,會上數字資產研究院學術與技術委員會主席朱嘉明演講表示,如今,中美關系已經很大程度上影響了世界經濟走向,二戰后,世界秩序的支點來源于四大會議。其中梅西會議確定了世界科技秩序,今天的危機本質上是從信任危機轉變成全球化危機,而重新建立信任的成本越來越高。其根本原因在于經濟形態轉變、世界經濟規模全方位擴大等因素。區塊鏈可以成為未來構建世界秩序的新結構,理論上區塊鏈具備四個明確的功能:提供國際秩序重構的社會基礎、提供國際秩序重構的個體基礎,提供國際秩序重構的法律基礎、提供國際秩序重構的經濟基礎。此外,在區塊鏈提供的技術框架下,世界游戲規則會變成“正和博弈”而非“零和博弈”。[2020/8/14]

看合約名我們也能清楚,該合約用于定義合約目前是否停止運行。所以合約內部定義了變量stopped并增加修飾器便于其余合約進行繼承使用。

而為了防止出現整數溢出等問題,合約定義了安全函數。

contractDSMath{functionadd(uintx,uinty)internalpurereturns(uintz){require((z=xy)>=x);}functionsub(uintx,uinty)internalpurereturns(uintz){require((z=x-y)<=x);}functionmul(uintx,uinty)internalpurereturns(uintz){require(y==0||(z=x*y)/y==x);}functionmin(uintx,uinty)internalpurereturns(uintz){returnx<=y?x:y;}functionmax(uintx,uinty)internalpurereturns(uintz){returnx>=y?x:y;}functionimin(intx,inty)internalpurereturns(intz){returnx<=y?x:y;}functionimax(intx,inty)internalpurereturns(intz){returnx>=y?x:y;}uintconstantWAD=10**18;uintconstantRAY=10**27;functionwmul(uintx,uinty)internalpurereturns(uintz){z=add(mul(x,y),WAD/2)/WAD;}functionrmul(uintx,uinty)internalpurereturns(uintz){z=add(mul(x,y),RAY/2)/RAY;}functionwdiv(uintx,uinty)internalpurereturns(uintz){z=add(mul(x,WAD),y/2)/y;}functionrdiv(uintx,uinty)internalpurereturns(uintz){z=add(mul(x,RAY),y/2)/y;}functionrpow(uintx,uintn)internalpurereturns(uintz){z=n%2!=0?x:RAY;for(n/=2;n!=0;n/=2){x=rmul(x,x);if(n%2!=0){z=rmul(z,x);}}}}

福建省福鼎市將區塊鏈技術滲透進茶葉全程可追溯體系:目前,福建省福鼎市全面推進大數據平臺建設和完善可追溯體系;天湖茶業也與廣東東方翠健康科技達成合作,聯合土壤檢測儀器廠商、土壤修復服務商和第三方檢測機構一起構建真實可信的監測體系,將生物科技與區塊鏈技術全面滲透進茶葉全程可追溯體系,政企合力共同推進福鼎白茶現代化生產進程。(閩東日報)[2020/3/25]

通讀此合約,我們能夠了解到在除了正常的加減乘除之外,合約還定義了平方求冪的運算函數——rpow。不過此函數在ATN中并沒有進行使用。

之后定義了DSTokenBase基礎合約。

contractDSTokenBaseisERC20,DSMath{uint256_supply;mapping(address=>uint256)_balances;mapping(address=>mapping(address=>uint256))_approvals;functionDSTokenBase(uintsupply)public{_balances=supply;_supply=supply;}functiontotalSupply()publicviewreturns(uint){return_supply;}functionbalanceOf(addresssrc)publicviewreturns(uint){return_balances;}functionallowance(addresssrc,addressguy)publicviewreturns(uint){return_approvals;}functiontransfer(addressdst,uintwad)publicreturns(bool){returntransferFrom(msg

functiontransferFrom(addresssrc,addressdst,uintwad)publicreturns(bool){if(src!=msg

_balances=sub(_balances,wad);_balances=add(_balances,wad);Transfer(src,dst,wad);returntrue;}functionapprove(addressguy,uintwad)publicreturns(bool){_approvals=wad;Approval(msg

}

該合約與ERC20等基礎合約的部分相同,所以函數定義部分比較簡單,這里就不進行詳細說明。

動態 | 哥倫比亞國立大學加入全球區塊鏈科學項目Bloxberg:據Cointelegraph消息,哥倫比亞國立大學加入全球區塊鏈科學項目Bloxberg。據悉,Bloxberg是由來自10個國家的12個研究組織組成的區塊鏈項目,由馬克斯·普朗克協會領導,哥倫比亞國立大學是來自拉丁美洲的唯一的機構。[2019/4/19]

contractDSTokenisDSTokenBase(0),DSStop{mapping(address=>mapping(address=>bool))_trusted;bytes32publicsymbol;uint256publicdecimals=18;//standardtokenprecision

eventTrust(addressindexedsrc,addressindexedguy,boolwat);eventMint(addressindexedguy,uintwad);eventBurn(addressindexedguy,uintwad);functiontrusted(addresssrc,addressguy)publicviewreturns(bool){return_trusted;}functiontrust(addressguy,boolwat)publicstoppable{_trusted=wat;Trust(msg

functionapprove(addressguy,uintwad)publicstoppablereturns(bool){returnsuper

functiontransferFrom(addresssrc,addressdst,uintwad)publicstoppablereturns(bool){if(src!=msg

_balances=sub(_balances,wad);_balances=add(_balances,wad);Transfer(src,dst,wad);returntrue;}functionpush(addressdst,uintwad)public{transferFrom(msg

functionpull(addresssrc,uintwad)public{transferFrom(src,msg

functionmove(addresssrc,addressdst,uintwad)public{transferFrom(src,dst,wad);}functionmint(uintwad)public{mint(msg

今日區塊鏈概念走勢幾何 各公司紛繁“發聲”中探端倪:區塊鏈概念連日大漲引發相關公司昨晚集體發公告。歸納分析公司的最新聲音或有助研判今日走勢。從概念龍頭看,易見股份宣布休戰,停牌核查相關報道;主動降溫、澄清傳聞的有信雅達、科藍軟件、金證股份、恒銀金融等逾10家公司,主要觀點為區塊鏈業務尚未盈利;另有少數“新軍”參戰,中南建設、東華軟件、中青寶披露區塊鏈業務最新進展,例如中青寶有運用區塊鏈技術的游戲發行;此外,已停牌的游久游戲遭交易所問詢。[2018/1/12]

functionburn(uintwad)public{burn(msg

functionmint(addressguy,uintwad)publicauthstoppable{_balances=add(_balances,wad);_supply=add(_supply,wad);Mint(guy,wad);}functionburn(addressguy,uintwad)publicauthstoppable{if(guy!=msg

_balances=sub(_balances,wad);_supply=sub(_supply,wad);Burn(guy,wad);}//Optionaltokennamebytes32publicname="";functionsetName(bytes32name_)publicauth{name=name_;}}

DSToken繼承了上文的合約以及用于停止合約運行的DSStop合約。

比較值得注意的地方為_trusted。此函數類似于記錄授權值,只有被授權后的用戶才能代替進行轉賬操作。并且此授權值有固定的金額。

而mint函數也是此合約的重點。該函數用于增加某地址的金額數量,而想要執行此函數,必須經過授權或者擁有權限。

之后合約定義了Controlled。

contractControlled{///}

此合約用于進行權限的判斷并進行對controller的修改。

而下面就是我們ATN合約的具體函數內容了。

ATN合約定義了多個類型的轉賬函數,其名字均相同,但是傳入參數不同。

functiontransferFrom(address_from,address_to,uint256_amount)publicreturns(boolsuccess){//Alertsthetokencontrollerofthetransferif(isContract(controller)){if(!TokenController(controller)

success=super

require(super

ERC223Transfer(_from,_to,_amount,_data);returntrue;}

在該合約中,我們知道函數首先判斷controller是否為一個合約而不是一個錢包地址。如何為合約的話,那么將調用TokenController中的onTransfer函數。

然而這并不是重點,之后將使用require(super

而為了保證安全性,合約還定義了轉賬函數以降低風險。

///@noticeThismethodcanbeusedbythecontrollertoextractmistakenly///senttokenstothiscontract.///@param_tokenTheaddressofthetokencontractthatyouwanttorecover///setto0incaseyouwanttoextractether

ERC20token=ERC20(_token);uintbalance=token

這里定義了claimTokens合約用于將余額全部提取以防止出現大的安全隱患。

三、漏洞復現

根據我們上文解釋,我們能夠發現在ATN合約中的轉賬函數多次出現了遠程調用的內容。這其實是很危險的行為。通常當我們調用ERC20的approve()函數給一個智能合約地址后,對方并不能收到相關通知進行下一步操作,常見做法是利用接收通知調用來解決無法監聽的問題。上面代碼是一種實現方式,很不幸這段代碼有嚴重的CUSTOM_CALL濫用漏洞。調用approveAndCall()函數后,會接著執行_spender上用戶自定義的其他方法來進行接收者的后續操作。

所以我們完全可以在transferFrom函數中傳入特定的參數從而執行特定的函數。

functiontransferFrom(address_from,address_to,uint256_amount,bytes_data,string_custom_fallback)publicreturns(boolsuccess){ERC223ReceivingContractreceiver=ERC223ReceivingContract(_to);receiving

比如我們可以傳入:

transferFrom(hacker_address,atn_contract_address,0,0,"setOwner(address)")_from:0xxxxxxxx--黑客地址_to:0xxxxxxx--ATN合約地址_amount:0_data:0x0_custom_fallback:setOwner(address)

這樣函數就會在執行轉賬操作后執行setOwner函數。此時setOwner會先驗證auth合法性的,而msg.sender就是ATN的合約地址。此時黑客將ATNToken合約的owner變更為自己控制的地址。

首先我們需要部署合約。

之后調用mint函數進行挖礦向合約中注入一定資產。

進行查看。

此時我們創建攻擊者賬戶。并查看其余額,查看當前owner。

之后我們切換到攻擊者賬戶下,并傳入參數:

"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0xca35b7d915458ef540ade6068dfe2f44e8fa733c",0,0x00,"setOwner(address)"

傳入后,我們再次查看owner的信息。

卻發現失敗了。仔細閱讀后發現我們需要將令_to為一個合約地址。

"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0xbbf289d846208c16edc8474705c748aff07732db",0,0x00,"setOwner(address)"

更換地址后,我們執行。得到如下結果。

此時我們能夠看到owner已經更換。

既然我們已經成為合約擁有者,那么我們就給自己點福利。

我們成功給自己的賬戶中增加了一定的token。

之后我們為了銷聲匿跡。將合約主人換回從前。

至此,我們的攻擊目的已經達到。

在真實ATN中,我們能夠查詢到真實攻擊的交易情況:

黑客獲得提權,將自己的地址設為ownerhttps://etherscan.io/tx/0x3b7bd618c49e693c92b2d6bfb3a5adeae498d9d170c15fcc79dd374166d28b7b

黑客在獲得owner權限后,發行1100wATN到自己的攻擊主地址https://etherscan.io/tx/0x9b559ffae76d4b75d2f21bd643d44d1b96ee013c79918511e3127664f8f7a910

黑客將owner設置恢復,企圖隱藏蹤跡https://etherscan.io/tx/0xfd5c2180f002539cd636132f1baae0e318d8f1162fb62fb5e3493788a034545a

四、參考鏈接

http://btsabc.org/article-1449-1.html

https://etherscan.io/address/0x461733c17b0755ca5649b6db08b3e213fcf22546#code

https://paper.seebug.org/621/

https://www.jianshu.com/p/38cbf879ac72

https://github.com/dapphub/ds-auth/blob/master/src/auth.sol

Tags:INTADDUINESScointiger幣虎兌美元Paddycoinuin幣末來有沒有價值guesscoin

火必交易所
BIT:IEO帶不來牛市,但這波“投機”存在價值

IEO帶不來牛市,但存在價值來自幣市小姐姐00:0012:19好久不見,最近一段時間我在歐洲頻繁地看項目,實在沒騰出時間來靜心寫文章,對二級市場的關注也并不太多,但近期隨著行情的轉暖.

1900/1/1 0:00:00
GATE:Gate.io公布點卡發售和3億GT獎勵細則(人人都可公平參與)

Gate.io在本周發布會揭示了未來的重磅發展規劃,上線點卡手續費系統并發布了行業獨創的區塊鏈安全解決方案Gatechain公有鏈,以消除用戶私鑰丟失或損毀的風險.

1900/1/1 0:00:00
NAS:透明、不可篡改到底是手段還是本質

作為全球最大的資產管理公司,貝萊德一直以來都對比特幣和區塊鏈持積極擁抱的態度。今天這家巨頭公司的老板說:“比起比特幣,更看好比特幣的底層技術區塊鏈.

1900/1/1 0:00:00
IOTA:擺脫投機暴富的幻覺,遠比搶到點額度更重要

擺脫投機暴富的幻覺….mp3來自幣市小姐姐00:0013:23最近幣圈挺熱鬧:三大交易平臺的IEO項目如果搶到的話秒賺幾倍甚至幾十倍;原本已經快要歸零的項目加上所謂“模式”后,短期暴漲幾十倍.

1900/1/1 0:00:00
KEX:一位美國海軍眼里的比特幣:數字世界是比公海更大的公地

這篇文章來自于一位美國海軍的親筆博客。他想和我們聊一聊「自動步槍經濟學」——比特幣就像數字公海里的AK-47,它讓每個人都能成為分布式的暴力機器。當兵的那段記憶,有個畫面我至今一直忘不掉.

1900/1/1 0:00:00
GON:「BigONE 法幣交易區」系統升級通知

親愛的用戶: 「BigONE法幣交易區」將于2019年4月24日15:00:00進行系統升級。預計時長:2個小時.

1900/1/1 0:00:00
ads