2022年5月15日,UTC时间约晚上8:20,我们的监控系统检测到FEGtoken项目中的FEGexPRO合约遭到黑客攻击。 攻击者在ETH和BSC主网上发起了一系列攻击,涉及的总价值累积约130万美元(根据项目方发送的链上消息)。
The paramter `path` in your FEGexPRO contract (0x818E2013dD7D9bf4547AaabF6B617c1262578bc7) should be checked in advance ! Our monitor system just reports an attack against the FEGexPRO contract, which lost its fBNB and FEG. pic.twitter.com/A4obANAMhW
— BlockSec (@BlockSecTeam) May 16, 2022
有关此事件的更多信息可以在该项目的官方Twitter上找到。 在本报告中,我们将深入探讨细节,揭示此次事件的根本原因。
0x1 漏洞分析:初步观察
易受攻击的FEGexPRO合约部署在ETH和BSC上,易受攻击的合约函数是swapToSwap,如下所示:

正如在社交媒体上指出的那样,swapToSwap函数第一个名为path的参数可以由函数调用者指定。因此,攻击者可以利用它进行任意授权(参见swapToSwap函数第682行)。
到目前为止,这并没有什么新东西,因为它又是参数未经验证的又一个案例。然而,攻击路径表明,仅归因于任意授权无法清楚地说明这次攻击。事实上,存在一个微妙的技巧,这才是事情变得有趣的地方。
0x2 攻击分析
0x2.1 初步攻击分析
我们以BSC上的一次攻击交易为例来说明攻击过程,相应的攻击路径,目标资产为fBNB,总结如下:

- 步骤1:准备资金和假
path。攻击者从DVM借入约915 BNB的闪电贷,并将其中一部分兑换成116 fBNB。然后,攻击者创建了一堆将被用作假path的合约。 - 步骤2:存入初始资金。通过将115 fBNB存入FEGexPRO合约,攻击者增加了其在受害者合约中的
balances2。 - 步骤3:执行任意授权。攻击者随后调用
swapToSwap函数,并将一个假的path作为第一个参数传入,导致FEGexPRO合约批准path花费114 fBNB。 - 步骤4:通过调用
depositInternal函数和swapToSwap函数进行另一项授权。FEGexPRO合约又批准了一个path花费114 fBNB。
攻击者反复执行步骤4以进行更多授权。最后,攻击者使用已授权的假path耗尽FEGexPRO的所有fBNB,并兑换部分BNB用于偿还闪电贷。
显然,我们可以轻松地看出,合约绝对应该检查path参数。
然而,要完全理解这次攻击,还需要解决一个问题:即使FEGexPRO合约批准了假的path,approve操作是基于用户balances2会立即减少(swapToSwap函数第684行)这一事实,即已授权的资金来自步骤3中确切存入的金额。换句话说,攻击者只是将自己存入的资金授权给了假的path。在此之后,由于balances2的减少,攻击者不应该为其他假的path进行授权。
因此,问题 arises:攻击者到底用了什么技巧来进行其他授权以获取额外利润?
0x2.2 高级攻击分析
为了回答这个问题,我们回到swapToSwap函数。
仔细检查代码后,我们发现这里使用的技巧不仅是假的path,还有一个假的swap,这导致了受害者合约余额的实际值与记录值之间存在不一致。因此,这种不一致性可以用来通过调用depositInternal函数来恢复攻击者的存款金额,从而反复进行授权。
具体来说,depositInternal函数主要根据合约的Main.balanceOf与_totalSupply2之间的差值来修改用户的balances2(depositInternal函数第651行)。

由于传递给swapToSwap的path地址是一个由攻击者控制的假path,实际上并没有发生任何转账。因此,Main.balanceOf的返回值与步骤3中的情况保持不变。请注意,_totalSupply2在swapToSwap函数中已经被减少了,只要攻击者进行存款,增加的balance2将不可避免地大于实际存入的金额。
因此,在步骤4中,攻击者首先通过调用depositInternal函数来恢复存款金额,然后通过调用swapToSwap函数执行授权和假的swap。
请注意,攻击者使用的存款金额仅为几乎0(即1 / 1e18)fBNB,因此depositInternal函数将攻击者的balances2恢复到与步骤3中几乎相同的金额(正如下一个授权的追踪所示)。

攻击者可以通过反复执行步骤4来扩大收获。
最后,值得注意的是,我们上面描述的攻击只是攻击者利用的攻击路径之一。就在同一次攻击交易中,攻击者还瞄准了FEG资产:

0x3 根本原因
在此,我们总结了此次攻击的根本原因:
- 首先,
swapToSwap函数中未经验证的参数导致了任意授权。 - 其次,由于
swapToSwap函数中的假swap,导致受害者合约余额的实际值与记录值之间存在不一致。这被用来通过恢复攻击者的存款金额来反复进行授权。
将两者结合起来,攻击者成功地从受害者合约中耗尽了所有资金。
0x4 其他相关攻击
截至本报告撰写之时,我们还观察到另一名攻击者发起的更多相关攻击。
ROX(https://t.co/NWvSy5faY3) is not open-sourced, but something is wrong.
— BlockSec (@BlockSecTeam) May 17, 2022
Take a look at the following transaction:https://t.co/chPxcDoFOD@Mudit__Gupta
同样,在以太坊和BSC上部署的合约都遭到了攻击。 有趣的是,攻击路径与我们刚才讨论的有所不同。尽管受害者合约并未开源,但我们高度怀疑攻击者利用了相同的漏洞,并采用了类似的攻击方法。
0x5 启示
使DeFi项目安全并非易事。除了代码审计,我们认为社区应采取主动措施来监控项目状态,并在攻击发生之前进行阻止。
关于BlockSec
BlockSec是一家开创性的区块链安全公司,由一群全球杰出的安全专家于2021年创立。公司致力于为新兴的Web3世界增强安全性和可用性,以促进其大规模采用。为此,BlockSec提供智能合约和EVM链安全审计服务,用于安全开发和主动阻止威胁的Phalcon平台,用于资金追踪和调查的MetaSleuth平台,以及供Web3开发者在加密世界高效冲浪的MetaDock扩展。
迄今为止,该公司已为MetaMask、Uniswap Foundation、Compound、Forta和PancakeSwap等300多家知名客户提供服务,并在两轮融资中获得了来自Matrix Partners、Vitalbridge Capital和Fenbushi Capital等知名投资者的数千万美元。
官方网站:https://blocksec.com/ 官方Twitter账号:https://twitter.com/BlockSecTeam



