北京时间2024 年 1 月 3 日,Arbitrum 上的 Radiant 协议受到闪贷攻击。黑客对 #Radiant 协议进行了 3 次攻击,总共损失了 1902枚 ETH(价值 450 万美元)。根本原因是在新的 $USDC 市场上,放大和利用了“burn”函数中的数学舍入问题,使得黑客可以提取额外的 $USDC。
?
MetaTrust Labs对这次攻击进行了深入的研究和分析,揭示了黑客如何利用漏洞发起攻击。
?
Radiant 是一种去中心化、非托管借贷协议,在多个链上运行,包括 Arbitrum、BNBChain 和以太坊。
攻击发生后,Radiant 协议锁定的总价值仍然有 3.13 亿美元,这是因为项目方被攻击后迅速暂停了协议,阻止了进一步的损失。
3 笔攻击交易导致总计损失超 1902 枚 ETH,价值超 450 万美元。截稿时,1902枚 $ETH 仍然保存在黑客的钱包中(0x826d5f4d8084980366f975e10db6c4cf1f9dde6d)。
攻击步骤
以第一笔攻击交易0x1ce7e9a9e3b6dd3293c9067221ac3260858ce119ecb7ca860eac28b2474c7c9b为例。
1. 通过闪贷功能从AAVE借入300万美元USDC;
2. 存入2M $USDC至Radiant Pool,此时liquidityIndex为1e27
3. 在 Radiant Lending Pool 上进行 200 万美元的闪贷,将liquidityIndex放大到 1.8e36。
4. 重复执行步骤3,151 次,将liauidityIndex 放大至2.7e38,即初始值的270000000000倍。
5. 从 Radiant Pool 借入 90.6 $ETH,价值 $215K,这就是这次攻击的利润;
6. 创建新合约(0xd8b591);
7. 批准对新合约无限额度的 USDC,将 543K $USDC 转入新合约,并使用新合约执行以下步骤;将 543K $USDC 转入新合约,并使用新合约执行以下步骤;
8. 充值543K $USDC到Radiant池中,铸造2 wei的代币,因为amountScaled为2的代币,543600000002*1e27/271800000000999999999999998631966035920=2;
9. 从Radiant池中提取407K $USDC,仅燃烧1 wei的代币,因为amountScaled为1,407700000000*1e27/271800000000999999999999998631966035920=1.5以及数学舍入问题。请注意,amountScaled 是一个 uint256 类型变量,它将把 1.5 转换为 1。
10. 存入 271K $USDC 到 Radiant 池中,铸造 amountScaled 为 1 的代币,因为 271800000001*1e27/271800000000999999999999998631966035920=1?
11. 从Radiant池中提取407K $USDC,仅销毁amountScaled为1的代币。
12. 重复步骤 10 和 11 最多 18 次,并从新市场中耗尽黑客之前存入新市场的 $USDC。
13. 将 2 $WETH 兑换为 4.73K $USDC,将 3.23K $USDC 兑换为 1.36 $WETH。
14. 以 350 万美元 USDC 作为本金和 1.5 万美元 USDC 作为费用,偿还 AAVE 的闪贷。
15. 获得 90 美元 ETH 的利润。
根本原因
根本原因在于,黑客是第一个与 新创建的原生 USDC 市场进行交互的人,利用 Radiant 协议的闪电贷功能放大liquidityIndex,并利用数学舍入问题窃取借贷池中的资产。
黑客如何利用漏洞发起攻击。