Логическая ошибка стоила  Dream Health Chain $72 тыс
09.09.2026 CoinKyt Company
3 мин
share button
5 сентября 2026 года злоумышленник воспользовался логической ошибкой в контракте наград проекта Dream Health Chain (DHC) и похитил около 71,8 тыс. долларов. Он многократно получал одну и ту же награду из общего резерва, потому что система не ставила отметку «уже выплачено». Расследование КоинКит анализирует, как работала атака и куда ушли средства.

 


Введение


Стейкинг-пул
— это место, где пользователи блокируют свои токены в протоколе, чтобы получать за это награды. Проект кладёт в общий резерв определённое количество токенов, которые распределяются между участниками по правилам.

State machine
(машина состояний) — это система, которая отслеживает, в каком состоянии находится объект. Например, награда может быть «доступна», «уже получена» или «недоступна». Если система не меняет состояние после выплаты — награду можно получить снова и снова.

 


Ход инцидента


1. Злоумышленник создал позицию в стейкинг-пуле Dream Health Chain. Для этого он внёс минимальную сумму — сделал pledge (залог/блокировку).

2. Он получил право на награду и начал многократно вызывать функцию claimAward — это команда «получить награду». Каждый раз система выдавала ему фиксированную сумму около 48,17 токенов DHC из общего резерва пула.

3. Проблема в том, что после выплаты контракт не ставил отметку «уже выплачено». Награда оставалась в состоянии «доступна», и её можно было запросить снова.

4. Более того, злоумышленник нашёл способ сбросить статус награды обратно на «доступно» практически бесплатно — переводом 0–1 wei (это минимальная доля токена, меньше копейки).

5. Он повторял этот цикл многократно, выпуская из резерва около 568 370 токенов DHC «из воздуха».

6. Все похищенные токены были сразу проданы на децентрализованной бирже PancakeSwap в паре DHC/USDT.

7. Атака использовала flash-loan — мгновенный кредит из другого протокола, который берётся и возвращается в рамках одной транзакции. Это позволило злоумышленнику провести всю операцию, имея почти нулевой собственный капитал.

В результате ущерб составил около 71 851 USDT (~71,8 тыс. долларов).

 


Почему это стало возможным


В контракте наград отсутствовали базовые защиты состояния. Функция claimAward() работала как касса, которая выдаёт деньги всем подряд, не проверяя, получал ли адрес их раньше.
Не было:

  • флага «уже заклеймлено» (получено);
  • уменьшения доступного баланса наград;
  • проверки времени между выплатами;
  • защиты от сброса статуса через дешёвый перевод.

Это позволило одному адресу опустошить общий резерв пула, повторяя одно и то же действие в цикле.

 


Детали расследования: движение средств


Похищенные токены DHC собирались на контракте злоумышленника:
0x226923D34A10f3D54B57b9F4b685E82c6Cba968A

После обмена через PancakeSwap средства были переведены на адрес:
0xD3A8D0A9F55cf679fff6F277E49AfC95B49D2B07
в размере около 71 тыс. долларов. На момент расследования средства остаются на этом адресе без движения.

 


Заключение


Инцидент в Dream Health Chain показал, что отсутствие базовых проверок состояния в контракте наград может привести к полному опустошению резерва. Функция выдачи наград не запоминала, кому уже заплатила, и позволяла сбрасывать статус за меньше чем копейку.