项目方遇见「打桩机」?被攻击约40次损失170万美元_PARA:bitmart交易所官网

2022年3月13日,成都链安链必应-区块链安全态势感知平台舆情监测显示,Paraluni合约遭受攻击,损失约170万美元,成都链安技术团队对此事件进行了相关分析。

#1总述

我们以第一笔攻击交易0xd0b4a1d4964cec578516bd3a2fcb6d46cadefe1fea5a2f18eec4c0a496e696f9为例:

地址列表

攻击地址:

0x94bC1d555E63eEA23fE7FDbf937ef3f9aC5fcF8F

BKEX Global已完成第二次BKK周回购销毁:据BKEX Global公告,BKEX Global已于2020年11月4日 11:02:57(UTC+8)完成第二次BKK周回购销毁。此次销毁195,659.49BKK ,目前总量为125,976,696.51BKK 。

平台币BKK是BKEX Global 战略部署中最重要的生态板块之一,团队每周都将平台币币交易手续费的70%在二级市场回购BKK进行销毁,并公示全部操作。详情请点击原文链接。[2020/11/4 11:36:58]

攻击合约:

BKEX Global将于今日17:30上线STPT:据BKEX Global公告,BKEX Global将于2020年8月31日17:30(UTC+8)上线STPT(Standard Tokenization Protocol),开放交易对:STPT/USDT。

STP是一个在通证层面上的开源标准,定义了在符合所有必要的相关法规前提下,通证资产如何被发行和转让。STP允许资产在各个国家地区以符合当地法规的方式实现资产通证化,且通证资产可在任意平台之间进行流通转让。[2020/8/31]

0x4770b5cb9d51EcB7AD5B14f0d4F2cEe8e5563645

BKEX Global BZRX申购结束:据BKEX官方消息,BKEX Global在Seed Incubator Pro开放的BZRX申购已于今日16:00结束,BZRX已发放至有效参与认购用户账户。

此次申购数量为555,555 BZRX,有效申购量为308,862,770 BZRX,认购系数为0.18%,超募556倍。

bZx协议是建立在以太坊区块链上的智能合约集合,专注于加密货币的贷款和保证金交易,BZRX代币作为治理代币作用于bZx平台。[2020/7/13]

ParaProxy:

神鱼发微博称Harvest Finance项目方做事“鸡贼”:鱼池创始人神鱼凌晨发微博称,“好好做事的团队一不小心被黑了发的债权还能值个2折(黄瓜),更有BFX被盗12万BTC的债权最后溢价回购了。但是拖拉机这个项目方呢处处流露出鸡贼,先是不肯拿出开发团队的部分奖励,威胁社区发提案的人;操纵分配给债权人farm比例,今天给自家债权GRAIN定价0.2折 ,四舍五入约等于0啊。”[2020/12/8 14:31:43]

0x633Fa755a83B015cCcDc451F82C57EA0Bd32b4B4

ParaImpl:

0xA386F30853A7EB7E6A25eC8389337a5C6973421D(MasterChef)

UGT:

0xbc5db89CE5AB8035A71c6Cd1cd0F0721aD28B508

UBT

0xcA2ca459Ec6E4F58AD88AEb7285D2e41747b9134

1.向CakeSwap(0x7EFaEf62)中通过闪电贷借贷224BSC-USD,224BUSD

2.把第1步借到的代币向Para-LP(0x3fD4FbD7)中添加流动性,并将获得的222枚流动性代币的接收地址指定为UBT(0xcA2ca459)地址,这一步是为了后续的重入做准备。

图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的存取记录。

#2总结建议

攻击者一共执行了约40次攻击,共获利约170万美元。截止发稿时,攻击者通过跨链协议将其转到以太坊网络中,并将其中的660枚ETH转入Tornado.Cash,另外5枚ETH转入了0xDd52CE617cAF1b7C8cEaCC111DE2f1c54E20C1b0地址。

本次攻击主要由合约代码中存在逻辑缺陷以及存在资金操作的关键函数未进行防重入导致。建议合约开发者在开发过程中进行完整的测试以及第三方审计,并养成使用Openzeppelin库的ReentrancyGuard合约来进行重入攻击的防范。

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

金智博客

[0:15ms0-2:554ms