Back to Blog

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

Code Auditing
August 12, 2026
9 min read
Key Insights
  • 本报告收录了 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

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

立即免费试用
Sign up for the latest updates
COLDCARD事件:当钱包的"随机"助记词并不随机
Security Insights

COLDCARD事件:当钱包的"随机"助记词并不随机

COLDCARD固件存在静默构建集成漏洞,导致比特币种子生成回退至软件随机数生成器,弱随机性使钱包种子可被离线恢复。由于漏洞存于种子本身,固件更新无法修复;截至2026年8月7日,已核实损失达1,405 BTC(约9100万美元),私下估计高达2,055 BTC。

~$8800万损失:COLDCARD与LULA漏洞利用事件 | BlockSec周报
Security Insights

~$8800万损失:COLDCARD与LULA漏洞利用事件 | BlockSec周报

2026年7月27日至8月2日,两起安全事件共造成约8800万美元损失。COLDCARD硬件钱包固件存在熵值缺陷:构建守卫仅检查RNG配置宏是否存在而非是否启用,导致种子生成回退至确定性软件路径,攻击者借此恢复受影响种子并分批盗取至少1370枚BTC(约8800万美元)。BNB链上LULA代币因业务逻辑漏洞损失约57.8万美元,攻击者触发特权函数`recycle()`,从PancakeSwap V2池提取LULA并重置储备,耗尽流动性。

通讯简报 - 2026年7月
Security Insights

通讯简报 - 2026年7月

2026年7月,三起最大DeFi事件共造成约6790万美元损失,涉及Arbitrum和Solana。AFX Trade因供应链攻击导致验证者签名权被盗,损失约2415万美元;Ostium的OLP金库因预言机基础设施被攻破,攻击者提交恶意价格,损失约2375万美元;BonkDAO攻击者花费440万美元获取足够投票权,通过恶意国库转账提案,损失约2000万美元。三起事件均表明协议安全边界远超智能合约代码本身。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit