前语

北京时间 2022 年 5 月 16 日,知道创宇区块链安全实验室监测到多链 DeFi 协议 FEG 遭到闪电贷进犯,进犯者盗取 144 ETH 和 3280 BNB,损践约 130 万美元。

5 月 17 日,多链 DeFi 协议 FEG 再次遭到进犯,进犯者盗取 291 ETH 和 4343 BNB,损践约 190 万美元,其间 BSC 130 万美元,以太坊链 60 万美元。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

分析

该协议在 BSC 和 Ether 上都被进犯了,下面的图分别是两链上的进犯事情买卖哈希。本次进犯事情主要原因是 swapToSwap() 函数中 path 地址可被进犯者操控。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

基础信息

进犯合约:0x9a843bb125a3c03f496cb44653741f2cef82f445

进犯者地址:0x73b359d5da488eb2e97990619976f2f004e9ff7c

漏洞合约地址:

BSC: 0x818e2013dd7d9bf4547aaabf6b617c1262578bc7

Ether: 0xf2bda964ec2d2fcb1610c886ed4831bf58f64948

进犯 tx:

BSC:0x77cf448ceaf8f66e06d1537ef83218725670d3a509583ea0d161533fda56c063

Ether:0x1e769a59a5a9dabec0cb7f21a3e346f55ae1972bb18ae5eeacdaa0bc3424abd2

进犯流程

1.进犯者 0x73b3 调用事先创立好的进犯合约 0x9a84 从 DVM 中闪电贷借出 915.842 WBNB,接着将其间的 116.81 WBNB 兑换成 115.65 fBNB。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

2.进犯者 0x73b3 经过进犯合约 0x9a84 创立了 10 个合约以便后边利用漏洞。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

3.进犯者 0x73b3 将第一步中兑换得到的 fBNB 经过函数 depositInternal() 抵押到 FEGexPRO 合约 0x818e 中。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

4.进犯者 0x73b3 调用 depositInternal() 和 swapToSwap() 函数使得 FEGexPRO 合约 0x818e 授权 fBNB 给第二步创立好的合约,重复屡次调用授权 fBNB 给创立的 10 个合约。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

5、因为上一步中现已将进犯者 0x73b3 创立的 10 个合约都已授权,进犯者用这些已被授权的合约调用 transferFrom() 函数将 FEGexPRO 合约 0x818e 每次转走 113.452 fBNB。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

6、进犯者 0x73b3 又从 PancakePair 的 LP 买卖对 0x2aa7 中借出 31217683882286.007 的 FEG 和 423 WBNB 并重复上面的 第三步、第四步和第五步,终究取得 。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

7、最后偿还闪电贷,将上面进犯取得的一切 WBNB 转入进犯合约 0x9a84 中。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

细节

检查 FEGexPRO 合约,咱们能看到 depositInternal() 函数和 swapToSwap() 函数的具体逻辑。其间 depositInternal() 函数进行质押,用户的余额遭到合约当时代币余额的影响,第一次进犯者正常质押后 balance 也正常增加,而因为当时合约代币余额没变,后边的质押只需要传入最小值调用即可。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

经过调用 swapToSwap() 函数传入歹意的 path 地址参数,当时合约代币余额并不会遭到影响,IERC20(address(Main)).approve(address(path), amt); 这样就能给 path 地址进行当时合约 fBNB 的授权。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

进犯者经过重复调用 depositInternal() 和 swapToSwap()就能够让 FEGexPRO 合约将 fBNB 重复授权给进犯者传入的歹意合约 path 地址。其他地址转走的代币数量便是进犯者第一次质押的代币数量减去手续费的数量。经过检查 Debugger 中的信息,咱们能够发现传入的 path 地址参数都是进犯流程中创立的合约地址。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

后续

在 16 日的进犯之后,次日进犯者又进行了一次进犯,但更换了进犯地址。

进犯合约:0xf02b075f514c34df0c3d5cb7ebadf50d74a6fb17

进犯者地址:0xf99e5f80486426e7d3e3921269ffee9c2da258e2

漏洞合约:0xa3d522c151ad654b36bdfe7a69d0c405193a22f9

进犯 tx:

BSC:0xe956da324e16cb84acec1a43445fc2adbcdeb0e5635af6e40234179857858f82

Ether:0c0031514e222bf2f9f1a57a4af652494f08ec6e401b6ae5b4761d3b41e266a59

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

因为 R0X 漏洞合约 0xa3d5 未开源,咱们试着从 Debugger 中进行分析,发现和第一次的进犯流程相似,但还用了 BUY() 辅佐存入和 SELL() 函数进行辅佐提取。

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

两天内遭遇两次攻击  DeFi 协议 FEG 真的伤不起

总结

该次进犯的主要原因是未验证 swapToSwap() 函数中 path 地址参数,导致能够被进犯者恣意传入使得 FEGexPRO 合约将自身代币授权给进犯者传入的一切歹意 path 地址。建议合约在开发时要对一切传入的参数进行校验,不要相信进犯者传入的任何参数。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注