Малоликвидный пул и не обновлённые резервы: как похитили 74 BNB из Likwid Finance

Введение
Likwid Finance — это протокол кредитования в сети BNB Smart Chain. Пользователи вносят криптовалюту как обеспечение и получают займы в других токенах.
Пул ликвидности — это хранилище, в котором два токена торгуются автоматически по формуле. Цена меняется в зависимости от соотношения активов в пуле: чем меньше токена осталось, тем выше его цена при покупке.
Мем-токен — это криптовалюта, созданная на волне хайпа, обычно с низкой ликвидностью и нестабильной ценой.
Ход инцидента
-
Злоумышленник выбрал пул с парой BNB и мем-токеном. Этот пул был крайне малоликвидным: более 80% всех мем-токенов находилось именно в нём, а реальной ликвидности для обмена было всего около 18 BNB.
-
Он начал покупать мем-токен небольшими сделками. Всего потратил около 55 BNB. Из-за того, что в пуле было мало токенов, каждая покупка сильно двигала цену. Цена мем-токена выросла почти в 5 раз.
-
Затем он использовал функцию Likwid, которая позволяет внести один токен пары как обеспечение и занять второй. Он внёс купленные мем-токены как залог и начал получать BNB.
-
Чтобы получить больше средств, он разбил купленные токены на множество отдельных позиций и брал займ под каждую.
-
Проблема в том, что контракт неправильно рассчитывал каждую новую позицию. После первого займа внутренние резервы пула, которые используются для расчёта цены, фактически не обновлялись. Контракт продолжал считать, что в пуле всё ещё лежат прежние суммы, и выдавал следующий займ по той же выгодной цене.
-
В результате несколько отдельных позиций получали практически одинаковую оценку залога, как будто предыдущих займов не было. Из пула LikwidVault было похищено 74,31 BNB.
Почему это стало возможным
Основная ошибка была в функции, которая обрабатывает залог и займ. При выдаче займа контракт не записывал изменение внутренних резервов пула. Поэтому расчётные резервы оставались прежними, и каждый следующий заём рассчитывался исходя из старой картины, а не из реального состояния пула.
Кроме того, стоимость залога определялась только по цене внутри этого же малоликвидного пула, без внешнего ориентира. Это позволило злоумышленнику сначала искусственно поднять цену своими покупками, а затем использовать эту завышенную цену для получения займов.
Детали расследования: движение средств
Похищенные ~74,3 BNB поступили на контракт злоумышленника:
Затем они были отправлены на адрес:
Далее около 4,41 BNB десятью равными транзакциями ушли на адрес:
Основная часть — 70 BNB — была направлена в миксер Tornado Cash — сервис, который скрывает источник и путь криптовалюты. Оставшиеся ~4,96 BNB были смешаны с другими средствами и также отправлены в Tornado Cash.
Заключение
Инцидент в Likwid Finance показал, что использование малоликвидного пула как единственного источника цены и отсутствие обновления резервов при выдаче займов создаёт уязвимость. Злоумышленник искусственно разогнал цену мем-токена и воспользовался ошибкой в расчёте, чтобы многократно получить займ по одной и той же завышенной оценке.


