За прошедшую неделю (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злоумышленник использовал флэш-кредитные средства для проведения крупного свопаUSDC→LPDв паре LPD/USDC. Это уменьшило резервLPDпула и повысило спотовую цену, возвращаемуюLPD.price(). -
Шаг 2: Пока цена была завышена, злоумышленник вызвал
buy()для открытия завышенного ордера. Оценённый по манипулированной спотовой цене, депозит был зафиксирован с USD-основным долгом140 324 732.

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

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



