Мне стали интересны детали взлома, самую полнуи информацию нашел у PeckShield Inc - компания по обеспечению безопасности блокчейнов.
https://medium.com/@peckshield/bzx-hack-full-disclosure-with-detailed-profit-analysis-e6b1fa9b18fcPeckShield Inc(С)
Смысловой перевод важных моментов.
15 февраля мы представили
обзор взлома bZx, который захватил различные заголовки тем о DeFi. Есть много недоразумений, циркулирующих вокруг природы этого конкретного взлома. Подчеркнем, что это не атака оракула. Это умный арбитраж, в котором использовалась ошибка в реализации смарт-контракта bZx. В этой статье мы хотели бы предоставить подробное описание взлома.
Пять шагов арбитража в bZx HackВиновником является эта
транзакция в 2020–02–15 01:38:57 + UTC на блоке # 9484688. Как показано на рисунке, эту атаку можно разделить на пять отдельных шагов: флеш-кредит(Flashloan), накопление, маржинальный памп, дамп, погашение флеш-кредита. Далее мы рассмотрим каждый конкретный шаг.
1: Флеш-кредит(Flashloan). Этот шаг использует преимущества флеш-кредита dYdX для заимствования 10 000 ETH.
Flash loan: Обычно, чтобы занять деньги в DeFi, нужно взять CDP (обеспеченную долговую позицию), что обычно означает, что для того, чтобы занять BTC на сумму $80, нужно внести что-то вроде $100 долларов в ETH в качестве залога. Если вы не вернете $80 в BTC, которые вы взяли в долг, вы потеряете свой залог. Для сравнения, флеш-кредит относительно новый способ заимствования денег в DeFi, не требует залогов. Смарт контракт flash loan позволяет вам взять без вопросов большую сумму капитала, при условии, что вы вернете заимствованную сумму в течение той же самой сделки (отсюда и название flash loan). Если вы не вернете заимствованную сумму, транзакция просто вернется обратно. С помощью флеш-кредита Джо начал с почти 0 долларов (помимо нескольких долларов комиссии за транзакцию) и сразу же получил доступ к капиталу в 3 миллиона долларов.
После этого шага мы замечаем, что у атакующего есть следующий баланс активов. Пока нет выгоды.
2: Накопление. Получив заемный флэш-кредит, злоумышленник вносит 5500 ETH в Compound в качестве залога, чтобы занять 112 WBTC. Это нормальная операция, и этот накопленный WBTC должен быть сброшен на шаге 4.
После этого шага мы замечаем следующие изменения активов, контролируемых злоумышленником.Пока нет выгоды.
3: Маржинальный памп. После заема 112 WBTC на этом шаге используется функция маржинальной торговли bZx для шорта ETH в пользу WBTC (т. е. SETHwBTCx5). В частности, злоумышленник депонирует 1300 ETH и вызывает функцию BZX margin trading, то есть mintWithEther (которая вызывает marginTradeFromDeposit). Функция маржинальной торговли использует KyberSwap для обмена одолженных 5637.623762 ETH на 51.345576 WBTC. Обратите внимание, что это 5x заем на шорт ETH. Это повышает коэффициент конверсии 1 WBTC до 109,8 WETH, что примерно в три раза превышает нормальный коэффициент конверсии (~ 38,5 WETH / WBTC).
Чтобы завершить эту сделку, bZx направляет ордер в KyberSwap, который затем консультируется со своими резервами и находит лучший курс. Этот шаг существенно повышает цену WBTC в Uniswap в три раза.
Следует отметить, что этот шаг должен быть блокирован встроенной проверкой работоспособности, которая проверяет, что будет с операцией после обмена. Однако эта проверка не сработала, когда произошла атака, и мы рассмотрим детали ниже.
После этого шага мы замечаем следующие изменения активов, контролируемых злоумышленником. Тем не менее, после этого шага нет никакой выгоды.
4: Дамп . С завышенной ценой WBTC в Uniswap, злоумышленник продает заимствованный у Compound 112 WBTC обратно за WETH в Uniswap.
Этот шаг приводит к получению 6871.4127388702245 ETH по курсу 1WBTC = 61.4 WETH. После этого злоумышленник наблюдает значительную прибыль с последующей разбивкой активов.
5: Погашение флеш-кредита. Получив 6871.4127388702245 ETH от проданных 112 WBTC, злоумышленник возвращает флэш-кредит 10000.000000000011ETH обратно в dYdX, завершая операцию.
Мы пересчитаем следующую разбивку активов после этого шага. Оказывается, что атакующий получает 71ETH арбитражную прибыль, плюс две позиции, одна в Compound (+ 5500WETH / -112WBTC) и другая в bZx (-4,337WETH / + 51WBTC). Составная позиция очень прибыльна, в то время как позиция bZx находится в состоянии дефолта. По-видимому, сразу после применения эксплойта злоумышленник выплачивает долг (112BTC), чтобы вернуть залог (5500 WETH). Для дефолтной позиции bZx, атакующий не проявляет дальнейшего интереса.
Учитывая среднюю рыночную цену 1WBTC = 38,5WETH (или 1WETH = 0,025BTC), атакующий может получить 112 WBTC с ~ 4300 ETH. В результате злоумышленник получает 71 WETH + 5500 WETH - 4300 ETH = 1 271 ETH, примерно 355 880 долларов (при условии, что цена ETH = 280 долларов).