Back to Blog

~$1.6M потеряно: эксплойты токена Moke и LpdFi | BlockSec Weekly

Code Auditing
August 12, 2026
9 min read
Key Insights
  • В данном отчёте рассматриваются 2 заметных инцидента безопасности — оба представляют собой эксплойты манипуляции ценой в сети BNB Chain, совокупные потери составили около $1,6 млн.

  • LpdFi (~ $697K) повторно использовал одни и те же уязвимые к манипуляциям резервы пары PancakeSwap как для оценки ордеров, так и для погашения процентов, что позволило злоумышленнику раздуть основную сумму позиции, а затем изменить состояние пула таким образом, чтобы завышенная выплата стала возможной. Moke Token (~ $906K) объединял спотовый ценовой оракул с дублированным учётом дивидендов LP.

  • Оба инцидента объединяет одна общая причина: чувствительный к безопасности учёт, основанный на актуальном спотовом состоянии AMM, которое злоумышленник с достаточным объёмом временной ликвидности может изменить в рамках одной транзакции.

За прошедшую неделю (2026/08/03 - 2026/08/09) представлены следующие 2 notable инцидента безопасности с общими потерями приблизительно $1,6 млн.

Дата Инцидент Тип Оценочные потери
2026/08/03 LpdFi Манипуляция ценой ~$697K
2026/08/03 Moke Token Манипуляция ценой и ошибка в учёте ~$906K
  • LpdFi был выбран потому, что демонстрирует системный риск использования манипулируемых резервов AMM как для оценки позиций, так и для погашения процентов. Злоумышленник сначала завысил зафиксированный основной долг с помощью манипуляции спотовой ценой, затем изменил резервы пула через прямое пожертвование и вызов sync(), сделав исполнимым завышенное требование по процентам. Это подчёркивает важность проверки платёжеспособности на протяжении всего жизненного цикла позиции, а не обращения с оценкой депозита, расчётом процентов и погашением как с независимыми операциями.
  • Moke Token был выбран потому, что демонстрирует, как уязвимости в отдельных механизмах учёта могут быть объединены в одну прибыльную атаку. Злоумышленник манипулировал спотовой ценой для увеличения количества доступного для получения MOKE, дублировал записи о вознаграждениях LP путём синхронизации одних и тех же LP-токенов на нескольких адресах, а затем конвертировал полученные токены в извлекаемый BNB через систему дивидендов. Это подчёркивает важность использования устойчивых к манипуляциям источников цен и синхронизации учёта вознаграждений с фактическим владением токенами.

Лучший аудитор безопасности для Web3

Проверяйте дизайн, код и бизнес-логику до запуска

Главное событие недели: протокол LpdFi

Этот инцидент выделен потому, что одно и то же манипулируемое состояние AMM управляло как созданием обязательств, так и погашением активов. Он показывает, почему протокол должен проверять платёжеспособность на протяжении всего жизненного цикла позиции, а не рассматривать оценку депозита, начисление процентов и погашение как независимые шаги.

3 августа 2026 года протокол LpdFi в сети BNB Chain был атакован приблизительно на $697K; средства были выведены из пары LPD/USDC на PancakeSwap. LpdFi извлекал как зафиксированную стоимость позиции, так и последующую выплату процентов из одной и той же активной пары PancakeSwap, поэтому манипуляция этой парой искажала оба показателя. Злоумышленник открыл позицию, оценённую значительно выше реальной стоимости, дождался начисления процентов, затем изменил резервы пары так, чтобы завышенное требование по процентам могло быть исполнено, опустошив почти всю ликвидность, которой располагал протокол.

Предпосылки

LpdFi — это доходный протокол, построенный вокруг токена LPD. Пользователь создаёт позицию, внося LPD. В момент депозита протокол оценивает вклад по текущей спотовой цене LPD/USDC на PancakeSwap и сохраняет результат как uAmount — номинированный в USD основной долг по ордеру. По ордеру начисляются проценты по выпускам, где каждый выпуск представляет собой один ежедневный учётный период, а протокол ограничивает общую сумму процентов по каждому ордеру зафиксированным основным долгом.

Когда пользователь получает проценты, протокол конвертирует учётные проценты в USDC, изымая ликвидность из пары LPD/USDC с помощью LP-токенов, хранящихся у LpdFi. Выкупленный USDC затем делится между получателем и адресом комиссии. Таким образом, оба конца жизненного цикла позиции — оценка при депозите и выплата при погашении — считывают данные из одной и той же активной пары PancakeSwap.

