Логическая ошибка стоила Dream Health Chain $72 тыс

Введение
Стейкинг-пул — это место, где пользователи блокируют свои токены в протоколе, чтобы получать за это награды. Проект кладёт в общий резерв определённое количество токенов, которые распределяются между участниками по правилам.
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 собирались на контракте злоумышленника:
После обмена через PancakeSwap средства были переведены на адрес:
Заключение
Инцидент в Dream Health Chain показал, что отсутствие базовых проверок состояния в контракте наград может привести к полному опустошению резерва. Функция выдачи наград не запоминала, кому уже заплатила, и позволяла сбрасывать статус за меньше чем копейку.


