7 月 6 日,以太坊网络的 DeFi 收益聚合协议 Summer Finance 受到闪电贷攻击,损失超过 600 万美元。以下是 Beosin 安全团队对此次复杂攻击的详细分析与被盗资金流向追踪。
攻击交易哈希:0x0db528c44f23fc7fa4544684a2fab81096450a14aae8bc89f42cd0592d43da12
攻击者地址:0x7bf716167b48cf527725722c6d79494b45b3bdca
攻击合约地址:0x0514F827C129C16418a0933E03C99A6AF982FC61
被攻击的合约地址:
0x98C49e13bf99D7CAd8069faa2A370933EC9EcF17
0xE9cDA459bED6dcfb8AC61CD8cE08E2D52370cB06 0xA9ca4909700505585B1aD2a1579dA3b670FFA9c4
金库结构分析:
用户存入 FleetCommander 的 USDC 存放于 BufferArk,然后被分配至各个 Ark,每个 Ark 封装一个外部收益来源:ERC4626Ark 封装通用 ERC-4626(如 sUSDS),MorphoVaultArk / MorphoV2VaultArk 封装 Morpho MetaMorpho / Vault V2,SiloManagedVaultArk 封装 Silo SiloVault。
FleetCommander.totalAssets() 是每个 ark 的 totalAssets() 之和,它是通过在存入 / 赎回开始时对每个 ark 进行快照进行计算。赎回首先从 buffer 开始,然后由 arks 提供,但上限为 maxRedeem = convertToShares(withdrawableTotalAssets()),即按流动性价值计算,而非账面价值。而本次被攻击的根本原因在于 Ark 将捐赠的、缺乏流动性的份额计入资产。
function totalAssets() public view override returns (uint256 assets) { uint256 shares = vault.balanceOf(address(this));
if (shares > 0) assets = vault.convertToAssets(shares);
以上代码存在两个缺陷:
FleetCommander 存入 / 追踪的份额与 Ark 地址中实际持有的份额之间没有任何对账机制。仅仅通过 ERC20.transfer 将底层份额转入一个 Ark,就会立即抬高该 Ark 的 totalAssets(),从而抬高 FleetCommander.totalAssets() 及其份额价格。
convertToAssets 报告的是 NAV 市场价值,即使底层金库无法兑现提现(maxWithdraw = 0)。捐赠的价值被全额入账,但实际不可赎回。
FleetCommander.deposit 和 redeem 均可在同一笔交易中调用,且各自获取全新的 NAV 快照。这使得攻击者可以在捐赠前以低价铸造份额,在捐赠后以高价销毁份额。
准备阶段:归集“Varlamore USDC Growth”金库份额代币,这些代币之后会在攻击交易中被捐赠给金库的 Silo Ark,以抬高金库的净值。
交易哈希:0x92d2e2e52d86e580b9dd40af737ed7671665753d96fed5143b4589eaf019dede
攻击阶段:
(1) 攻击者利用 Morpho 的闪电贷借入 65,419,171.87999 USDC 和 1,000,000 USDT
(2) 攻击者将约 6480 万 USDC 存入金库 Lazy Vault Lower Risk USDC(LVUSDC),以每股约 1.0665 USDC 的真实价格铸造股份。
(3) 他们通过将估值过高的外部资产(Silo Varlamore USDC Growth 代币)转移到 Silo Ark 中,人为地抬高了净值。
(4) 随后,他们以当时已上涨至约 1.1678 USDC/ 股的价格赎回了股份,获得约 7100 万 USDC。这笔资金来自金库的实际流动资产(缓冲资产加上流动 Morpho、Spark 和 Sky Arks),也就是其他存款人的资金。攻击结束后,金库大部分流动性被攻击者提取,其中只剩下被捐赠的、无法变现的 SiloVault 份额。
攻击得手后,攻击者收到 $6.01M DAI。7 月 8 日,约 114 万 DAI 被兑换成 ETH。其中 634.92 ETH 被转移至地址 0x46e09c4d4d20c0474598b4d2ffdd08bdf416eba7,当日总共 600 ETH 被转移到 Tornado Cash。
7 月 9 日,地址 0x46e09 继续向 Tornado Cash 转移 100 ETH。目前,约 487 万 DAI 仍存放在地址 0x7bf716167b48cf527725722c6d79494b45b3bdca。
分析地址 0x7bf7 此前的资金来源,其 ETH 资金来源于 FixedFloat,随后通过 Stargate Finance 跨链协议将资金从 Arbitrum 跨至 Ethereum,静默 2 个月后在 7 月 6 日发起了闪电贷攻击。资金流向图如下所示:
这是一次非常复杂的闪电贷攻击,其根本漏洞在于金库在计算资产价值时假设 / 默认可被捐赠操纵且无视流动性。对于类似的金库代码,项目方需检查每个金库是如何计算资产价值的,它是否会被简单的代币转账 / 捐赠操纵,是否对缺乏流动性的底层资产进行折价,以及存入和赎回是否可在同一区块内组合。
Beosin 作为全球最早一批从事形式化验证的区块链安全公司,主打”安全 + 合规“全生态业务,在全球 10 多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控与阻断、被盗追回、虚拟资产反洗钱(AML)以及符合各地监管要求的合规评估等“一站式”区块链合规产品 + 安全服务。欢迎点击公众号留言框,与我们联系。
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。