Анализ уязвимости

Уязвимые контракты: 0xce6a...f295e и 0x3876...273604.

Коренная причина заключается в том, что LpdFi использовал живую спотовую цену и резервы LPD/USDC как источник истины как для учёта ордеров, так и для погашения процентов. Ни одному из этих значений нельзя доверять: оба получаются из резервов пары, которые вызывающий с достаточной временной ликвидностью может изменить в рамках одной транзакции.

При депозите buy() вычисляет количество токенов из token.price():

LPD.price() читает резервы LPD/USDC напрямую через getReserves(), поэтому зафиксированный основной долг изменяется вместе со спотовой ценой:

При погашении claimInterest() выплачивает начисленные проценты, вызывая removeLp():

removeLp() вычисляет количество LP-токенов для сжигания на основе живого резерва r1 (или r0):

В результате нарушаются два инварианта. Во-первых, поскольку зафиксированный основной долг получается из спотовой цены, может быть зафиксирован основной долг, значительно превышающий реальную стоимость депозита, что повышает предел процентов. Во-вторых, поскольку removeLp() определяет объём сжигания LP-токенов по живому резерву, количество LP-токенов, которые протокол должен сжечь для удовлетворения заданной выплаты в USDC, зависит от значения резерва, которое не фиксируется в момент подачи заявки.

Анализ атаки

Следующий анализ основан на транзакциях 0xbb5b85...41c3588 и 0x70bbe0...b3315d6.

  • Шаг 1: В блоке 113613923 злоумышленник использовал флэш-кредитные средства для проведения крупного свопа USDCLPD в паре LPD/USDC. Это уменьшило резерв LPD пула и повысило спотовую цену, возвращаемую LPD.price().

  • Шаг 2: Пока цена была завышена, злоумышленник вызвал buy() для открытия завышенного ордера. Оценённый по манипулированной спотовой цене, депозит был зафиксирован с USD-основным долгом 140 324 732.

  • Шаг 3: В следующем блоке, 113613924, злоумышленник пересёк границу выпуска протокола. Хотя прошёл только один блок, протокол рассматривает каждое изменение выпуска как ежедневный учётный период, поэтому один период процентов на завышенный основной долг стал доступен для получения.

  • Шаг 4: В транзакции получения злоумышленник занял 730 607,755349 USDC через PoolManager, перевёл 3 440,992868 USDC напрямую в пару LPD/USDC и вызвал sync(). При исходном состоянии резервов завышенные проценты потребовали бы больше LP-токенов, чем имелось у LpdFi, что привело бы к откату погашения. Подняв зафиксированный резерв USDC пары с 718 619,888284 до 722 060,881152, злоумышленник уменьшил количество LP-токенов, которые removeLp() должен был сжечь, доведя его до фактического баланса LP протокола.

  • Шаг 5: Злоумышленник вызвал claimInterest(0). Завышенный основной долг произвёл 701 623,66 USDC доступных к получению процентов за один выпуск. После манипуляции резервами removeLp() потребовалось сжечь лишь 1 678 049,359669 LP-токенов — почти точно полный баланс LP, находившийся у LpdFi. Протокол сжёг около 97% всего предложения LP, перевёл 693 529,790711 USDC злоумышленнику, после чего злоумышленник погасил флэш-кредит и вывел прибыль.

Заключение

Этот инцидент возник из-за использования манипулируемых спотовых резервов AMM в качестве источника истины как для учёта ордеров, так и для погашения. Оценка и погашение рассматривались как независимые операции, считывающие данные из одного и того же активного пула, поэтому основной долг, зафиксированный по манипулированной цене, так и не был сверен с реальным обеспечением пула.

Протоколу не следует использовать живые резервы AMM в качестве источника истины для основного долга по ордеру или учёта выводов средств. Более безопасные конструкции оценивают каждый депозит через устойчивый к манипуляциям источник цен, например средневзвешенную по времени цену с проверками актуальности и отклонения, а не спотовую оценку, и применяют проверку платёжеспособности перед погашением, чтобы заявка никогда не могла сжечь больше обеспечения, чем реально внесла позиция.

Начните работу с Phalcon Explorer

Изучайте транзакции для принятия взвешенных решений

Попробуйте бесплатно

Другие инциденты этой недели

Moke Token

