По словам основателя биржи Ambient Дуга Колкитта в социальной сети, злоумышленник, похитивший 46 миллионов долларов из KyberSwap, для проведения атаки использовал «сложный и тщательно разработанный эксплойт смарт-контракта».

Колкитт назвал этот эксплойт «глюком с бесконечными деньгами». По его словам, злоумышленник воспользовался уникальной реализацией функции концентрированной ликвидности KyberSwap, чтобы «обмануть» контракт, заставив его поверить в то, что у него больше ликвидности, чем на самом деле.

1/ Закончил предварительное глубокое погружение в эксплойт Kyber и думаю, что теперь я довольно хорошо понимаю, что произошло.

Это, пожалуй, самый сложный и тщательно продуманный эксплойт смарт-контракта, который я когда-либо видел...

– Дуг Колкитт (@0xdoug) 23 ноября 2023 г.

Большинство децентрализованных бирж (DEX) предоставляют функцию «концентрированной ликвидности», которая позволяет поставщикам ликвидности устанавливать минимальную и максимальную цену, по которой они будут предлагать покупать или продавать криптовалюту. По словам Колкитта, эту функцию использовал злоумышленник KyberSwap для вывода средств. Однако этот эксплойт «специфичен для реализации концентрированной ликвидности Kyber и, вероятно, не будет работать на других DEX», — сказал он.

По словам Колкитта, атака KyberSwap состояла из нескольких эксплойтов против отдельных пулов, причем каждая атака практически идентична другой. Чтобы проиллюстрировать, как это работает, Колкитт рассмотрел использование пула ETH/wstETH в Ethereum. Этот пул содержал эфир (ETH) и стейк-эфир в оболочке Lido (wstETH).

Злоумышленник начал с того, что занял 10 000 wstETH (стоимостью 23 миллиона долларов на тот момент) у платформы флэш-кредитов Aave, как показано в данных блокчейна. По словам Колкитта, злоумышленник затем сбросил в пул этих токенов на сумму 6,7 миллиона долларов, в результате чего их цена упала до 0,0000152 ETH за 1 wstETH. В этой ценовой категории не было поставщиков ликвидности, желающих покупать или продавать, поэтому ликвидность должна была быть равна нулю.

Затем злоумышленник внес 3,4 wstETH и предложил купить или продать по ценам от 0,0000146 до 0,0000153, сняв 0,56 wstETH сразу после внесения депозита. Колкитт предположил, что злоумышленник, возможно, забрал 0,56 wstETH, чтобы «обеспечить идеальное совпадение последующих числовых расчетов».

После внесения депозита и вывода средств злоумышленник выполнил второй и третий обмен. Второй своп поднял цену до 0,0157 ETH, что должно было деактивировать ликвидность злоумышленника. Третий своп подтолкнул цену обратно до 0,00001637. Это также вышло за пределы ценового диапазона, установленного собственным порогом ликвидности злоумышленника, поскольку теперь оно было выше их максимальной цены.

Теоретически последние два свопа не должны были привести ни к чему, поскольку злоумышленник покупал и продавал за свою ликвидность, поскольку у каждого другого пользователя была установлена ​​минимальная цена намного ниже этих значений. «В отсутствие численной ошибки кто-то, делающий это, просто торговал бы взад и вперед, используя свою собственную ликвидность», — заявил Колкитт, добавив, — «и все потоки были бы равны нулю (за вычетом комиссий)».

Однако из-за особенности арифметики, используемой для расчета верхней и нижней границы ценовых диапазонов, протокол не смог удалить ликвидность в одном из первых двух свопов, но также добавил ее обратно во время финального свопа. В результате в пуле произошел «двойной учет ликвидности от исходной позиции LP», что позволило злоумышленнику получить 3911 wstETH за минимальное количество ETH. Хотя злоумышленнику пришлось сбросить 1052 wstETH в ходе первого свопа, чтобы осуществить атаку, он все равно позволил ему получить прибыль в размере 2859 wstETH (6,7 миллиона долларов США по сегодняшней цене) после погашения срочного кредита.

Злоумышленник, судя по всему, повторил этот эксплойт против других пулов KyberSwap в нескольких сетях, в результате чего ему сошло с рук в общей сложности 46 миллионов долларов криптовалютной добычи.

По словам Колкитта, KyberSwap содержал отказоустойчивый механизм в функции ComputeSwapStep, который был предназначен для предотвращения возможности использования этого эксплойта. Однако злоумышленнику удалось сохранить числовые значения, использованные при обмене, за пределами диапазона, который мог бы привести к срабатыванию отказоустойчивости, как заявил Колкитт:

«[T] он, `объем охвата`, был верхней границей достижения границы тика и был рассчитан как ... 22080000, тогда как эксплойтер установил количество свопа ... 220799999 [.] Это показывает, насколько тщательно был спроектирован этот эксплойт. . Проверка не удалась на

Колкитт назвал атаку «самым сложным и тщательно спроектированным эксплойтом смарт-контракта, который я когда-либо видел».

Как сообщает Cointelegraph, 22 ноября KyberSwap был использован на сумму 46 миллионов долларов. Команда обнаружила уязвимость 17 апреля, но в этом инциденте никакие средства не были потеряны. Пользовательский интерфейс биржи также был взломан в сентябре прошлого года, хотя в этом инциденте все пользователи получили компенсацию. 22 ноября злоумышленник сообщил команде, что готов вести переговоры о возврате части средств.

Источник