SlowMist|2026年09月07日 08:02
2026年9月4日,知名去中心化借贷协议 @NotionalFinance 遭到攻击,损失约为 $1.73 百万美元。SlowMist 安全团队已对该事件进行了全面分析。
攻击流程:
1️⃣ 在前置交易中,攻击者部署了辅助合约,并在 ERC1155Trade 上调用了 setApprovalForAll 授权操作,同时查询了两个 CashMarket 到期时间和所需的 AssetIds。
2️⃣ 第一次 safeTransferFrom:铸造了一个金额为 1 的 fCash 对(到期日为 2026年9月4日)。由于头寸过小,在 ETH 计算中被四舍五入为 0,因此通过了自由抵押检查。
3️⃣ 第二次 safeTransferFrom:铸造了一个金额为 uint128.max 的 fCash 对(到期日为 2026年12月3日),因此两个负债不会被添加到同一个桶中,并在 SafeMath 下发生回滚。
4️⃣ mintfCashPair 随后检查了自由抵押。两个负债总和为 -2^128,在转换为 ETH 时溢出为 0,协议将账户视为健康状态。
5️⃣ 接收合约 2 将大额索赔拆分为两个辅助合约。付款方现在是合约 2,该合约已经持有正索赔,因此检查通过,两个合约接收了接收方的 fCash。
6️⃣ 在第二笔交易中,攻击者结算了这两个头寸,增加了 Escrow 中的现金余额,然后调用 withdraw 实现了利润。
⚙️ 根本原因:ExchangeRate._convertToETH 在 Solidity 0.6.x 上执行 uint128(balance.abs()) 时没有范围检查。当负债为 -2^128 时,2^128 被截断为 0,因此 mintfCashPair 仅看到自由抵押 ≥ 0,并允许了无担保头寸。
SlowMist 见解:成功的类型转换并不等于成功的估值。拒绝任何 abs() 结果超过 type(uint128).max,使用 SafeCast,并测试极值,例如 uint128.max 和 -2^128。抵押 ≥ 0 并不等于真实的抵押。
完整分析
https://slowmist.(medium.com)/the-vanishing-debt-an-analysis-of-the-notional-finance-hack-a79b00fa2e47
分享至:
脉络
热门快讯
APP下载
X
Telegram
复制链接