背景介绍
我们监控到 base 链上的一起攻击事件,
https://basescan.org/tx/0x619c44af9fedb8f5feea2dcae1da94b6d7e5e0e7f4f4a99352b6c4f5e43 a4661
攻击者通过此次攻击共获利310570 USDC和10 cbETH,共约合35 万美金。
被攻击项目为SumerMoney,SumerMoney 是一个基于 Compond 修改的借贷协议,用户可以通过提供流动性来获利。SumerMoney 共支持的 underlying assets 有 ETH, USDC, USDbc, DAI, wstETH, cbETH, suUSD, suETH。其中,每一个 underlying asset 对应一个借贷池 poll。用户可以通过和借贷池 poll 交互来完成对应的操作。
攻击及事件分析
首先,攻击者通过攻击合约 1 从 Balancer 中利用 flashloan 借了645000 USDC 和150 ETH 。
随后,攻击合约 1 创建了另一个攻击合约(攻击合约 2),并将 Balancer 中借来的645000 USDC 转入新的攻击合约 2 中,并转入了1 wei 。
接着,在攻击合约 2 的攻击函数中,攻击者将645000 USDC通过mint 兑换为643630 sdrUSDC 。
随后,攻击者再通过 borrow 从 sdrETH pool 中借出 150.358797170664290045 ETH 。并向 sdrETH pool 中转入150.358797170664290046 ETH执行 repayBorrowBehalf 进行还款。
repayBorrowBehalf 的具体实现如下:
我们可以看到,合约会将超出总借款的部分再转回给用户。由于,sdrETH pool 收到了150.358797170664290046 ETH ,但是只借出了150.358797170664290045 ETH ,所以会将0.000000000000000001 ETH再转给攻击合约 2。由于接到了 ETH 转账,攻击合约 2 触发了fallback函数,fallback 函数中又调用了攻击合约 1,再次进行 borrow 和 redeemUnderlying 。
我们注意到,攻击者 redeem 150 ETH 只需要74.99998941541294 sdrETH(本应是 150 sdrETH )。
接下来,我们看一下合约是如何计算sdrToken和underlying token的兑换比例。
由上面的公式,我们可以知道兑换的 underlying token 为对应的 sdr token 除以 exchangRate 。由下面的公式同样可以知道exchangeRate的计算方式。
其中totalCash是由以下函数计算
那么,漏洞其实就比较明显了。mint 、 borrow 、 redeem 、 repay 这些操作均应该是原子操作。但是,repayBorrowBehalf出现了一个重入漏洞,攻击者通过构造一个特殊的金额( borrowsAmount + 1 wei )。sdrETH 将多余的1 wei重新发送给攻击者合约,从而触发了攻击合约 2 的fallback函数,在 fallback 函数中(在 ETH 转入时,exchangeRate 已经增长了 1 倍,攻击者手中的 sdrToken 的价值增加了一倍),攻击者进行重入攻击,调用借贷函数,借出了其他资产。最后,还清 SumerMoney 和 Balancer 的借贷,攻击完成。
END
往期回顾
点击阅读全文 立刻直达官网
/www.noneage.com/
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。