返回博客

~$160万损失:Moke代币与LpdFi遭黑客攻击 | BlockSec周报

Code Auditing
2026年8月12日
阅读约 9 分钟
核心要点
  • 本报告收录了 2 起值得关注的安全事件,均为 BNB Chain 上的价格操纵漏洞利用,合计损失约 $1.6M。

  • LpdFi(约 $697K)在订单估值与利息赎回两处重复使用了同一个可被操纵的 PancakeSwap 交易对储备量,使攻击者得以虚增仓位本金,再通过重塑流动性池使超额索赔得以兑付。Moke Token(约 $906K)则将现货价格预言机与重复计算的 LP 分红账目相结合。

  • 两起事件共享同一根本模式:对安全敏感的账务逻辑直接衍生自 AMM 的实时现货状态,而拥有足够临时流动性的攻击者可在单笔交易内对其进行操控。

在过去一周(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...f295e0x3876...273604

根本原因在于,LpdFi 将实时 LPD/USDC 现货价格和储备作为订单记账与利息赎回的可信来源。这两个值都不安全:两者均源自交易对储备,而拥有足够临时流动性的调用者可以在单笔交易中移动这些储备。

在存款时,buy()token.price() 计算代币数量:

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

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

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

由此导致两个不变量被破坏。第一,由于记录的本金源自现货价格,记录的本金可能远大于存款的真实价值,从而提高了利息上限。第二,由于 removeLp() 根据实时储备来确定 LP 销毁量,协议为满足给定 USDC 支付而必须销毁的 LP 代币数量,取决于一个在索赔时并不固定的储备值。

攻击分析

以下分析基于交易 0xbb5b85...41c35880x70bbe0...b3315d6

  • 步骤 1:在区块 113613923 中,攻击者使用闪电贷资金在 LPD/USDC 交易对中进行了一笔大额 USDCLPD 的交换。这减少了池子的 LPD 储备,并提高了 LPD.price() 返回的现货价格。

  • 步骤 2:在价格被虚增期间,攻击者调用 buy() 开了一个超额订单。按操纵后的现货价格估值,该存款被记录的美元本金为 140,324,732

  • 步骤 3:在下一个区块 113613924 中,攻击者跨越了协议的期次边界。尽管只过了一个区块,协议将每次期次变更视为一个每日记账周期,因此虚增本金的一个周期利息变为可领取状态。

  • 步骤 4:在领取交易中,攻击者通过 PoolManager 借入了 730,607.755349 USDC,将 3,440.992868 USDC 直接转入 LPD/USDC 交易对,并调用了 sync()。在原始储备状态下,虚增的利息将需要比 LpdFi 持有的更多 LP 代币,因此赎回将会回滚。通过将交易对记录的 USDC 储备从 718,619.888284 提高到 722,060.881152,攻击者减少了 removeLp() 需要销毁的 LP 数量,使其落在协议实际 LP 余额范围内。

  • 步骤 5:攻击者调用 claimInterest(0)。虚增的本金为一个期次产生了 701,623.66 USDC 的可领取利息。储备操纵后,removeLp() 只需销毁 1,678,049.359669 个 LP 代币,几乎恰好是 LpdFi 持有的全部 LP 余额。协议销毁了约 97% 的总 LP 供应量,向攻击者转移了 693,529.790711 USDC,攻击者还清了闪电贷并转出了利润。

结论

本次事件源于将可操纵的 AMM 现货储备作为订单记账和赎回的可信来源。估值和赎回被视为读取同一实时池子的独立操作,因此在操纵价格下记录的本金从未与池子的实际支撑进行核对。

协议不应将实时 AMM 储备作为订单本金或提款记账的可信来源。更安全的设计应通过抗操纵的价格来源对每笔存款进行估值,例如带有时效性和偏差检查的时间加权平均价格,而非现货估值,并在赎回前执行偿付能力检查,确保索赔永远不会销毁超过该仓位实际贡献的支撑资产。

开始使用 Phalcon Explorer

深入分析交易,做出明智决策

立即免费试用

本周更多事件

Moke Token

2026 年 8 月 3 日,BNB Chain 上的 Moke Token 通过现货价格依赖结合重复 LP 记账的方式遭到攻击,损失约 $906K。攻击者操纵现货价格以虚增可领取的 MOKE 数量,将其转入 LP 分红合约,触发分红流程将 MOKE 兑换为 BNB,然后通过重复的 LP 记录收取该 BNB

背景

Moke Token 是一个围绕用户参与、延迟 MOKE 释放、LP 奖励和推荐激励构建的 BNB Chain 生态系统。用户通过 USDTAC 参与。用户不会立即收到 MOKE,而是每次参与会获得一个由 MokeRelease 管理的未来 MOKE 释放额度,该额度随时间逐步变为可领取状态。

当用户领取时,合约使用已结算的 MOKE/USDT 价格将释放的 USDT 价值转换为 MOKE,然后从储备池向用户转移相应的 MOKE。这些释放的代币默认受到限制,只能转移到授权的处理地址,例如用于添加流动性的合约。持有 LP 代币的用户随后根据其 LP 份额从协议的税收和分红池中获得 BNB 分配。

漏洞分析

存在漏洞的合约为 0x684d...b302a70x5ae5...eba377

第一个根本原因是现货价格依赖。getMokeUsdtPrice()WBNB/USDTWBNB/MOKE 交易对推导 MOKE/USDT 价格,没有使用任何抗操纵的价格来源:

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

攻击分析

以下分析基于交易 0xc0f1df...e261540x077604...756a8f

  • 步骤 1:在攻击发生约 10 天前,攻击者通过在 MokeVault 中调用 participate 函数存入 USDT 来准备释放额度,获得了价值 45,000 USDTMOKE 释放额度,该额度以每天 5.5% 的速率解锁。
  • 步骤 2:攻击者铸造了 MOKE/WBNB LP 代币,并在 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 代币重复计数的分红记账机制。两者单独存在时的危害都不如组合在一起时严重。

协议应避免在安全敏感的计算中使用瞬时现货价格,而应使用抗操纵的价格来源。任何基于代币余额的记账都必须与余额变化本身同步更新,以确保相同的代币不会在多个地址中被重复计算。

开始使用 Phalcon Security

检测每一个威胁,精准告警,拦截攻击。

立即免费试用
订阅最新动态
约940万美元损失:Injective、Aquifer遭利用攻击 | BlockSec Weekly
Security Insights

约940万美元损失:Injective、Aquifer遭利用攻击 | BlockSec Weekly

过去一周(2026/08/31-2026/09/06),Injective、Solana、Ethereum和Flow EVM上发生四起安全事件,损失约940万美元。最大的是Injective漏洞,保险基金标识符与二元期权市场标识符冲突,结算路径未比较其面额,损失约480万美元;Solana上的Aquifer因交换路径调用未验证的调用者提供的Token Program,损失约247万美元;Ethereum上的Notional Finance V1因未检查的uint128转换将债务估值为零,损失约173万美元。Flow EVM上的Ankr FLOW因质押入口跳过暂停保护并按过时比率铸币,损失约41万美元。

超越智能合约:Web3中的域名与DNS运营安全
Security Insights

超越智能合约:Web3中的域名与DNS运营安全

合约审计只审合约本身。我们对DefiLlama TVL前100协议背后的100个域名进行了8项基于SEAL的DNS和注册商检查,共800项检查,只有一个域名全部通过。以下是大多数项目缺失的四项关键控制措施,以及它们在用户入口处为何至关重要。

Web3攻击面:渗透测试概览

Web3攻击面:渗透测试概览

加密机构承载所有传统攻击面,并叠加资金处理链。本文提供系统的实用抽象:应用、授权与签名、区块链交互、基础设施四组件模型,说明各自职责、代表实现及继承的攻击面,并将web3特有覆盖细分为五大攻击面:生产与自动化运维、签名意图、审批与提现链、资金逻辑及链上交易与已部署合约。

Web3 最佳安全审计方

在上线之前验证设计、代码与业务逻辑,对标业内最高安全标准。

BlockSec 审计