MIS:2000 万 OP 代币被盗关键:交易重放

背景

6月9日,Optimism与Wintermute双双发布公告,向社区披露了一起2000万OP代币丢失的事件。Optimism委托了Wintermute来为OP在二级市场上提供流动性服务,同时将向Wintermute提供2000万枚OP代币。为了接收这笔代币,Wintermute给了Optimism一个多签地址,在Optimism测试发送了两笔交易且Wintermute确认无误后,Optimism将2000万OP转移到了该地址。在Optimism转完币之后,Wintermute却发现自己没办法控制这些代币,因为他们所提供的多签地址暂时只部署在了以太坊主网上,尚未向Optimism网络部署。Wintermute立即启动了补救操作,但已有攻击者察觉到了这一漏洞,并抢在Wintermute之前将多签部署到了Optimism网络的该地址之上,成功控制了这2000万代币。那么问题来了,为什么会出现这种漏洞?

BTC突破47200美元关口 日内跌幅为3.64%:火币全球站数据显示,BTC短线上涨,突破47200美元关口,现报47200.27美元,日内跌幅达到3.64%,行情波动较大,请做好风险控制。[2021/5/16 22:07:49]

前置知识

首先需要确定交易签名是否符合标准,符合标准的签名会对9个RLP编码元素(nonce,gasprice,gas,to,value,data,chainid,0,0)进行哈希,其中包含了chainid,因此符合标准的签名v值就为{0,1}+chainid*2+35。而对不符合标准的签名,其只对6个元素进行哈希(nonce,gasprice,gas,to,value,data),因此签名后v值为{0,1}+27。而不同的链会定义有不同的chainid,不同的chainid会得到不同的v值。根据ECDSA我们知道在v值不同的情况下,就算r与s值相同,签名所还原出的公钥也是不同的。因此对于符合标准的交易是无法在其他链上成功进行重放的。

BTC跌破34200美元关口:火币全球站数据显示,BTC短线下跌,跌破34200美元关口,现报34195.35美元,日内跌幅达到8.72%,行情波动较大,请做好风险控制。[2021/1/17 16:23:11]

值得一提的是在以太坊伦敦升级时实施的引入了新的交易格式0x02||RLP(),chainid是单独编码的,而不包含在签名v值中了,签名v值只是作为一个简单的奇偶校验位,因此当前交易签名得到的v值变为0或1。

交易重放

在我们了解完以上交易签名构造后我们就可以很清晰的知道签名v值为27或28是可以在不同链上被重放的。那么该如何在不同链上进行重放呢?这与我们发送交易并无不同,只需要将原始交易内容再其他链上进行发送即可。

1200枚BTC从Bitstamp交易所转出 价值1260.8万美元:据WhaleAlert数据显示,北京时间10月03日22:46, 1200枚BTC从Bitstamp交易所转入3BMEXK开头地址,按当前价格计算,价值约1260.8万美元,交易哈希为:eec7ecfce96754f61ca9c0e6404027d8c268cde88b954027fac9a1f1ac7ad585。[2020/10/4]

以Wintermute2000万个OP代币被窃取事件为例,攻击者在此次事件中重放了GnosisSafe部署Factory合约的交易。我们在这里尝试重放GnosisSafeDeployer3的nonce为3的交易。

一种较为简单的方法是先通过Etherscan获取原始交易:

行情 | LTC哈希率达到近两个月高点 升至200TH/s以上:据BitInfoCharts数据显示,LTC哈希率达到近两个月高点,升至200TH/s以上。尽管LTC的市值从峰值下降了85%(约41美元),其网络安全也只下降了30%。[2019/2/14]

然后直接通过Optimistic的eth_sendRawTransaction

(https://eth.wiki/json-rpc/API)接口进行发送即可。

若无法直接获取到原始交易内容,我们可以先通过eth_getTransactionByHash

(https://eth.wiki/json-rpc/API)接口获取交易内容。

再对交易内容进行RLP编码后得到原始交易内容:

然后再通过Optimistic的eth_sendRawTransaction

(https://eth.wiki/json-rpc/API)接口进行发送即可。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:0ms0-0:999ms