在过去一周(2026/08/03 - 2026/08/09),以下 2 起重大安全事件被重点收录,涉及总损失约 160 万美元。
| 日期 | 事件 | 类型 | 预估损失 |
|---|---|---|---|
| 2026/08/03 | LpdFi | 价格操纵 | ~$697K |
| 2026/08/03 | Moke Token | 价格操纵与记账错误 | ~$906K |
- LpdFi 被选中,因为它揭示了使用可操纵的 AMM 储备同时用于仓位估值和利息赎回的系统性风险。攻击者首先通过现货价格操纵虚增了记录的本金,随后通过直接捐款和
sync()调整池子储备,使超额利息索赔得以执行。这突显了在完整仓位生命周期内验证偿付能力的重要性,而不是将存款估值、利息计算和赎回视为独立操作。 - Moke Token 被选中,因为它展示了不同记账机制中的漏洞如何被组合成一次单一的获利攻击。攻击者操纵现货价格以虚增可领取的
MOKE数量,通过将相同的 LP 代币跨多个地址同步来复制 LP 奖励记录,并通过分红系统将所得代币转换为可提取的BNB。这突显了使用抗操纵价格来源以及保持奖励记账与实际代币所有权同步的重要性。
Web3 最佳安全审计机构
在上线前验证设计、代码和业务逻辑
每周重点:LpdFi 协议
本事件被重点收录,因为同一可操纵的 AMM 状态同时支配了负债的创建与资产的赎回。它说明了为何协议必须在完整仓位生命周期内验证偿付能力,而不是将存款估值、利息累计和赎回视为独立步骤。
2026 年 8 月 3 日,BNB Chain 上的 LpdFi 协议遭到攻击,损失约 $697K,资金从 LPD/USDC PancakeSwap 交易对中被抽干。LpdFi 将仓位的记录价值及其后续利息支付均源自同一个实时 PancakeSwap 交易对,因此操纵该交易对会同时扭曲两者。攻击者以远高于真实价值的估值开仓,等待利息累积,随后调整交易对储备,使超额利息索赔得以支付,几乎抽干了协议持有的全部流动性。
背景
LpdFi 是一个围绕 LPD 代币构建的收益协议。用户通过存入 LPD 来创建仓位。在存款时,协议使用当前 LPD/USDC PancakeSwap 现货价格对存款进行估值,并将结果存储为 uAmount,即订单的美元计价本金。订单通过期次(issue)累积利息,每个期次为一个每日记账周期,协议根据记录的本金对每个订单的总利息设置上限。
当用户领取利息时,协议通过使用 LpdFi 持有的 LP 代币从 LPD/USDC 交易对中移除流动性,将记账利息转换为 USDC。赎回的 USDC 随后在索赔人和手续费地址之间分配。仓位生命周期的两端——存款时的估值和赎回时的支付——因此都读取自同一个实时 PancakeSwap 交易对。
漏洞分析
存在漏洞的合约为 0xce6a...f295e 和 0x3876...273604。
根本原因在于,LpdFi 将实时 LPD/USDC 现货价格和储备作为订单记账与利息赎回的可信来源。这两个值都不安全:两者均源自交易对储备,而拥有足够临时流动性的调用者可以在单笔交易中移动这些储备。
在存款时,buy() 从 token.price() 计算代币数量:

LPD.price() 通过 getReserves() 直接读取 LPD/USDC 储备,因此记录的本金随现货价格变动:

在赎回时,claimInterest() 通过调用 removeLp() 支付累积利息:

removeLp() 根据实时储备 r1(或 r0)计算需要销毁的 LP 代币数量:

由此导致两个不变量被破坏。第一,由于记录的本金源自现货价格,记录的本金可能远大于存款的真实价值,从而提高了利息上限。第二,由于 removeLp() 根据实时储备来确定 LP 销毁量,协议为满足给定 USDC 支付而必须销毁的 LP 代币数量,取决于一个在索赔时并不固定的储备值。
攻击分析
以下分析基于交易 0xbb5b85...41c3588 和 0x70bbe0...b3315d6。
-
步骤 1:在区块
113613923中,攻击者使用闪电贷资金在 LPD/USDC 交易对中进行了一笔大额USDC换LPD的交换。这减少了池子的LPD储备,并提高了LPD.price()返回的现货价格。 -
步骤 2:在价格被虚增期间,攻击者调用
buy()开了一个超额订单。按操纵后的现货价格估值,该存款被记录的美元本金为140,324,732。

-
步骤 3:在下一个区块
113613924中,攻击者跨越了协议的期次边界。尽管只过了一个区块,协议将每次期次变更视为一个每日记账周期,因此虚增本金的一个周期利息变为可领取状态。 -
步骤 4:在领取交易中,攻击者通过
PoolManager借入了730,607.755349USDC,将3,440.992868USDC直接转入 LPD/USDC 交易对,并调用了sync()。在原始储备状态下,虚增的利息将需要比LpdFi持有的更多 LP 代币,因此赎回将会回滚。通过将交易对记录的USDC储备从718,619.888284提高到722,060.881152,攻击者减少了removeLp()需要销毁的 LP 数量,使其落在协议实际 LP 余额范围内。

