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

编者按:5月11日,ATN Token遭受恶意攻击,攻击者利用DSAuth库与ERC223搭配使用具有的混合漏洞,窃取了ATN的所有权。之后,攻击者进行了窃取代币操作。


这是一起严重的黑客攻击事件,可以导致Token的供应总量发生变化。


归根结底,黑客这次又是冲着智能合约的编写漏洞来的。我们今天就来给大家从技术上揭底这次事件,并透过这次事件,奉上实用的合约编写建议。在此鸣谢成都链安科技CEO杨霞提供的独家资料。

事情发生在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互换协议,即ERC20Token与ERC20Token之间的直接互换。本质上是发送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的不当使用造成的。


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

例如,以下情况:

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

攻击者利用上述操作,伪造成合约账户进行恶意操作,可能造成如下影响:

  1. 绕过权限检查,调用敏感函数,例如setOwer;

  2. 窃取合约地址持有的代币;

  3. 伪装成合约地址与其他合约进行交互;

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

怎样避免此类漏洞


为了避免此类漏洞,我们提醒开发者应注意以下几点。

  1. 谨慎使用call、delegatecall等底层函数。此类函数使用时需要对调用参数进行限定,应对用户输入的call调用发起地址、调用参数做出严格限定。比如,call调用的地址不能是合约自身的账户地址,call调用的参数由合约预先限定方法选择器字符串,避免直接注入bytes可能导致的恶意call调用。

  2. 对于一些敏感函数,不要将合约自身的账户地址作为可信地址

  3. 准备修复措施,增加Guard合约禁止回调函数向ATN合约本身回调

  4. 增加黑名单合约,随时冻结黑客地址。

合约无小事


综合上文的分析,我们认为,call函数的使用一定要小心,在智能合约开发中尽量避免call函数的使用,如果使用需要对其相关参数进行严格的限定。另一方面,智能合约在部署之前应进行安全审计,比如代码的形式化验证等。

合约的安全审计,仅依靠开发者的经验和能力总有隐患,过去业内的几次合约漏洞事件也说明了这个问题,开发者务必要引起重视。

关于作者:

杨霞,成都链安科技CEO,创始人。电子科技大学副教授,最早研究区块链形式化验证的专家。一直为航空航天、军事领域提供形式化验证服务。主持国家核高基、装发重大软件课题等近10项国家课题。CC国际安全标准成员、CCF区块链专委会委员。发表学术论文30多篇,申请20多项专利。

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

  1. 小心!智能合约再爆高危漏洞,两大加密货币直接变废纸!

    小心!智能合约再爆高危漏洞,两大加密货币直接变废纸! 大家都还记得,前一段时间发生的BEC智能合约的安全漏洞问题.近日,智能合约安全问题再次上演,火币Pro发布公告,暂停EDU冲提币业务,随后EDU智 ...

  2. 【黑鸟安全预警与每日资源】S2-048!Struts2 再爆高危漏洞!

    [黑鸟安全预警]S2-048!Struts2 再爆高危漏洞!目前POC已公开,请各单位检查自己的应用是否有使用了Struts2 Struts1的插件!若使用了该插件会导致不受信任的输入传入到 Acti ...

  3. Struts 2再爆高危漏洞CVE-2017-5638 绿盟科技发布免费扫描工具及产品升级包

    Apache Structs2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638.cwiki.apache.org公告了这个信息. 绿盟科 ...

  4. 项目调研丨以太坊再质押项目EigenLayer白皮书四大看点(内附完整版中文白皮书)

    北京时间2月21日下午,被众多一线投研机构视为2023年以太坊最重要的创新,有可能开启以太坊新叙事方向的项目Eigenlayer终于披露了其第一版白皮书. EigenLayer是以太坊的再质押集,允许 ...

  5. Android 爆高危漏洞,华为小米皆中招;第三代苹果 AirPods 来了;SQLite 3.30.0 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  6. ImageMagick再爆严重漏洞,可导致雅虎邮箱用户邮件内容泄漏

    本文讲的是ImageMagick再爆严重漏洞,可导致雅虎邮箱用户邮件内容泄漏, 在安全研究员发现图片处理库ImageMagick存在严重漏洞.可导致服务器内存数据泄漏错误后,雅虎工程师决定把自家网站上 ...

  7. Real Vision CEO预测以太坊币价将在今年年初达到2万美元

    2月4日消息,Real Vision Group首席执行官Raoul Pal发推称:"年初至今,以太坊上涨了126%.我预测以太坊币价在今年年初将达到2万美元." 文章链接:htt ...

  8. Spring Cloud 爆高危漏洞!!!

    今日推荐 最适合晚上睡不着看的 8 个网站,建议收藏哦 23 种设计模式的通俗解释,虽然有点污,但是秒懂请立即卸载这款 IDEA 插件!SQL自动检查神器,再也不用担心SQL出错了,自动补全.回滚等功 ...

  9. 突发!Spring Cloud 爆高危漏洞。。赶紧修复!!

    Spring Cloud 突发漏洞 Log4j2 的核弹级漏洞刚告一段落,Spring Cloud Gateway 又突发高危漏洞,又得折腾了... 2022年3月1日,Spring官方发布了关于Sp ...

最新文章

  1. restful url 设计规范_restFul接口设计规范
  2. 解析提高PHP执行效率的50个技巧(转)
  3. 解析 | 如何从频域的角度解释CNN(卷积神经网络)?
  4. 【读书笔记】触摸屏游戏设计
  5. Windows下使用mingw32
  6. IE浏览器为什么打不开java_IE浏览器拒绝访问的原因及其解决方法。
  7. java使用谷歌邮箱发送邮件
  8. CentOS7配简单的桌面环境openbox
  9. 莫队算法 --算法竞赛专题解析(26)
  10. java解析pdf 图片文字_Java 读取PDF中的文本和图片
  11. Mac 更新系统后无法正常启动
  12. linux查找多少天前的文件,linuxfind查找大于多少天的文件,并删除之
  13. 英语四六级详细报名步骤来啦!
  14. 左侧颜面部起疱,疼痛剧烈2天-牙博士
  15. MIT 6.824涉及的部分论文翻译
  16. eNSP基础命令_01
  17. Jordan CP3 11 Performance Reviews
  18. 永磁同步电机最大转矩电流比控制similink仿真模型下载
  19. php传输文件大小修改的限制
  20. 连接mysql报错 errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of many connection errors

热门文章

  1. 图灵机原理三体中人计算机,有关计算机中人列计算机的问题
  2. C盘过满或者重装系统小技巧(不需要重做系统)
  3. 【加速实践】番外篇:numbajit
  4. C++拷贝构造函数(复制构造函数)详解
  5. python 正则 去除字符串中异常字符
  6. python管理图片_Django 管理图片
  7. Leetcode 剑指offer 22. 链表中第k个节点 (每日一题 20210716)
  8. ubuntu 运行python subprocess 出现/bin/sh: 1: source: not found 错误
  9. 如何迅速成长成为一名数据分析师(都是干货)?
  10. MATLAB实现牛顿插值的源程序