以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

 

事情发生在5月中旬,ATN技术人员发现Token合约因为存在漏洞受到攻击。不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原固定总量不变。html

如下是事件还原。安全

事件回顾网络

2018年5月11日中午,ATN技术人员收到异常监控报告,显示ATN Token供应量出现异常,迅速介入后发现Token合约因为存在漏洞受到攻击。如下是黑客的攻击操做以及利用合约漏洞的全过程。app

攻击运维

此次攻击主要分为4。首先,黑客利用ERC223方法漏洞,得到提权,将本身的地址设为owner:函数

 

第二,黑客在得到owner权限后,发行1100w ATN到本身的攻击主地址:性能

 

第三,黑客将owner设置恢复,企图隐藏踪影:区块链

 

最后,黑客从主地址将偷来的黑币分散到14个地址中:加密

 

利用合约漏洞设计

ATN Token合约采用的是在传统ERC20Token合约基础上的扩展版本ERC223 ,并在其中使用了dapphub/ds-auth库。采用这样的设计是为了实现如下几个能力:

  1. 自然支持Token互换协议,即ERC20TokenERC20Token之间的直接互换。本质上是发送ATN时,经过回调函数执行额外指令,好比发回其余Token。
  2. 可扩展的、结构化的权限控制能力。
  3. Token合约可升级,在出现意外情况时可进行治理。

单独使用ERC223或者ds-auth库时,

并无什么问题,可是二者结合时,

黑客利用了回调函数回调了setOwner方法,

从而得到高级权限。

ERC223转帐代  码以下:

 

当黑客转帐时在方法中输入如下参数:

 

 

  • from: 0x2eca25e9e19b31633db106341a1ba78accba7d0f——黑客地址;
  • to: 0x461733c17b0755ca5649b6db08b3e213fcf22546——ATN合约地址;
  • amount: 0
  • data: 0x0
  • custom_fallback: setOwner(address)

该交易执行的时候,

receiver会被_to(ATN合约地址)赋值,

ATN 合约会调用_custom_fallback

DSAuth中的setOwner(adddress)方法,

而此时的msg.sender变为ATN合约地址,

owner_参数为_from(黑客地址)

ds-auth库中setOwner代码以下:

 

此时setOwner会先验证auth合法性的,而msg.sender就是ATN的合约地址。

setOwnermodifier auth代码以下:

 

经过利用这个ERC223方法与DS-AUTH库的混合漏洞,黑客将ATN Token合约的owner变动为本身控制的地址。获取owner权限后,黑客发起另一笔交易对ATN合约进行攻击,调用mint方法给另一个地址发行1100w ATN。

最后,黑客调用setOwner方法将权限复原 。

PS. 截至发稿前,ATN官方已声称:黑客将黑币分散在14个不一样的新地址中,而这些地址中并无ETH,暂时不存在当即转帐到交易所销赃的风险。

漏洞是怎么形成的?

此次事件主要是利用了开发者对以太坊底层函数callcallcodedelegatecall的不当使用形成的。

callcallcodedelegatecall是以太坊智能合约编写语言Solidity提供的底层函数,用来与外部合约或者库进行交互。不当的使用会形成很严重的后果。

例如,如下状况:

 

 

上述例子中,call函数的调用地址(如上图中的_spender参数)是能够由用户控制的,攻击者能够将其设置为合约自身的地址,同时call函数调用的参数(如上图中的_extraData参数)也是能够由用户任意输入的,攻击者能够调用任意函数。

攻击者利用上述操做,伪形成合约帐户进行恶意操做,可能形成以下影响:

  1. 绕过权限检查,调用敏感函数,例如setOwer;
  2. 窃取合约地址持有的代币;
  3. 假装成合约地址与其余合约进行交互;

所以,在编写合约时,此类函数使用时须要对调用参数的安全性进行断定,建议谨慎使用。

怎样避免此类漏洞

为了不此类漏洞,咱们提醒开发者应注意如下几点。

  1. 谨慎使用call、delegatecall等底层函数。此类函数使用时须要对调用参数进行限定,应对用户输入的call调用发起地址、调用参数作出严格限定。好比,call调用的地址不能是合约自身的帐户地址,call调用的参数由合约预先限定方法选择器字符串,避免直接注入bytes可能致使的恶意call调用。
  2. 对于一些敏感函数,不要将合约自身的帐户地址做为可信地址
  3. 准备修复措施,增长Guard合约禁止回调函数向ATN合约自己回调
  4. 增长黑名单合约,随时冻结黑客地址。
    1. 合约无小事
    2. 综合上文的分析,咱们认为,call函数的使用必定要当心,在智能合约开发中尽可能避免call函数的使用,若是使用须要对其相关参数进行严格的限定。另外一方面,智能合约在部署以前应进行安全审计,好比代码的形式化验证等。
    3. 合约的安全审计,仅依靠开发者的经验和能力总有隐患,过去业内的几回合约漏洞事件也说明了这个问题,开发者务必要引发重视。

 

安全上链哪家强?华为云区块链服务(Blockchain Service)是面向企业及开发者的高性能、高可用和高安全的区块链技术平台服务,能够帮助企业和开发人员在华为云上快速、低成本的建立、部署和管理区块链应用。华为云区块链开放易用:基于Hyperledger1.0、kubernetes搭建,配置简单,数分钟内便可完成部署,提供全流程、多维度的自动化运维服务。安全隐私有保障!完善的用户、秘钥、权限管理和隔离处理,多层加密保障,国密和同态加密等隐私处理,可靠的网络安全基础能力,运营安全无忧。

欢迎体验!https://www.huaweicloud.com/product/bcs.html

相关文章
相关标签/搜索