SHA:SharkTeam:十大智能合约安全威胁之重放攻击

重放攻击是把原链网络上的交易拿到目标链网络上使用

问:我们常提到的智能合约漏洞真的是实际中威胁最大、发生最频繁的安全漏洞吗?

答:完全不是那样。例如“溢出”、“外部调用”等常提到的智能合约安全漏洞并不是最常发生,威胁最大的。

到底哪些安全威胁从发生频率和危害性上能称为Top10的呢?SharkTeam合约安全系列课程之【十大智能合约安全威胁】和您一起讨论和深入。第十课【详解重放攻击】。

一、什么是重放攻击

重放攻击是把原链网络上的交易拿到目标链网络上使用,即一笔交易重复执行,我们根据类型可以分为交易重放和签名重放。

交易重放是将原链上的交易一成不变放到目标链上,重放过后交易在目标链上可以正常执行并完成交易验证。

Kusama启动第十二轮插槽拍卖,Picasso、CrustShadow等参与:10月25日消息,Kusama 上第十二轮插槽拍卖已于2021 年 10 月 5 日17:33左右启动,目前出价最高的是跨链虚拟机Composable的Kusama 先行网 Picasso,约 5.7 万枚 KSM。其他参与者包括波卡生态元宇宙Bit.Country的先行网 Bit.Country Pioneer、隐私计算项目Integritee Network、分布式存储协议 Crust 的先行网 Crust Shadow、物联网平台 Robonomics。[2021/10/25 20:55:43]

签名重放利用私钥签名的消息进行重放,重放过程中无需像交易重放那样去重放整个交易,而是重放相应的签名信息。

在实施EIP 155后,交易签名带有chainid,即链与分叉链之间的标识符。由于chainid不同,交易重放无法完成,签名重放可以间接完成。在以太坊完成分叉后,ETHW主网出现数起重放攻击事件,让我们回顾一下这些攻击事件前因后果。

BetaShares将推出追踪Coinbase等加密上市公司的ETF:10月13日消息,澳大利亚ETF提供商BetaShares将推出以加密行业上市公司为重点的交易所交易基金 (ETF),名为“etaShares Crypto Innovators ETF”,获得相关监管部门批准后,将在澳大利亚证券交易所 (ASX) 上以股票代码CRYP进行交易。该ETF将跟踪Bitwise加密行业创新者指数,该指数于5月推出,旨在获得在区块链和加密行业运营的顶级上市公司的敞口,包括Coinbase、Riot Blockchain、 MicroStrategy等。(Cointelegraph)[2021/10/13 20:26:01]

二、攻击事件分析

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:加密投资产品在过去六周持续流出,总流出价值接近1.15亿美元:8月17日消息,过去几周加密市场的零售需求快速增长,但机构兴趣自2021年7月以来一直处于下降趋势。根据CoinShares发布的最新数字资产每周资金流向报告,加密投资产品上周大约有超过2200万美元的资金流出,这是连续第六周流出。在过去的六周里,总流出资金价值接近1.15亿美元,这是自2018年1月以来持续时间最长的连续流出。(FinanceMagnates)[2021/8/17 22:19:27]

(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如下:

币安智能链DeFi项目AutoShark Finance被黑分析:据慢雾区消息,币安智能链(BSC)DeFi项目AutoSharkFinance被黑,导致代币价格闪崩。慢雾安全团队在第一时间跟进分析,并将结果以简讯的形式分享给大家,供大家参考。由于AutoShark策略池的机制,攻击者需要事先存入一定数量的LP代币到策略池中,为后续攻击做准备,所以整个攻击其实分成了2步,这里主要分析的是第2笔的攻击交易。攻击步骤如下:

1.攻击者从Pancake的WBNB/BUSD交易对中借出大量WBNB;

2.将第1步借出的全部WBNB中的一半通过Panther的SHARK/WBNB交易对兑换出大量的SHARK,同时池中WBNB的数量增多;

3.将第1步和第2步的WBNB和SHARK打入到SharkMinter中,为后续攻击做准备;

4.调用AutoShark项目中的WBNB/SHARK策略池中的getReward函数,该函数会根据用户获利的资金从中抽出一部分手续费,作为贡献值给用户奖励SHARK代币,这部分操作在SharkMinter合约中进行操作;

5.SharkMinter合约在收到用户收益的LP手续费之后,会将LP重新拆成对应的WBNB和SHARK,重新加入到Panther的WBNB/SHARK交易池中;

6.由于第3步攻击者已经事先将对应的代币打入到SharkMinter合约中,SharkMinter合约在移除流动性后再添加流动性的时候,使用的是SharkMinter合约本身的WBNB和SHARK余额进行添加,这部分余额包含攻击者在第3步打入SharkMinter的余额,导致最后合约获取的添加流动性的余额是错误的,也就是说SharkMinter合约误以为攻击者打入了巨量的手续费到合约中;

7.SharkMinter合约在获取到手续费的数量后,会通过tvlInWBNB函数计算这部分手续费的价值,然后根据手续费的价值铸币SHARK代币给用户。但是在计算LP价值的时候,使用的是PantherWBNB/SHARK池的WBNB实时数量除以LP总量来计算LP能兑换多少WBNB。但是由于在第2步中,Panther池中WBNB的数量已经非常多,导致计算出来的LP的价值非常高;

8.在LP价值错误和手续费获取数量错误的情况下,SharkMinter合约最后在计算攻击者的贡献的时候计算出了一个非常大的值,导致SharkMinter合约给攻击者铸出了大量的SHARK代币;

9.攻击者后续通过卖出SHARK代币来换出WBNB,偿还闪电贷。然后获利离开。[2021/5/25 22:41:58]

动态 | 美比特币犯Zoobia Shahnaz被判20年监禁:据dailymail报道,美比特币犯Zoobia Shahnaz被判20年监禁。据此前消息,去年,美国长岛的Zoobia Shahnaz被指控犯有银行欺诈罪、共谋罪等。一份新闻稿中显示,该名女子在网上申请了十多张信用卡,在网上购买了大约6.2万美元的比特币和其他数字货币。随后,她在巴基斯坦、中国和土耳其的C2C和数字货币交易平台中完成了数笔交易,总价值超过15万美元。这些交易的目的是为了避免交易报告的要求,掩盖非法获得的款项的身份、来源和目的地,并最终使ISIS受益。[2018/11/27]

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之道

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

金星链

[0:31ms0-0:917ms