链资讯 链资讯
Ctrl+D收藏链资讯
首页 > DYDX > 正文

INT:区块链安全—深入分析ATN漏洞_ESS

作者:

时间:

作者: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。

菲律宾首次发行区块链数字比索债券融资2.09亿美元:金色财经报道,联合银行发行了菲律宾首个基于区块链的数字比索债券,筹集了 2.09 亿美元。当银行表示打算筹集至少 10 亿美元的数字比索债券时,超额认购的融资规模是该银行预期的 11 倍。UnionBank 的数字债券是通过菲律宾存托信托公司的数字登记处和数字存托处发行的。这些债券与菲律宾交易与交易公司的固定收益市场保持互操作性。这些债券的期限为 1.5 年,固定年利率为 3.25%,并在菲律宾交易与交易公司市场上市交易。这家上市银行打算用这笔资金为收购全球银行业巨头花旗的国内消费银行业务提供部分资金。去年底,UnionBank 以 550亿比索(10 亿美元)收购了花旗的消费银行业务。(blockworks)[2022/6/2 3:58:53]

下面是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;}}

Eden区块链浏览器将上线:9月28日消息,以太坊优先交易网络Eden Network发推称,将上线Eden区块链浏览器,近期将公布详细的公告。[2021/9/28 17:12:19]

看合约名我们也能清楚,该合约用于定义合约目前是否停止运行。所以合约内部定义了变量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);}}}}

美股区块链板块盘前走高,嘉楠科技涨5.3%:行情显示,美股区块链板块盘前走高,嘉楠科技(CAN.O)涨5.3%,Marathon Patent(MARA.O)、Riot Blockchain(RIOT.O)涨超4%,Coinbase(COIN.O)涨2.1%,今日比特币自5月以来首次突破50000美元/枚关口。[2021/8/23 22:31:52]

通读此合约,我们能够了解到在除了正常的加减乘除之外,合约还定义了平方求幂的运算函数——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等基础合约的部分相同,所以函数定义部分比较简单,这里就不进行详细说明。

动态 | 报告显示:50年来,人工智能、区块链、云计算、量子技术等先进技术迸发创新活力:《世界互联网发展报告2019》20日在第六届世界互联网大会上正式发布。《世界互联网发展报告2019》显示,互联网在促进创新驱动发展中发挥着先导作用,引领着世界先进科技的发展方向。50年来,随着科技革命和产业变革的迅速兴起,以互联网为代表的新一代信息技术日新月异,基础性技术和前沿热点技术加快迭代演进,人工智能、区块链、云计算、量子技术等先进技术迸发创新活力,5G带动大数据、边缘计算、虚拟现实等技术快速进步,在更深层次、更广范围加快推动数字化、网络化、智能化转型。世界知识产权组织的报告显示,过去20年,在全球专利申请量排名前30的企业中,互联网相关领域的企业占比高达80%。(经济日报)[2019/10/21]

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

微信、Facebook的终极敌人——区块链或将彻底颠覆社交媒体:Facebook、亚马逊、谷歌等公司曾经打散了信息传播的权力中心,但他们现在又建立起了另一个垄断数据和信息的集权中心。主张区块链技术重塑社交媒体的观点认为: 区块链技术的核心是去中心化,可以帮助用户更好地保护信息隐私;区块链技术支持下的社交平台可以拥有更可靠的内容排名和社交系统,免受广告商垃圾内容的困扰;原创内容生产者也能从自己的创作中获利,而不是被平台剥夺权益。[2018/1/27]

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

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

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

标签:INTADDUINESScointiger官网下载最新版本Saddleuin币未来有没有价值Business 99

DYDX热门资讯
区块链:金色早报|100个知名组织将与世界经济论坛合作加速区块链部署_FTcoin币

清华大学朱岩:中国是区块链生长的最好土壤 ◇金色盘面 据huobiglobal数据显示,BTC最近成交价36418.59元,24小时变化0.19%;ETH最近成交价1082.19元.

加密货币:如何向最知名区块链投资大咖和老钱充值区块链信仰?_区块链

5月初全球最重要加密货币投资机构的私密聚会上,他们听了这样一个关于未来趋势的演讲。从去年开始,4月底5月初的时候,全球一些最重要的加密货币领域的投资机构掌舵人会前往洛杉矶比弗利山,参加一个名叫「.

NAN:Binance开放ATOM/USDC、ATOM/PAX、ATOM/TUSD交易市场_Hifi Finance

亲爱的用户: Binance将于2019年05月07日20:00上线ATOM/USDC、ATOM/PAX、ATOM/TUSD交易市场,邀您体验!金色财经行情播报 | BTC小幅反弹后下跌.

INT:2600万TRX被盗背后的罗生门 后续_DADDYDB

导读:随着新一天的调查,更多证据被各方挖掘出来,本次事件的真相正在逐渐浮出水面,戏剧化程度堪比一场年度大戏。文末还附上了wojak的财富密码.

比特币:股神巴菲特打了一个响指 抹去了一半的加密货币投资者?_金比特

每年五月的第一个星期六,是全球投资者的“朝圣之旅”——股神巴菲特的伯克希尔·哈撒韦股东大会在其总部所在地美国奥马哈举行,全世界几万人前往这里希望获知投资的风向标.

比特币:一文读懂Augur市场经济学运作_超级比特币

前言:大家都知道Augur是构建于以太坊上的预测市场协议,但从用户的角度,它具体是如何运作?本文有详细的介绍,当然想要理解更深入,莫过于实践.