- 步骤 5:攻击者调用
claimInterest(0)。虚增的本金为一个期次产生了701,623.66USDC的可领取利息。储备操纵后,removeLp()只需销毁1,678,049.359669个 LP 代币,几乎恰好是LpdFi持有的全部 LP 余额。协议销毁了约 97% 的总 LP 供应量,向攻击者转移了693,529.790711USDC,攻击者还清了闪电贷并转出了利润。
结论
本次事件源于将可操纵的 AMM 现货储备作为订单记账和赎回的可信来源。估值和赎回被视为读取同一实时池子的独立操作,因此在操纵价格下记录的本金从未与池子的实际支撑进行核对。
协议不应将实时 AMM 储备作为订单本金或提款记账的可信来源。更安全的设计应通过抗操纵的价格来源对每笔存款进行估值,例如带有时效性和偏差检查的时间加权平均价格,而非现货估值,并在赎回前执行偿付能力检查,确保索赔永远不会销毁超过该仓位实际贡献的支撑资产。
本周更多事件
Moke Token
2026 年 8 月 3 日,BNB Chain 上的 Moke Token 通过现货价格依赖结合重复 LP 记账的方式遭到攻击,损失约 $906K。攻击者操纵现货价格以虚增可领取的 MOKE 数量,将其转入 LP 分红合约,触发分红流程将 MOKE 兑换为 BNB,然后通过重复的 LP 记录收取该 BNB。
背景
Moke Token 是一个围绕用户参与、延迟 MOKE 释放、LP 奖励和推荐激励构建的 BNB Chain 生态系统。用户通过 USDT 和 AC 参与。用户不会立即收到 MOKE,而是每次参与会获得一个由 MokeRelease 管理的未来 MOKE 释放额度,该额度随时间逐步变为可领取状态。
当用户领取时,合约使用已结算的 MOKE/USDT 价格将释放的 USDT 价值转换为 MOKE,然后从储备池向用户转移相应的 MOKE。这些释放的代币默认受到限制,只能转移到授权的处理地址,例如用于添加流动性的合约。持有 LP 代币的用户随后根据其 LP 份额从协议的税收和分红池中获得 BNB 分配。
漏洞分析
存在漏洞的合约为 0x684d...b302a7 和 0x5ae5...eba377。
第一个根本原因是现货价格依赖。getMokeUsdtPrice() 从 WBNB/USDT 和 WBNB/MOKE 交易对推导 MOKE/USDT 价格,没有使用任何抗操纵的价格来源:

第二个根本原因是重复的 LP 记账。_syncUserLP() 通过将 lpToken.balanceOf(user) 读入 userLPRecord[user] 来记录用户的 LP 余额。由于更新是手动触发的,且仅基于当前余额进行键值记录,相同的 LP 代币可以被转移到多个地址并在每个地址上各自同步,从而虚增总记录的 LP 余额及其所获得的分红奖励:

攻击分析
以下分析基于交易 0xc0f1df...e26154 和 0x077604...756a8f。
- 步骤 1:在攻击发生约 10 天前,攻击者通过在
MokeVault中调用participate函数存入USDT来准备释放额度,获得了价值45,000 USDT的MOKE释放额度,该额度以每天 5.5% 的速率解锁。

- 步骤 2:攻击者铸造了
MOKE/WBNBLP 代币,并在MokeLPDividend中调用syncUserLP记录 LP 余额,然后将相同的 LP 代币转移到另一个地址并重复同步,为同一组代币创建了重复的 LP 记录。

- 步骤 3:攻击者使用闪电贷借入大量
BNB,并在WBNB/USDT交易对中将其兑换为USDT,推高了USDT的现货价格。随后攻击者在MokeRelease中更新了MOKE价格,已结算的MOKE价格急剧下跌。

- 步骤 4:在操纵后的
MOKE价格生效的情况下,攻击者在MokeRelease中调用claim,将价值24,766 USDT的额度兑换为MOKE代币,收到的MOKE远超该额度的真实价值。

- 步骤 5:攻击者将释放的
MOKE转入白名单中的MokeLPDividend合约,并调用distributeDividend,将MOKE兑换为BNB。随后攻击者使用记录了重复 LP 余额的地址调用claimDividend收取分配的BNB,共获得1,546 BNB。

结论
Moke Token 结合了两个独立的缺陷:一个可通过闪电贷移动的现货价格,以及将相同 LP 代币重复计数的分红记账机制。两者单独存在时的危害都不如组合在一起时严重。
协议应避免在安全敏感的计算中使用瞬时现货价格,而应使用抗操纵的价格来源。任何基于代币余额的记账都必须与余额变化本身同步更新,以确保相同的代币不会在多个地址中被重复计算。



