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

以下是事件还原。

事件回顾

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

攻击

这次攻击主要分为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

以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末的更多相关文章

  1. zabbix再爆高危SQL注入漏洞,可获系统权限

    漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统 ...

  2. 再爆安全漏洞,这次轮到Jackson了,竟由阿里云上报

    冤冤相报何时了,得饶人处且饶人.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[ ...

  3. Struts2再曝高危漏洞(S2-020补丁绕过)

    之前S2-020漏洞利用方式见drops:Struts2 Tomcat class.classLoader.resources.dirContext.docBase赋值造成的DoS及远程代码运行利用! ...

  4. openssl 再爆惊天漏洞及紧急修复指南

    openssl 又摊上大事了,2014年6月5日,SSL/TLS Man-in-the-Middle Vulnerability 该漏洞使得攻击者能够拦截恶意中间节点加密和解密数据.同一时候强迫使用弱 ...

  5. Struts2 高危漏洞补丁版本为: Struts 2.3.15.1

    Struts2 昨天爆出高危漏洞,黑客利用这个漏洞可以执行任意命令(包括恶意的jsp代码),轻松绕过您的验证系统,登陆您的网站后台,使您的网站后台密码形同虚设!! 目前Struts2官方已经发布了一个 ...

  6. 以太坊钱包开发系列4 - 发送Token(代币)

    以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...

  7. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程

    AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...

  8. OpenSSL再爆多处高危漏洞

    OpenSSL团队于北京时间6月5号晚8点左右发布了5个安全补丁,这次的更新涉及多处高危漏洞,连接:http://www.openssl.org/news/ 受影响的版本包括: OpenSSL 1.0 ...

  9. 转载(原标题:网站再遭新威胁 Struts2又曝高危漏洞啦)

    自从著名J2EE框架Apache Struts2被曝出可被远程攻击者利用的执行漏洞后,关于Struts2的安全性便广受关注.近日,安全研究人员则再次发现了Struts2存在远程代码执行的漏洞,Stru ...

随机推荐

  1. SQLyog Enterprise Trial 试用期问题

    SQLyog Enterprise Trial 是 SQLyog的试用版,有效期30天:试用期过后提示购买之后才能使用:解决办法:修改注册表(过期就得改比较麻烦,但暂时可以用,等有时间了再找其他办法) ...

  2. Mybatis generator配置

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  3. Qt编写数据可视化大屏界面电子看板8-调整间距

    一.前言 在数据可视化大屏界面电子看板系统中,前期为了使用目标客户机,调整间距是必不可少的工作,QMainWindow中的QDockWidget,会默认生成布局和QSplitter调整宽高大小,鼠标移 ...

  4. Docker save and load,镜像保存

    一.起因 docker pull 时发生错误 error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/r ...

  5. 文件上传跨域解决方案-jQuery-File-Upload

    GIT 下载地址 https://github.com/blueimp/jQuery-File-Upload 亲测HTTPS HTTP跨域无压力 不用自带的DEMO 用下面的DEMO <!DOC ...

  6. php自定义错误处理函数

    function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:< ...

  7. DataFrame执行groupby聚合操作后,如何继续保持DataFrame对象而不变成Series对象

    刚接触pandas不久,在处理特征时,碰到一个恶心的问题:用groupby聚合后,之前的dataframe对象变成了series对象,聚合的字段变成了索引index,导致获取这些字段时很麻烦,后面发现 ...

  8. canvas入门级基本用法实现雨滴下落特效

    canvas基础知识点参考各种文档,直接上代码,有非常详细注释 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  9. 《剑指offer》树专题 (牛客10.25)

    考察的知识点主要在于树的数据结构(BST,AVL).遍历方式(前序,中序,后序,层次).遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...

  10. Git速成学习第三课:创建与合并分支

    本来第三课想记录一下远程仓库的创建与克隆0.0但是想了想还是不写了. 这里写一下分支管理中的创建与合并. Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng. ...