3 августа 2026 года Moke Token в сети BNB Chain был атакован приблизительно на $906K посредством манипуляции спотовой ценой в сочетании с дублированием LP-учёта. Злоумышленник манипулировал спотовой ценой для увеличения количества доступного для получения MOKE, перевёл его в контракт LP-дивидендов, инициировал процесс дивидендов для продажи MOKE за BNB, а затем собрал этот BNB через дублированные записи LP.

Предпосылки

Moke Token — это экосистема BNB Chain, построенная на пользовательском участии, отложенном выпуске MOKE, вознаграждениях LP и реферальных стимулах. Пользователи участвуют с USDT и AC. Вместо немедленного получения MOKE каждое участие предоставляет будущий выпуск MOKE, управляемый MokeRelease, который становится доступным со временем.

Когда пользователь получает средства, контракт конвертирует выпущенную стоимость в USDT по зафиксированной цене MOKE/USDT в MOKE, затем переводит соответствующий MOKE из резервного пула пользователю. Эти выпущенные токены по умолчанию ограничены и могут быть переведены только на авторизованные адреса обработчиков, например контракты, используемые для добавления ликвидности. Пользователи, владеющие LP-токенами, затем получают распределения BNB из налоговых и дивидендных пулов протокола в соответствии с их долей LP.

Анализ уязвимости

Уязвимые контракты: 0x684d...b302a7 и 0x5ae5...eba377.

Первая коренная причина — зависимость от спотовой цены. getMokeUsdtPrice() получает цену MOKE/USDT из пар WBNB/USDT и WBNB/MOKE без использования устойчивого к манипуляциям источника цен:

Вторая коренная причина — дублирование LP-учёта. _syncUserLP() фиксирует баланс LP пользователя, считывая lpToken.balanceOf(user) в userLPRecord[user]. Поскольку обновление инициируется вручную и привязано только к текущему балансу, одни и те же LP-токены могут быть перемещены на несколько адресов и синхронизированы на каждом из них, завышая общий зафиксированный баланс LP и получаемые дивидендные вознаграждения:

Анализ атаки

Следующий анализ основан на транзакциях 0xc0f1df...e26154 и 0x077604...756a8f.

  • Шаг 1: Примерно за 10 дней до эксплойта злоумышленник подготовил квоту выпуска, внеся USDT через функцию participate в MokeVault, получив квоту на выпуск MOKE стоимостью 45 000 USDT, разблокируемую со скоростью 5,5% в день.
  • Шаг 2: Злоумышленник выпустил LP-токены MOKE/WBNB и вызвал syncUserLP в MokeLPDividend для фиксации баланса LP, затем перевёл те же LP-токены на другой адрес и повторил синхронизацию, создав дублированные записи LP для одного набора токенов.
  • Шаг 3: Злоумышленник использовал флэш-кредиты для займа большого количества BNB и обменял их на USDT в паре WBNB/USDT, повысив спотовую цену USDT. Затем злоумышленник обновил цену MOKE в MokeRelease, и зафиксированная цена MOKE резко упала.
  • Шаг 4: При установленной манипулированной цене MOKE злоумышленник вызвал claim в MokeRelease и обменял квоту стоимостью 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 направляла генерацию seed на слабый программный ГСЧ, делая кошельки восстановимыми офлайн. Обновление не устраняет проблему. К 7 августа 2026 г. подтверждённые потери — 1 405 BTC (~$91 млн), оценки до 2 055 BTC.

~$88M Потеряно: Эксплойты COLDCARD и LULA | Еженедельник BlockSec
Security Insights

~$88M Потеряно: Эксплойты COLDCARD и LULA | Еженедельник BlockSec

За неделю 27 июля–2 августа 2026 года два инцидента привели к потерям ~$88M. COLDCARD: ошибка энтропии прошивки аппаратного кошелька — неверная проверка макроса RNG направляла генерацию сида на детерминированный фолбэк, позволив украсть 1370 BTC (~$88M). LULA (BNB Chain): логическая уязвимость позволила вызвать `recycle()`, слив ~$578K из пула PancakeSwap V2.

Информационный бюллетень — июль 2026
Security Insights

Информационный бюллетень — июль 2026

Три крупнейших инцидента DeFi в июле 2026 года: потери ~$67,9M в сетях Arbitrum и Solana. AFX Trade: ~$24,15M из-за атаки на цепочку поставок. Ostium: ~$23,75M через скомпрометированный оракул. BonkDAO: ~$20M через захват голосования за $4,4M.

Best Security Auditor for Web3

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

BlockSec Audit