2 января 2021 года (07:25 утра по пекинскому времени) наша система мониторинга ThunderForecast зафиксировала серию подозрительных транзакций в смарт-контракте yCREDIT. Затем мы использовали систему EthScope, разработанную нашей исследовательской группой, чтобы проанализировать эти транзакции и подтвердить, что все они являются вредоносными. В этом блоге мы подробно описываем детали атаки.
Детали
Атака произошла из-за того, что количество выпущенных (minted) токенов не соответствовало запланированному. Таким образом, злоумышленник мог получить гораздо больше токенов yCREDIT по более низкой цене. Затем эти токены можно было продать для получения прибыли.
Уязвимая функция находится в функции _deposit контракта StableYieldCredit.
Ниже мы воспользуемся транзакцией атаки, чтобы проиллюстрировать весь процесс.

Сначала злоумышленник перевел 1e-8 WBTC и 331.335 токенов yCredit в пул пар WBTC-yCREDIT. Затем атакующий внес 0.5 WBTC в контракт StableYieldCredit, чтобы начать атаку.
В частности, _value рассчитывается с использованием amount (0.5) token (0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 — WBTC) на основе провайдера оракула цен ChainLink (строка 480, _value равно 1466786010075). Цель состоит в том, чтобы рассчитать стоимость внесенного WBTC в долларах США. Затем контракт переводит количество токенов yCREDIT (_value - комиссия) тому, кто внес WBTC (злоумышленнику). Это происходит потому, что стоимость yCREDIT равна одному доллару США (как задумано системой). Все было бы в порядке, если бы злоумышленник не терял небольшую сумму комиссии.
Более того, контракт добавляет внесенный WBTC в пул пар WBTC-yCREDIT. Это сделано для того, чтобы внесенный WBTC не терял ликвидность, находясь в контракте. Поэтому сначала была рассчитана стоимость пары токенов (WBTC к yCREDIT), которая будет добавлена в пул. Это значение рассчитывается с помощью функции _addLiquidity. По сути, расчет основан на существующих резервах внутри пула. Поскольку в пуле было только 1e-8 WBTC и 331.335 токенов yCREDIT, рассчитанное значение amountA составило 44 (значение amountB — 1466786010075). Это означает, что злоумышленник потратил всего 44e-8 WBTC (строка 485) и получил 14667.86010075 - комиссия = 14594.52080025 токенов yCREDIT (строка 493). В то же время в пуле осталось небольшое количество WBTC (1e-8 + 44e-8) и токенов yCREDIT (331.335 + 14667.86010075).
Чтобы получить прибыль, атакующий может просто продать полученные 14594.52080025 токенов yCREDIT на биржах. Интересно, что процесс получения прибыли в данной транзакции гораздо сложнее, чем это было необходимо. Мы также наблюдали более хитрую стратегию атаки в других транзакциях.
В атаке участвовала серия транзакций, включая (но не ограничиваясь ими) следующие.
Обновление
03.01.2020: Появился новый смарт-контракт, который исправляет эту уязвимость.
Хронология
- 01.01.2021 23:25 UTC, атаки были зафиксированы нашей системой
- 02.01.2021 16:20 UTC, этот блог опубликован



