多个ERC20智能合约曝安全漏洞evilReflex,攻击者可任意窃取受影响账户余额

近日,区块链安全公司PeckShield发现一种新型的智能合约安全漏洞“evilReflex”,攻击者可通过公开的接口窃取合约地址账户中存放的Token。

据PeckShield研究人员透露,目前已发现有数十个Token受该漏洞影响,其中部分Token已在某些顶级交易所上线并交易。PeckShield已向相关交易所通报并协助修复该问题。截止撰写本文之前,火币网已经发出公告[11],暂停18T和GVE充提币业务。

(Credit: https://gdblogs.shu.ac.uk/b5023021/2017/02/22/self-reflection/)

迄今为止,PeckShield已通过漏洞扫描系统发现了多种严重的智能合约安全漏洞。这些已经披露的CVE编号漏洞包含( batchOverflow [1],proxyOverflow [2], transferFlaw [3], ownerAnyone [4], multiOverflow [5],burnOverflow [6]), ceoAnyone [7]), allowAnyone [8,9]), allowFlaw [9]), tradeTrap[10])等。上述安全漏洞,有些可被攻击者利用无中生有地生成Token,或者直接从合法持有者的账户中窃取数字资产;此外,还有部分漏洞允许攻击者可以替换并控制owner(管理员)的权限。

此次,我们披露了一种名为evilReflex的新型漏洞。利用这个漏洞,攻击者可以将受影响的智能合约地址账户中持有的任意数量的Token转移至任何地址。只要这些智能合约地址账户中的Token余额不为零,攻击者就可以实施攻击,将其一扫而空。

(图一:受evilReflex影响的智能合约)

如图一所示,这是受evilReflex影响的某智能合约的approveAndCallcode()函数。问题出现在第135行,其中_spender.call()调用的参数_extraData是可被操纵的。此回调函数的预期用途是在完成approve()操作后发出相关通知。但是,通过构造特定的_extraData,攻击者可以劫持回调函数执行预期用途之外的操作。

换言之,这种漏洞允许攻击者使用任意参数从存在漏洞的合约调用任何合约地址,攻击者会立刻拥有与合约地址等同的权限。在某些智能合约中,合约地址本身有可能被用于授权的目的,即部分特权操作只能够由合约地址发起,这意味着攻击者也可以执行这部分特权操作。

从另外一个角度来看,如果存在该漏洞的合约地址恰巧拥有某些加密数字资产(合约可能会接受ETH付款或分发某些ERC20 Token),攻击者可以很容易地窃取这些资产。该如何做呢?攻击者可以通过使合约地址调用自身的transfer()函数来利用evilReflex漏洞。具体来说,他可以简单地将_spender设置为合约地址并构造_extraData,从transfer()函数的签名开始,然后是两个参数to和value。通过这样的方法,合约地址会调用transfer()函数将自身持有的Token转移到任意指定的地址。图2给出了我们观察到的某个实际的攻击案例中所构造使用的_extraData。

(图二: 实际攻击案例中构造使用的_extraData)

截至目前,我们的漏洞扫描系统已经发现至少28个ERC20 Token的智能合约代码中存在evilReflex漏洞,而其中的一些Token已经在顶级交易所上线交易。此外,我们也发现一个可交易的Token已经受到攻击,造成至少100个以上的Token被盗。我们正在和这些Token的项目方以及交易所取得联系,并且协助他们修复该问题。如果有任何关于evilReflex的问题需要帮助解决,请及时与我们联络。也可通过PeckShield的知识星球获取最新的安全动态: https://t.zsxq.com/7ujIQ7A。

我们大约在一个月前发现该漏洞,鉴于问题的敏感性和严重性(牵涉到可以交易Token和交易所),相关的漏洞细节必须在与主要的交易所[11]协同之后才能予以公开。与此同时,也有某些研究者[12]独立地描述了此类漏洞的原理,并以ERC223合约作为案例展开探讨。

参考

[1] PeckShield:2018年4月22日 多个ERC20智能合同(CVE-2018-10299)中的新批量溢出错误

[2] PeckShield:2018年4月25日 多个ERC20智能合同中的新代理溢出错误(CVE-2018-10376)

[3] PeckShield: 你的代币是我的: 2018年4月28日在顶级交易所的可疑诈骗代币

[4] PeckShield: 新所有者任何人都可以在 2018年5月3日拥有某些基于ERC20的智能合同(CVE-2018-10705)

[5] PeckShield: 在多个ERC20智能合同(CVE-2018-10706),2018年5月10 日中确定的新的多重溢出错误

[6] PeckShield:2018年5月18日发布的 多个ERC20智能合同(CVE-2018-11239)中发现的新的burnOverflow错误

[7] PeckShield:2018年5月21日 多个加密游戏智能合同中识别的新ceoAnyone错误(CVE-2018-11329)

[8] PeckShield:2018年5月23日 在多个ERC20智能合同中识别的新的allowAnyone错误(CVE-2018-11397,CVE-2018-11398)

[9] PeckShield:2018年6月6日 在多个ERC20智能合同中发现新的allowFlaw错误

[10] PeckShield:2018年6月11日 在多个热门交易所完全披露高度可操纵的,受tradeTrap影响的ERC20代币

[11] 火币:2018年6月24日 关于暂停18T和GVE充提币业务的公告

[12] EnsecTeam:2018年6月21日

以太坊智能合约call注入攻击

关于我们

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180624G12BDB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券