2022年3月13日,成都链安链必应-区块链安全态势感知平台舆情监测显示,Paraluni合约遭受攻击,损失约170万美元,成都链安技术团队对此事件进行了相关分析。
#1总述
我们以第一笔攻击交易0xd0b4a1d4964cec578516bd3a2fcb6d46cadefe1fea5a2f18eec4c0a496e696f9为例:
地址列表
攻击地址:
0x94bC1d555E63eEA23fE7FDbf937ef3f9aC5fcF8F
攻击合约:
0x4770b5cb9d51EcB7AD5B14f0d4F2cEe8e5563645
安全公司:NFT项目方 Akutar项目存在两个漏洞,导致项目方3400 万美元被永久锁定:金色财经消息,4月23日消息,BlockSec发推表示,经过分析后发现,该项目存在两个漏洞。第一个漏洞是在ProcessRefunds的时候,攻击者可以利用恶意合约对项目进行拒绝服务,所有用户的退款都会被拒绝。幸运的是这个漏洞没有被利用。第二个漏洞是在项目方取款的时候,由于一个变量名写错,导致项目方取款的条件永远不会满足,而该合约是不可以升级合约,因此项目方价值3400万美金的资金被永远锁定。[2022/4/23 14:43:44]
ParaProxy:
0x633Fa755a83B015cCcDc451F82C57EA0Bd32b4B4
ParaImpl:
Geth客户端开发者提出解决客户端多样性问题的小众客户端项目方案:10月24日消息,针对Eth2因缺乏客户端多样性会出现的问题,Geth客户端的Péter Szilágyi提出了一个技术解决方案。以太坊有多个客户端实现,但Geth / go-ethereum作为一个多数客户端脱颖而出,拥有80%~90%网络占有率。其目标是成为共识层和执行层客户端之间的通信层,使得任何人都可以运行多个客户端 (多数的、小众的和组合),并且在接受一个状态变换 (无论是一个执行结果或要给共识更新) 之前达成一个 N/M 的共识。在共识层和执行层客户端间的高级通信层有一个额外的好处,就是能够对各种客户端统一收集和报告行为指标;并有可能在它们失控,导致网络中断之前检测到操作降级问题。[2021/10/24 6:10:42]
0xA386F30853A7EB7E6A25eC8389337a5C6973421D(MasterChef)
动态 | Layer2 项目Matic短时暴跌 70% 项目方近期将1.6亿代币转出基金会:币安Launchpad项目Matic Network于12月10日早上发生异常下跌,在8点30-9点30分之间,其代币从0.04美元暴跌至0.015美元,跌幅超过 70%。在此之前,Matic基金会合约地址曾大量转出代币,根据Etherscan数据查看,项目方在最近30天内一共从基金会合约内转出了1.6亿枚 MATIC代币,其中部分代币充入了币安交易平台。[2019/12/10]
UGT:
0xbc5db89CE5AB8035A71c6Cd1cd0F0721aD28B508
UBT
0xcA2ca459Ec6E4F58AD88AEb7285D2e41747b9134
动态 | 12月项目方提币近40万枚ETH,创年内新高:据Diar对100个ICO项目的以太坊钱包的监控显示,随着ETH价格较年初下跌85%,项目方提币活动日趋活跃。12月项目方提币共计390,848枚ETH,创下年内新高。其中,Filecoin(FLT)为12月提币数量最多的项目方,提币数量为20万ETH。截止目前,ETH钱包余额为3,085,376 ETH。总体来说,从今年年初开始,24%的钱包已经从Diar评估的前100个钱包列表中移除。
据此前消息,Diar报告显示,11月项目方提币32万个左右。其中提币数最多的项目方为tezos( 8万枚),第二为aragon (5万枚)。截止当时,以太坊钱包剩余340万枚ETH。[2018/12/21]
1.向CakeSwap(0x7EFaEf62)中通过闪电贷借贷224BSC-USD,224BUSD
动态 | ICO项目方本月提币32万枚ETH:据区块链研究公司Diar的数据,对100个ICO的以太坊钱包的监控显示,本月项目方提币32万个左右,是今年以来提币数最多的一个月。其中本月提笔数最多的项目为tezos(XTZ) 8万枚,第二的是aragon (ANT)5万枚,目前钱包剩余340万个ETH。[2018/11/29]
2.把第1步借到的代币向Para-LP(0x3fD4FbD7)中添加流动性,并将获得的222枚流动性代币的接收地址指定为UBT(0xcA2ca459)地址,这一步是为了后续的重入做准备。
图1初始准备
3.攻击合约(0x4770b5cb)调用ParaProxy合约的depositByAddLiquidity函数,添加流动性代币抵押挖矿,此处传入的pid为18,对应的Para-LP(BSC-USD/BUSD)0x3fD4FbD7a83062942b6589A2E9e2436dd8e134D4,但是token0,token1传入的地址为UGT、UBT的地址,数量为1e18。
图2重入攻击
4.此处原本正常的逻辑为:添加流动性,并将流动性代币存入pid为18的流动性抵押池,但是本函数在代码中并未检查添加的流动性token0、token1得到的流动性代币是否与pid对应的流动性代币地址一致,导致了攻击的发生。注意,并不是所有的流动性池抵押都有该风险,由于第2524行代码,pool的ticket需要为零地址才能够通过该检查。
但是攻击者通过控制执行逻辑,实际执行的逻辑为:第2505,2506行将攻击者指定的1枚UGT、1枚UBT代币转入ParaProxy合约。然后在第2535行代码用于添加流动性,并在第2537行检查添加的流动性代币数量。
此时,vars.oldBalance为初始流动性代币数量。攻击者为了通过第2537行的检查,在添加流动性的过程中,进行了重入攻击。由于在添加流动性时调用了攻击者构造的恶意代币的transferFrom函数,攻击者在transferFrom函数中才将流动性通过deposit函数存入ParaProxy合约。这也是第2步时攻击合约将流动性代币接收地址指定为UBT合约的原因所在。
在重入过程中,UBT合约存入了真正的LP代币222枚,并计入ParaProxy的账本中。在重入完成后,ParaProxy合约地址新增了222枚LP代币,ParaProxy合约将其视为攻击合约添加的LP,并计入账本中。至此,UBT合约和攻击合约都新增了222枚LP的存取记录。
图3ParaImpl合约相关代码
重入相关过程如下图所示:
图4攻击流程示意图
5.UBT合约和攻击合约分别调用withdraw函数,从ParaProxy合约提取221枚LP,并归集到攻击合约,由攻击合约将LP移除流动性并获取对应的BSC-USD以及BUSD
6.归还闪电贷225枚BSC-USD,225枚BUSD,并将获利的221枚BSC-USD、225枚BUSD发送到攻击者地址。整个攻击交易执行完成。
#2总结建议
攻击者一共执行了约40次攻击,共获利约170万美元。截止发稿时,攻击者通过跨链协议将其转到以太坊网络中,并将其中的660枚ETH转入Tornado.Cash,另外5枚ETH转入了0xDd52CE617cAF1b7C8cEaCC111DE2f1c54E20C1b0地址。
本次攻击主要由合约代码中存在逻辑缺陷以及存在资金操作的关键函数未进行防重入导致。建议合约开发者在开发过程中进行完整的测试以及第三方审计,并养成使用Openzeppelin库的ReentrancyGuard合约来进行重入攻击的防范。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。