重放攻击是把原链网络上的交易拿到目标链网络上使用
问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?
答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。
到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第十课【详解重放攻击】。
一、什么是重放攻击
重放攻击是把原链网络上的交易拿到目标链网络上使用,即一笔交易重复执行,我们根据类型可以分为交易重放和签名重放。
交易重放是将原链上的交易一成不变放到目标链上,重放过后交易在目标链上可以正常执行并完成交易验证。
以太坊开发者:Shapella提款测试出现问题,但不会影响Shapella升级时间:金色财经报道,以太坊核心开发者Tim Beiko发推称,开发者Marius Van Der Wijden发现了一个公共测试网Shapellabug,该bug在空块(没有交易或取款)的完全同步期间出现,其他几个客户端也遇到了这个问题,不过,这个问题很容易测试,可以快速修补。团队认为这不会影响Sepolia升级的时间表,仍计划在2月28日12:00点进行。另外,Barnabas Busa更新了最新的对Shapella进行压力测试的提款Devnet。该Devnet有60万验证者,其中36万验证者在分叉时执行取款凭证更新。客户端看到RAM+CPU使用率激增的情况,devops团队将在未来几天监控开发网络,以查看有多少凭证更新消息被包含和丢失。该测试还揭示了Prysm<>Besu问题,其中Besu限制了它通过RPC发送的响应数量以防止DoS,但Prysm预期的响应数量高于Besu的当前限制。Besu团队目前正在调查此事。此外,开发者还计划进行另一次主网影子分叉,将在上面做一些Mev-Boost测试。2月10日以太坊基金会表示,Shanghai+Capella(Shapella)主网升级正在进入最后的预发布序列——公共测试网。Shapella包含许多功能,但对质押者和共识层来说最重要的是支持提款。退出的验证者可以全额取款,而活跃验证者余额超过32ETH的可以部分取款。另外,第一个长期存在的公共测试网Sepolia计划于2月28日进行升级。[2023/2/17 12:12:44]
签名重放利用私钥签名的消息进行重放,重放过程中无需像交易重放那样去重放整个交易,而是重放相应的签名信息。
JustSwap白名单项目SharkTron跑路,损失3.66亿至4亿枚TRX:DeFi项目SharkTron的开发者据称窃取1000万美元的TRX。社区指责SharkTron匿名开发者是退出局,已经卷走数亿枚TRX跑路。虽然具体的盗窃金额仍不得而知,但推特用户报告称损失3.66亿至4亿枚TRX(价值约1000万美元)。
波场基金会官方推特账户证实了此事,并已经联系币安共同追查罪犯者和被盗资金。虽然币安已经冻结一部分资金,但其他交易所也可能参与追讨这笔资金。该团队建议受害者向当地警察提交报告。
一些用户声称,SharkToken是波场去中心化交易所JustSwap的白名单项目。推特用户曾提醒波场创始人孙宇晨该项目的欺诈性质,甚至要求他屏蔽匿名开发人员的钱包。但是,孙宇晨没有理会这些警告。一些人甚至指责孙宇晨直接参与了这场局;然而,这些指控没有得到事实的证实。(FXStreet)[2020/11/10 12:12:07]
在实施EIP 155后,交易签名带有chainid,即链与分叉链之间的标识符。由于chainid不同,交易重放无法完成,签名重放可以间接完成。在以太坊完成分叉后,ETHW主网出现数起重放攻击事件,让我们回顾一下这些攻击事件前因后果。
区块链服务网络BSN将整合公链Algorand、ShareRing和Solana:区块链服务网络BSN发起公司之一红枣科技首席执行官何亦凡表示,BSN正在进行第二阶段的公链整合,将包括Algorand、ShareRing和Solana。何亦凡解释称,集成公链意味着我们在公共城市节点(PCN,BSN数据中心)上安装公链主网节点和测试网节点,开发人员可以通过一个网关访问所有公链中的所有节点,这使得连接公链的成本几乎为零。此前报道,BSN已集成以太坊、Nervos、Tezos、Neo、EOS、IRISnet等六个公链。(Cointelegraph)[2020/9/16]
二、攻击事件分析
2.1 Optimism
2022年6月9日消息,据Optimism与加密货币做市商 Wintermute 透露,2000万个Optimism代币被黑客盗取。重放攻击过程如下:
(1)5月27日,Optimism地址0x2501向Optimism/L2上的0x4f3a地址转账2000万OP,0x4f3a地址在Ethereum/L1上是Wintermute的多签合约地址,但此时在Optimism/L2上面并没有部署合约;
CoinShares研究主管:BTC达到4500美元时,矿工的平均现金流将转为负值:数字资产管理公司CoinShares研究主管Chris Bendiksen表示,随着比特币本月下跌近40%至5350美元,提供约三分之一算力的矿工们已经出现入不敷出。加密分析公司Messari的分析师Ryan Watkins表示:“人们原本预计在减半前后,BTC价格出现上涨,而现在的情况似乎恰恰相反。”Bendiksen表示,比特币的价格必须在7400美元左右才能实现矿工平均盈利。BTC价格在4500美元左右,矿工的平均现金流将转为负值。即便如此,许多人也不太可能马上关机,因为人们仍然在预期市场反弹。但如果这种情况没有发生,很多将在减半之后关机。Bendiksen进一步表示,那些主要使用新矿机的矿工的状况可能还不错,但上一代矿机就不太行了。如果BTC价格还是这样,减半之后就没救了。(彭博社)[2020/3/13]
(2)6月1日,黑客地址0x8bcf部署合约0xe714。
(3)6月5日,黑客通过重放Ethereum/L1上的交易创建了Gnosis Safe: Proxy Factory 1.1.1合约,其地址与Ethereum/L1上一样;然后地址0x60b2通过合约0xe714部署了多签合约0x4f3a,合约所有权归黑客所有,因此5月27日转入的2000万OP被黑客盗取。在Gnosis Safe: Proxy Factory 1.1.1合约中,其中创建代理合约函数createProxy如下:
声音 | Jake Chervinsky:ShapeShift添加KYC或因政府干预匿名货币:据CCN消息,近日ShapeShift首席执行官在其推特上宣布将在新启用的会员计划中引入强制信息采集(KYC)制度,该决定引发网友争论。美国政府执法辩护律师Jake Chervinsky对此进行了评论,他指出,此前Eric Vorhees提出将保护金融隐私并将个人账户信息从国家监管中分离出来,目前来看这是不可能的,此次KYC制度的增加表明美国财政部已经采取强制措施威胁ShapeShift。[2018/9/7]
Gnosis Safe: Proxy Factory 1.1.1合约使用的是0.5版本的Solidity,使用new来创建合约时使用的是create命令,而不是create2。使用create命令创建合约,合约地址是msg.sender以及nonce来计算的。在Ethereum/L1上面,创建多签合约0x4f3a的msg.sender就是Gnosis Safe: Proxy Factory 1.1.1的地址,黑客在Optimism/L2通过重放交易来创建于Gnosis Safe: Proxy Factory 1.1.1合约的主要目的就是为了保证在Optimism/L2上创建合约0x4f3a的msg.sender与在Ethereum/L1上一致,那么黑客可以很方便的通过智能合约(合约0xe714)调用createProxy函数来创建出地址是0x4f3a的合约。
(4)6月5日,多签合约0x4f3a在接收到2000万OP后,将100万OP转账给黑客地址0x60b2,然后将100万OP兑换成了720.7 Ether。
(5)6月9日,合约0x4f3a将其中的100万OP转账给了账户地址0xd8da, 其他的1800万OP仍然在合约0x4f3a中。
本次攻击根本原因是:交易重放、Solidity旧版本漏洞以及主链和侧链交易签名验证等综合因素
2.2 Omni
2022年9月18日,以太坊合并完成后,PoW链遭到PoS链上交易的重放攻击,根本原因是网桥未正确读取并验证区块链的chainid。攻击者首先通过Gnosis链的Omni跨链桥转移了200 WETH,然后在PoW链上重放了相同的消息,获得了额外的200 ETHW。
(1)PoS链交易hash:0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5
(2)PoW链交易hash:0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4
我们对比发现两笔交易访问的合约相同,并且inputdata完全相同,即调用了同一个合约的同一个函数并且参数相同,根据相同的方法签名ID 0x23caab49可知,黑客调用safeExecuteSignaturesWithAutoGasLimit函数。
在正常的交易中,我们通过nonce来进行排序交易,避免重复交易。在跨链中,我们会根据chianid进行识别链的类型,比如以太坊主网的chainid是1,ETHW主网的chainid是10001。
我们查看一下Omni Bridge验证chainid的逻辑,发现chainid的来源于unitStorage中存储的值,而不是通过操作码 CHAINID(0x46)直接读取的链上chainid。
unitStorage是合约EternalStorage中的状态变量,sourceChainId()函数所在的合约BasicAMB继承了BasicBridge和VersionableAMB。其中,BasicBridge陆续继承了合约EternalStorage。这里保存的chainid是预先存储好的,如果发生区块链的硬分叉而chainid又没有重新设置或者chainid人为设置有误,从合约层面上来说,由于不是通过操作码获取的chainid,不会正确验证跨链消息的实际chainid。
本次攻击根本原因是:主要是Omni使用的solidity版本是0.4.24,采用的是手动存储和更新chainid的方式,并未通过EIP-1344中规定的CHAINID(0x46)操作码进行实际chainid获取。
三、预防措施
针对重放攻击主要有以下几种预防的方法:
(1)可以在签名消息中加入chainid和nonce两个参数值,chainid用于识别链ID的标识符,nonce是交易次数计数值。
(2)记录签名是否使用过,比如利用mapping进行签名中对应参数映射为bool值,这样做可以防止签名多次使用。
(3)项目上线前,需联系专业的第三方专业审计团队进行审计。
来源:tuoniaox
鸵鸟区块链
媒体专栏
阅读更多
金色早8点
比推 Bitpush News
Foresight News
PANews
Delphi Digital
区块链骑士
深潮TechFlow
链捕手
区块律动BlockBeats
DeFi之道
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。