一、事件描述
2022年9月18日,以太坊合并完成后,PoW链遭到PoS链上交易的重放攻击,根本原因是网桥未正确读取并验证区块链的chainid。攻击者首先通过Gnosis链的Omni跨链桥转移了200WETH,然后在PoW链上重放了相同的消息,获得了额外的200ETHW。
SharkTeam对此事件进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
声音 | 天津法院张伟:警惕以投资虚拟货币、区块链等为幌子的局:据新华网消息,近年来,非法吸收公众存款、集资等非法集资案件带来诸多不良影响。天津市第一中级人民法院刑二庭副庭长张伟提醒,老百姓遇到以下情况之一的,务必要提高警惕:(1)以赚外快、消费返利为幌子的;(2)以投资境外股权、期权、外汇、贵金属等为幌子的;(3)以投资养老产业可获高额回报或免费养老为幌子的;(4)以私募入股、合伙办企业为幌子而不办理企业工商登记的;(5)以投资虚拟货币、区块链等为幌子的;(6)以扶贫、慈善、互助为幌子的;(7)在街边、小区、商场、超市等违法违规发放广告的;(8)以组织考察、旅游、讲座等方式招揽老年群众的:(9)投资、理财公司网站及服务器在境外的;(10)要求以现金方式或向个人账户、境外账户缴纳投资款的。[2019/9/3]
二、事件分析
独家 | 警惕以太坊里的垃圾合约?伪造交易进行广告推广:近日,降维安全实验室(johnwick.io)在以太坊智能合约监控系统中监测到一个垃圾推广合约ERC20 (blockwell.ai KYC Casper Token),垃圾推广通过调用垃圾合约的某公开方法(方法签名: 0x975ef7df)虚构了大量(每500个一组,转账数量100个代币)受害地址之间的转账交易,并虚假记录了这些转账交易的Transfer()事件日志,导致大批钱包应用依据此事件记录,向无辜受害用户推送了此垃圾代币的交易转账通知,变相成为了此垃圾代币的推广宣传帮凶。在短短一天时间内,该交易者伪造了50余万笔虚假交易(截至发稿前为止)进行垃圾推广。
垃圾交易者地址: 0xaaf70e052b76c9bd177e24a0e249f17cc3486ea0
垃圾合约地址: 0x212d95fccdf0366343350f486bda1ceafc0c2d63
垃圾代币名称: ERC20 (blockwell.ai KYC Casper Token)[2018/9/10]
该事件涉及两个不同链的交易hash以及攻击者地址,分别如下:
天津市机关:警惕以“虚拟货币”“区块链”为幌子的非法集资活动:天津日报6月8日报道,天津市处非办与机关提醒广大群众,务必警惕以投资“虚拟货币”“区块链”为幌子的“投资”“理财”项目。天下不会掉馅饼,高收益必然伴随高风险。非法集资不受法律保护,参与非法集资风险自担。[2018/6/8]
PoS链交易hash:0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5
工商总局 警惕以为手段的新型互联网欺诈行为:国家工商总局网站消息,近期,以形式为手段的新型互联网欺诈行为频发。部分组织和个人以经营网络虚拟货币、网络游戏的名义,打着“虚拟货币”“数字货币”“电子币”“互联网代币”或“网游、网赚”“玩游戏得大奖”“玩网游送红包”等旗号,以高额“静态收益”“动态收益”“推广返利”为诱饵,利诱、广大群众缴纳入会费用成为会员,并鼓动会员发展下线,取钱财,此类活动可能涉嫌以为手段和形式,本质上实施非法集资、擅自从事金融业务活动、等违法犯罪行为,参与者的权益存在巨大风险。[2017/12/11]
PoW链交易hash:0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4
攻击者地址:0x82FaEd2dA812D2E5CCed3C12b3baeB1a522DC677
首先,我们对比发现两笔交易访问的合约相同,并且inputdata完全相同,即调用了同一个合约的同一个函数并且参数相同,根据相同的方法签名ID?0x23caab49可知,黑客调用safeExecuteSignaturesWithAutoGasLimit函数。
因此,攻击者通过OmniBridge转移200WETH,然后在PoW链上重放了相同的Inputdata,获得了额外的200ETHW。
此时,我们对这里的重放操作抱有怀疑态度。因为,以太坊网络在硬分叉之前强行执行EIP-155,这就说明ETHPoS链上交易不能在PoW链上重复交易。在正常的交易中,我们通过nonce来进行排序交易,避免重复交易。在跨链中,我们会根据chianid进行识别链的类型,比如以太坊主网的chainid是1,ETHW主网的chainid是10001。
对此,我们分析了OmniBridge相应的源码。我们查看一下OmniBridge验证chainid的逻辑,发现chainid的来源于unitStorage中存储的值,而不是通过操作码CHAINID直接读取的链上chainid。
unitStorage是合约EternalStorage中的状态变量,sourceChainId()函数所在的合约BasicAMB继承了BasicBridge和VersionableAMB。其中,BasicBridge陆续继承了合约EternalStorage。这里保存的chainid是预先存储好的,如果发生区块链的硬分叉而chainid又没有重新设置或者chainid人为设置有误,从合约层面上来说,由于不是通过操作码获取的chainid,不会正确验证跨链消息的实际chainid。这样的漏洞,容易被攻击者利用。
问题分析总结:主要是Omni使用的solidity版本是0.4.24,采用的是手动存储和更新chainid的方式,并未通过EIP-1344中规定的CHAINID操作码进行实际chainid获取。
三、安全建议
引发本次安全事件的原因是在PoW升级PoS过程中,OmniBridge对chainid未及时处理。导致过旧的solidity版本中,存在历史遗留问题。建议在后续项目迭代中,及时应对新问题,采取必要的代码优化措施。虽然Gnosis链上OmniBridge有每日最大转移代币数量限制250个WETH,但是依旧要保持警惕,以防止积少成多,造成更大的损失。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。